http://wiki.fhem.de/w/api.php?action=feedcontributions&user=Otto123&feedformat=atomFHEMWiki - Benutzerbeiträge [de]2024-03-29T12:53:33ZBenutzerbeiträgeMediaWiki 1.39.3http://wiki.fhem.de/w/index.php?title=Raspberry_Pi&diff=39193Raspberry Pi2024-03-19T21:44:40Z<p>Otto123: /* Verwendung UART für Zusatzmodule */ link für debian Image eingebaut</p>
<hr />
<div>Beim [[Raspberry Pi]] handelt es sich um einen postkartengroßen Einplatinen-Computer, der von der Raspberry Pi Foundation entwickelt wird. Die Hardware basiert auf dem BCM 283x SoC (System-on-Chip) von Broadcom, einem ARM-Prozessor. Zu Hardwaredetails und den verschiedenen Modellen sowie Produktentwicklungen siehe [http://de.wikipedia.org/wiki/Raspberry_Pi#Hardware Wikipedia].<br />
Dank der kleinen Abmessungen, dem recht geringen Energieverbrauch (bis ca. 4 Watt) sowie der günstigen Anschaffungskosten (ca. 30€) ist der Raspberry Pi eine attraktive Hardware für die Heimautomatisierung mit FHEM. Er ist dank dem Linux-Betriebssystem vollständig kompatibel zur aktuell vorhandenen und von FHEM unterstützen Hardware. Das derzeit empfohlene Standard-Image zum Betrieb des Raspberry Pi ist die auf Debian basierende Raspberry Pi OS Distribution (ab Mitte 2019 ''Buster'').<br />
<br />
== Installation / Setup ==<br />
=== Betriebssystem ===<br />
====Vorbemerkung====<br />
Raspberry Pi OS ist direkt bei raspberrybi.org unter https://www.raspberrypi.org/downloads/raspberry-pi-os/ herunterladbar. Die folgende Anleitung gilt für die lite-Version ohne grafischen Desktop und für die Modelle für B, B+, B2, B3, B3+, Zero W. (Stand Juni 2018)<br />
<br />
Alle in diesem Abschnitt verwendeten Code Blöcke benötigen root Rechte. Deshalb bitte immer am Besten im Kontext <code>sudo su</code> ausführen. Man kann auch einzelne Befehle mit sudo davor ausführen, allerdings wird die Berechtigung bei Pipe Befehlen nicht durchgereicht. Einige dieser Kommandos funktionieren in der angegebenen Form nicht unter der Wheezy-Version [https://en.wikipedia.org/wiki/Raspberry_Pi_OS#Release_history] des RPi OS. Läuft der betreffende RPi noch unter Wheezy, ist ein Upgrade des RPi OS empfehlenswert.<br />
<br />
Alle Dateien müssen im Linux-Format (nur LF als Zeilenende) erzeugt/editiert werden! Unbedingt einen geeigneten Editor verwenden und auf das Format beim Speichern achten!<br />
<br />
====SD-Karte vorbereiten====<br />
Die heruntergeladene Datei muss entpackt und auf die Speicherkarte geschrieben werden. Es gibt dazu verschiedene Tools je nach Betriebssystem. Für Windows ist windisk32imager zu empfehlen, Projektseite [https://sourceforge.net/projects/win32diskimager/]. Für Mac OS gibt es den Pi Filler.<br />
<br />
Detaillierte Anleitungen zur Vorgehensweise finden sich für die Betriebssysteme Linux, Mac OS und Windows unter [https://www.raspberrypi.org/documentation/installation/installing-images/README.md Writing an image to the SD card]<br />
<br />
Die SD Card enthält nun zwei Partitionen/Laufwerke, wobei das erste Laufwerk unter alle Betriebssystemen lesbar ist. In diesem Laufwerk (/boot) müssen jetzt noch zwei Dateien erzeugt werden:<br />
* eine leere Datei mit dem Namen ssh, um den (headless) Zugriff per ssh zu ermöglichen (Pi Filler macht dies automatisch). Hinweis: Eine spätere Aktivierung von SSH ist mit <code>sudo raspi-config</code> (Punkt 5 "Interfacing Options", dann Punkt 2 SSH) möglich, erfordert dann aber Tastatur und Monitor am RPi.<br />
* eine Textdatei im Linux Format mit Namen wpa_supplicant.conf und folgendem Inhalt, wenn der Pi sofort mit WLAN starten soll.<br />
<br />
<pre>country=DE<br />
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev<br />
update_config=1<br />
network={<br />
ssid="FRITZ!Box 7490"<br />
psk="12345678901234567890" <br />
}<br />
</pre><br />
* SD Karte auswerfen.<br />
* SD Karte in Raspberry Pi stecken und booten.<br />
<br />
Alternativ kann auch Monitor und Tastatur verwendet werden.<br />
<br />
====Anmeldung und Grundkonfiguration====<br />
Default raspberrypi-os: Host raspberrypi, User pi, Passwort raspberry <br />
<br />
Default ubuntu: Host ubuntu, User ubuntu, Passwort ubuntu<br />
<br />
Anmeldung entweder lokal oder mit dem Befehl: ssh <user>@<hostname><br />
<br />
Das Passwort sollte geändert werden, dazu dem Sicherheitshinweis folgen und <code>passwd</code> eingeben.<br />
<br />
Alle unten genannten Befehle müssen mit erhöhten Rechten ausgeführt werden (z. B. sudo)!<br />
<br />
Als Erstes sollte: Zeitzone, Sprache und Hostname angepasst werden. <br />
Entweder Menügeführt mit <code>sudo raspi-config</code> <br />
oder per Script / Shell Befehle:<br />
<br />
<syntaxhighlight lang="bash"># Zeitzone einstellen & Zeitsynchronisierung über das Internet aktivieren<br />
timedatectl set-timezone Europe/Berlin<br />
timedatectl set-ntp true<br />
<br />
# Konfigurieren lokale Sprache deutsch<br />
sed -i -e 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/' /etc/locale.gen<br />
locale-gen<br />
localectl set-locale LANG=de_DE.UTF-8 LANGUAGE=de_DE<br />
<br />
# Hostname <br />
hostnamectl set-hostname mymachine<br />
<br />
# System aktualisieren <br />
apt-get update<br />
apt-get upgrade<br />
<br />
#Neustart<br />
reboot</syntaxhighlight><br />
<br />
Am Anfang sollte man Befehle nicht verketten, sondern immer auf die Ausgabe warten (es sei denn, man hat Erfahrung): also kein <code>apt-get update && apt-get upgrade </code>. Ebenso sollte man nicht mit automatischen Bestätigungen arbeiten, also kein upgrade mit "-y". Nach einer Installation ist ein aufräumen immer gut, also:<br />
<syntaxhighlight lang="bash"><br />
apt-get autoremove<br />
apt-get clean<br />
apt-get purge $(dpkg --get-selections | grep deinstall | cut -f1 | xargs)<br />
</syntaxhighlight><br />
<br />
====Verwendung UART für Zusatzmodule====<br />
Einige Aufsteckmodule (z.B. HM-MOD-RPI-PCB) für den GPIO Port verwenden die serielle Schnittstelle UART. Der Zugriff auf diese serielle Schnittstelle erfordert eine modellabhängige Konfiguration. Siehe auch [https://www.raspberrypi.com/documentation/computers/configuration.html Raspberry Pi Dokumentation]<br />
<br />
Bei allen Modellen muss die Verwendung der seriellen Linux console an ttyAMA0 deaktiviert werden:<br />
<syntaxhighlight lang="bash"># seriell-getty Dienst für ttyAMA0 dauerhaft deaktivieren<br />
systemctl stop serial-getty@ttyAMA0.service<br />
systemctl disable serial-getty@ttyAMA0.service<br />
systemctl mask serial-getty@ttyAMA0.service<br />
</syntaxhighlight><br />
Bei den Modellen mit Bluetooth muss die UART aktiviert und umkonfiguriert werden. Hier ein bash Script, welches die Originaldatei entsprechend modifiziert:<br />
{{Randnotiz|RNTyp=Info|RNText=Im aktuellen RaspberryPi OS Bookworm Image ist die config.txt in den Pfad /boot/firmware gewandert. Die alte Datei wurde durch einen Dummy ersetzt.<br />
Verwendet man ein debian Image findet man hier Infos: https://forum.fhem.de/index.php?msg=1307865}}<syntaxhighlight lang="bash"><br />
# serielle Schnittstelle aktivieren und mit BT Schnittstelle tauschen<br />
config="/boot/firmware/config.txt"<br />
# für Raspberry Pi OS vor Bookworm <br />
# config="/boot/config.txt"<br />
# für Ubuntu<br />
#config="/boot/firmware/usercfg.txt"<br />
<br />
bash -c "cat <<EOF >> $config<br />
enable_uart=1<br />
dtoverlay=miniuart-bt<br />
core_freq=250<br />
EOF"<br />
</syntaxhighlight><br />
Wer dem nicht traut, der editiert die Datei von Hand (Linux Editor!) und fügt am Ende die drei Zeilen aus dem Script ein, die vor EOF stehen.<br />
<br />
Die config Datei von ubuntu verwendet den Befehl include usercfg.txt. Mit Erscheinen des Pi 4 wurden die overlay Dateien umbenannt (Start mit Pi3- entfernt) die alten Namen funktionieren aber noch.<br />
<br />
Um die Konfiguration abzuschließen ist ein Neustart erforderlich<br />
<syntaxhighlight lang="bash">#Neustart erforderlich <br />
reboot</syntaxhighlight><br />
<br />
====Troubleshooting====<br />
{{Randnotiz|RNTyp=r|RNText=Das hat sich mit RaspberryPI OS Bookworm geändert, aktuell wird darüber ab {{Link2Forum|Topic=135864|Message=1294588|LinkText=diesem Forenbeitrag}} diskutiert.}} <br />
'''Kontrolle der seriellen Schnittstelle'''<br />
<br />
Der Befehl <code>ls -l /dev/ttyAMA0</code> muss folgende Ausgabe liefern.<br />
crw-rw---- 1 root dialout 204, 64 Jun 7 22:56 /dev/ttyAMA0<br />
Sollte dies nicht der Fall sein, muss der Dienst serial-getty@ttyAMA0.service deaktiviert werden!<br />
<br />
Kontrolle der Verlinkung von /dev/serial*<br />
<br />
Der Befehl <code>ls -l /dev/serial*</code> muss folgende Ausgabe liefern.<br />
* Bei Modellen mit BT und richtiger Konfiguration (funktioniert nur unter Raspberry Pi OS)<br />
lrwxrwxrwx 1 root root 7 Jun 7 22:55 /dev/serial0 -> ttyAMA0<br />
lrwxrwxrwx 1 root root 5 Jun 7 22:55 /dev/serial1 -> ttyS0<br />
* Bei den Modellen ohne BT und richtiger Konfiguration<br />
lrwxrwxrwx 1 root root 7 Jun 8 18:30 /dev/serial0 -> ttyAMA0<br />
Sollte das nicht der Fall sein, sind die Einträge in der /boot/config.txt fehlerhaft. <br />
<br />
Sollte die serielle Schnittstelle unerwartet nicht funktionieren, kann auch andere Software daran Schuld sein, weil diese einfach versucht, alle Schnittstellen abzufragen / zu initialisieren. Für die Fehlersuche ist es also wichtig zu wissen, welche Software so installiert wurde, speziell wenn diese serielle Schnitttstellen (USB) verwendet / verwenden will. Ein Beispiel (deconz/conbee) wird in {{Link2Forum|Topic=116428|Message=1107317|LinkText=diesem Forenbeitrag}} behandelt. <br />
<br />
Bei einem Raspberry 4 stört unter Umständen die Temperaturkontrolle des Lüfters, siehe auch Abschnitt bekannte Probleme: [[HM-MOD-RPI-PCB HomeMatic Funkmodul für Raspberry Pi]]. <br />
<br />
'''Kontrolle Bluetooth'''<br />
<br />
Die Funktion von Bluetooth kann mit dem hcitool überprüft werden. Mit <code>hcitool dev</code> wird das interne BT Gerät mit MAC Adresse angezeigt. Mit <code>hcitool scan</code> bzw. <code>hcitool lescan</code> kann nach sichtbaren Geräten gesucht werden.<br />
<br />
Weitergehende Informationen zur Anpassung der Konfiguration von Raspberry Pi OS sind nachzulesen auf https://www.raspberrypi.org/documentation/configuration/.<br />
<br />
Sollte die Bluetooth Schnittstelle nach der Installation von FHEM nicht funktionieren, hilft es den Dienst abhängig zu starten, siehe diesen Wiki Artikel [[Fhem.service (systemd unit file)]] <br />
<br />
=== FHEM ===<br />
Die Installation von FHEM kann nach der Raspberry Pi OS Installation sehr einfach über das Debian-Repository [http://debian.fhem.de] erfolgen. <br />
* Es wird unbedingt empfohlen zur Grundinstallation zunächst keine Module, USB Sticks oder ähnliche Zusatzbaugruppen an den IO Ports des Raspberry gesteckt zu haben. <br />
* Dieser Abschnitt beschreibt nur die Grundinstallation von FHEM auf einem Raspberry Pi mit Raspberry Pi OS! <br />
* Weitere Installationsschritte sind je nach verwendeten FHEM-Modulen notwendig. <br />
** Informationen hierzu liefert üblicherweise die {{Link2CmdRef}} zum jeweiligen Modul.<br />
** Den weiteren Einstieg in FHEM findet man im Artikel [[Quick-Start]]<br />
<br />
==== Der einfache Weg zum aktuellen System ====<br />
Der folgende Befehlsblock ist die praktische Umsetzung der Beschreibung auf http://debian.fhem.de. Bitte unbedingt vor Installation rückversichern, ob es dort (insbesondere unter ''The easy way: use apt-get'') Aktualisierungen gab. <br />
* Dieser Befehlsblock erfordert erhöhte Rechte, also bitte als Erstes <code>sudo su</code> ausführen!<br />
* Beim Kopieren aufpassen! Jede Zeile muss einzeln ausgeführt werden!<br />
Dieser Befehlsblock gilt ab der Version ''debian buster'' als veraltet (es gibt Sicherheitsbedenken), muss aber bis einschließlich ''debian stretch'' eingesetzt werden.<br />
<syntaxhighlight lang="bash"><br />
# von debian.fhem.de installieren - siehe aktuelle Anleitung dort https://debian.fhem.de/<br />
wget -qO - https://debian.fhem.de/archive.key | apt-key add -<br />
echo "deb http://debian.fhem.de/nightly/ /" >> /etc/apt/sources.list<br />
apt-get update<br />
apt-get install fhem<br />
</syntaxhighlight><br />
Dieser Befehlsblock funktioniert erst ab ''debian buster'' (erfordert erhöhte Rechte <code>sudo su</code>)<br />
<syntaxhighlight lang="bash"><br />
# Bei manchen debian Distributionen fehlt das Paket gpg -> nachinstallieren<br />
apt update<br />
apt install gpg<br />
# von debian.fhem.de installieren - siehe aktuelle Anleitung dort https://debian.fhem.de/<br />
wget -O- https://debian.fhem.de/archive.key | gpg --dearmor > /usr/share/keyrings/debianfhemde-archive-keyring.gpg<br />
echo "deb [signed-by=/usr/share/keyrings/debianfhemde-archive-keyring.gpg] https://debian.fhem.de/nightly/ /" >> /etc/apt/sources.list<br />
apt update<br />
apt install fhem<br />
</syntaxhighlight><br />
<br />
==== Das offizielle Release ====<br />
Man kann FHEM mit dem Debian-Paket von [https://fhem.de/#Installation fhem.de] installieren. Dieser Weg führt zu einem offiziellen Release, welches aber unter Umständen erheblich vom aktuellen Versions- und Diskussionsstand im Forum abweicht. <br />
<br />
Alternativ kann man auch den manuellen Weg von https://debian.fhem.de/ wählen.<br />
<br />
==== Empfohlener Patch ====<br />
Da gerade auf dem Raspberry die automatische Erkennung der USB Schnittstellen zu 100% CPU Last führt (FHEM träge und reagiert nicht), wird empfohlen sofort nach der Installation noch diesen "Patch" auszuführen: FHEM starten, wenn alle USB-Geräte ausgesteckt sind. Dann <code>attr initialUsbCheck disable 1</code> in der Kommandozeile in FHEMWEB eingeben, <code>save</code> ausführen und FHEM anschließen wieder mit eingesteckten USB-Geräten neu starten.<br />
<br />
==== Deinstallation ====<br />
Man kann FHEM auch wieder spurlos vom System entfernen und ganz von vorn beginnen. Allerdings sollte man sich im Klaren sein, damit ensteht kein jungfräuliches System!<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get purge fhem<br />
sudo apt-get autoremove<br />
</syntaxhighlight><br />
<br />
=== Zusatzpakete bei FHEM-Erst- und Zweitinstallation ===<br />
Nachdem der RPi eingerichtet ist, können weitere Pakete installiert werden. Keines davon ist zwingend erforderlich, um das Grundgerüst von FHEM betreiben zu können. Einige Pakete erhöhen aber den Bedienungskomfort, andere sind zur Nutzung bestimmter weiterer FHEM-Module (siehe {{Link2CmdRef}}) erforderlich. <br />
<br />
Hierzu wurden in letzter Zeit mehrere Hilfsmodule entwickelt, die insbesondere bei Wiederinstallation (etwa nach Absturz) wichtig sein können. So zeigt das Modul Installer die installierten Perl-Module an, siehe dazu {{Link2Forum|Topic=98381|LinkText=diesen Thread}}.<br />
<br />
Wenn man eine frühere Installation auf einer anderen SD-Karte installieren möchte und nicht mehr weiß, welche Zusatzpakete man auf der alten Karte installiert hatte, hilft (diese und nachfolgende Hinweise sind aus dem Blog [https://heinz-otto.blogspot.com/2019/07/infos-zur-installation-von-modulen-und.html])<br />
zcat $(ls -tr /var/log/apt/history.log.*.gz)|grep -A1 Start-Date<br />
weiter. Hier werden frühere Eingaben der Kommandozeile wiedergegeben. Es gibt einen analogen Befehl, um die mit CPAN installierten Pakete anzuzeigen. Dazu muss man das debian Paket perl-doc installiert haben und gibt dann ein<br />
for M in `perldoc -t perllocal|grep Module |sed -e 's/^.*" //'`; do V=`perldoc -t perllocal|awk "/$M/{y=1;next}y" |grep VERSION |head -n 1`; printf "%30s %s\n" "$M" "$V"; done |sort<br />
Ebenso kann man herausfinden, ob und durch welches debian-Paket das Perl-Paket installiert wurde. Die zweite Version sucht nur in Paketen die -perl im Namen tragen und läuft damit wesentlich schneller:<br />
s='Device::SerialPort' ## zu diesem Paket wird gesucht<br />
perl -M$s -e '' 2>/dev/null &&echo "Modul $s ist vorhanden"''<br />
for i in $(dpkg -l |grep ^ii| awk '{ print $2 }'|tr -d "\r"|tr "\n" " ");do if dpkg -L $i|grep $s &> /dev/null;then echo $i enthält $s;fi;done<br />
for i in $(dpkg -l |grep ^ii|grep '\-perl'| awk '{ print $2 }'|tr -d "\r"|tr "\n" " ");do if dpkg -L $i|grep $s &> /dev/null;then echo $i enthält $s;fi;done<br />
<br />
Es gibt gute Gründe, die Installation von Perl Modulen über debian-Pakete der Installation über cpan zu bevorzugen. Dazu zählt die Updatefähigkeit und die Geschwindigkeit. Man kann im Internet nach den Paketen suchen, man kann aber auch einfach die Verfügbarkeit für das lokale System testen. Dazu braucht man das Tool apt-file, welches man zuerst installieren muss. Der letzte Befehl lädt den Infocache lokal und dauert etwas:<br />
sudo apt-get update<br />
sudo apt-get install apt-file<br />
sudo apt-file update<br />
Die folgende Suche nutzt den Umstand, dass in der im Paket enthaltenen Liste der Dateien auch die Doku in der Form "/usr/share/man/man3/IO::File.3perl.gz" enthalten ist. Der search Befehl unten akzeptiert mehrere Modulnamen durch Zeilenumbruch getrennt. In dem Beispiel sind die Modulnamen in einem String durch Leerzeichen getrennt, die Trennung wird in Zeilenumbruch geändert, jede Zeile ergänzt und über stdin an den search Befehl von apt-file übergeben. Die Option -l bewirkt das nur die gefunden Pakete gelistet werden, werden mehrere der abgefragten Modulnamen in einem Paket gefunden, wird es nur einmal gelistet:<br />
s="IO::File Digest::MD5" ##Such-String<br />
echo $s|tr " " "\n"|sed 's/$/./;s/^/\//'|apt-file search -l -f -<br />
<br />
Zuletzt eine Übersicht diverser Zusatzpakete.<br />
{| class="wikitable"<br />
! style="width:10%" | Beschreibung<br />
! style="width:10%" | Paketname<br />
! style="width:50%" | Kontext<br />
! style="width:30%" | Installieren<br />
|-<br />
|Zeitserver<br />
|ntpdate<br />
|Setzt die Systemzeit bei Start des RPi. Wird für FHEM benötigt, da es sonst nicht startet.<br />
|<code>sudo apt-get install ntpdate<br />
sudo ntpdate -u de.pool.ntp.org</code><br />
|-<br />
|Perl JSON<br />
|JSON<br />
|Wird von einigen Modulen benötigt, z.B. harmony, iTunes<br />
|<code>sudo apt-get install libjson-perl</code><br />
|-<br />
|Samba-Server<br />
|samba<br />
|Mittels Samba kann man z.B. den Ordner /opt/fhem als Share freigeben. Dieser Share kann z.B. im Windows-Explorer als Laufwerk verbunden werden, so dass die Bearbeitung von config- und Programmdateien bequem möglich ist. Hier eine hilfreiche [https://www.elektronik-kompendium.de/sites/raspberry-pi/2007071.htm Kurzanleitung] aus der (wenn man auf einen speziellen user verzichtet) nur die Einträge für smb.conf gesetzt werden müssen.<br />
|<code>sudo apt-get install samba cifs-utils</code><br />
Danach muss der share definiert werden mittels<br />
<br />
<code>sudo nano /etc/samba/smb.conf</code><br />
|-<br />
|Mailversand<br />
|sendemail (alt: sendEmail)<br />
|Wird benötigt, um Mails versenden zu können, bspw. für Alarm-Benachrichtigungen.<br />
Nach Installation des Paketes benötigt man noch eine Routine in FHEM gemäß [[E-Mail senden#Raspberry Pi]]<br />
|<code>sudo apt-get install sendemail</code> bzw. <code>sudo apt-get install sendEmail</code><br />
|-<br />
|Wake-on-LAN<br />
|etherwake<br />
|Wird z.B. für das Modul WOL benötigt.<br />
|<code>sudo apt-get install etherwake</code><br />
|-<br />
|Perl Telnet<br />
|telnet<br />
|Wurde vor Fritz!OS 6.2x z.B. für das Modul [[FRITZBOX]] benötigt, da es eine im Netzwerk vorhandene Fritzbox über deren Telnet-Port ansprach. Mittlerweile wird TR-64 und SOAP verwendet.<br />
|<code>sudo apt-get install libnet-telnet-perl</code><br />
|-<br />
|Socat<br />
|socat<br />
|Kann verwendet werden, um auf anderen Rechnern im Netzwerk Linux-Befehle oder Skripts auszuführen. Auch können auf Slave-FHEM-Installationen Befehl ausgeführt werden, z.B. mit <br />
<br />
<code><nowiki>system("echo 'set lampe on' | /usr/bin/socat - TCP:1.2.3.4:7072");</nowiki></code><br />
<br />
1.2.3.4 muss natürlich durch die IP-Adresse des Zielrechners ersetzt werden.<br />
|<code>sudo apt-get install socat</code><br />
|-<br />
|Libcrypt<br />
|Libcrypt<br />
|Perl libcrypt, erforderlich falls Homematic-devices mit AES verwendet werden sollen.<br />
|<code>sudo apt-get install libcrypt-rijndael-perl</code><br />
|-<br />
|libdatetime<br />
|libdatetime<br />
|Perl libdatetime, erforderlich für das Weather-Modul.<br />
|<code>sudo apt-get install libdatetime-format-strptime-perl</code><br />
|-<br />
|EnOcean XML functions<br />
|libxml simple<br />
|Perl XML::SIMPLE, erforderlich für die XML Funktionen des ENOCEAN Moduls.<br />
|<code>sudo apt-get install libxml-simple-perl</code><br />
|-<br />
|EnOcean Cryptographic functions<br />
|libcrypt-random-source-perl<br />
|Perl Crypt::Random, erforderlich für die Cryptographic Funktionen des ENOCEAN Moduls.<br />
|<code>sudo /usr/bin/perl -MCPAN -e 'install Crypt::Random'</code><br />
|}<br />
<br />
== Bekannte Probleme ==<br />
=== Netzteil ===<br />
Der RPi verwendet ein USB Netzteil als Spannungsversorgung. Gemessen kann der RPi allein bereits um die 900mA Strom fordern. Das bringt kleine Netzteile, besonders wenn noch CULs oder WLAN Sticks an USB hängen schnell an die Grenze. Die Fehler die daraus resultieren sind Abstürze, Netzwerkprobleme uvm. Daher bitte ein ausreichend starkes Netzteil mit mind. 2000mA oder einen aktiven USB-HUB für die Periperie verwenden.<br />
<br />
=== Kabel (Micro-USB) ===<br />
Auch das verwendete Kabel kann einen (großen) Unterschied machen. Billige Kabel haben sehr dünne Kupferadern, die auf größeren Strecken (bereits ab 30cm!) einen Spannungsabfall verursachen können, der sonst nicht nachvollziehbare Probleme (Festplattenausfall, SD-Kartenausfall etc.) auslöst. Siehe beispielsweise diesen Thread mit einer Tabelle, die die Höhe des Spannungsabfalls explizit beschreibt: [https://forum.fhem.de/index.php/topic,127508.0.html Link zum Forum] <br />
<br />
=== Echtzeituhr ===<br />
Der RPi hat keine [http://de.wikipedia.org/wiki/Echtzeituhr Real-Time-Clock] (RTC), das heißt, dass er nach einem Neustart keine gültige (im Sinne von aktuell) Systemzeit hat, sondern ein Datum in der Vergangenheit. Dieses Problem wird sinnvollerweise mit einer [http://de.wikipedia.org/wiki/Network_Time_Protocol NTP-Konfiguration] oder durch [[Raspberry Pi: RTC Hat|Installation einer Echtzeituhr]] umgangen.<br />
<br />
Dabei muss Sorge getragen werden, dass der [http://wiki.debian.org/NTP ntpd] schon einen Datums-/Zeitabgleich gemacht hat, bevor FHEM gestartet wird. Geschieht der Abgleich nicht vorher, sondern erst nachdem FHEM schon läuft, stellt FHEM die Logs zwar auf das nun aktuelle Datum um (die "alten" Logs mit dem eigentlich ungültigen Datum werden natürlich behalten), aber irgendetwas scheint FHEM dabei so zu belasten, dass es eine Last von über 0.8 bis 0.9 erzeugt. Diese Last besteht auf Dauer und verschwindet erst, wenn man das Ganze sauber durchkonfiguriert und FHEM neu gestartet hat. Die hohe Systemauslastung zeigt sich auch in einem sehr trägen Laden der FHEM-Webseiten in einem beliebigen Browser. (siehe {{Link2Forum|Topic=70741}})<br />
<br />
=== Last durch Backup (während update) ===<br />
Bei einen [[Update]] von FHEM durch den Befehl <code>update</code> kann durch Setzen des Attributs "<code>attr global backup_before_update 1</code>" automatisch vorab ein [[Backup]] durchgeführt werden. Die (ggf. großen) Log-Dateien werden dabei ebenfalls archiviert. Während der Archivierung ist FHEM blockiert. Durch die beschränkte Leistungsfähigkeit des Raspberry Pi kann das Backup zudem lange dauern. Durch ein "<code>attr global updateInBackground 1</code>" wird ein Backup im Hintergrund ausgeführt (Quelle: {{Link2Forum|Topic=15729}}). <br />
<br />
Alternative Möglichkeiten: <br />
* Backup ausschalten und manuell durchführen <br />
* Backup-Befehl anpassen und so große Dateien bzw. Verzeichnisse (log/) nicht archivieren<br />
<br />
== Watchdog einrichten ==<br />
Man kann den RPi regelmäßig prüfen lassen, ob FHEM noch läuft und gegebenenfalls einen Neustart durchführen lassen. Eine mögliche Vorgehensweise ist in diesem {{Link2Forum|Topic=20553|LinkText=Forumsthema}} beschrieben.<br />
{{Hinweis|Statt des Einsatzes derartiger Methoden ist zu empfehlen, nach der eigentliche Fehlerursache zu forschen und diese abzustellen. Haben Sie dennoch einen solchen Watchdog eingerichtet, sollten Sie bei Fragen zu Ihnen seltsam erscheinenden Phänomänen im Forum darauf hinweisen, auch wenn die Symptome scheinbar nichts mit dem Watchdog zu tun haben sollten.}}<br />
<br />
== Interne Links ==<br />
* [[CUL am Raspberry Pi flashen]]<br />
* [[Raspberry Pi und 1-Wire]]<br />
<br />
== Externe Links ==<br />
* {{Link2Forum|Topic=33460|Message=264679}} zum Umzug von Raspberry B auf Raspberry Pi 2<br />
* [http://www.raspberrypi.org/ Offizielle Webseite der Raspberry Pi Foundation]<br />
* [http://www.raspberrypi.org/downloads Offizielle Downloads der Raspberry Pi Foundation]<br />
<br />
[[Kategorie:Raspberry Pi]]<br />
[[Kategorie:HOWTOS]]</div>Otto123http://wiki.fhem.de/w/index.php?title=Raspberry_Pi&diff=39185Raspberry Pi2024-03-17T19:28:38Z<p>Otto123: /* Verwendung UART für Zusatzmodule */ auf aktuelle Bookworm Version umgebaut</p>
<hr />
<div>Beim [[Raspberry Pi]] handelt es sich um einen postkartengroßen Einplatinen-Computer, der von der Raspberry Pi Foundation entwickelt wird. Die Hardware basiert auf dem BCM 283x SoC (System-on-Chip) von Broadcom, einem ARM-Prozessor. Zu Hardwaredetails und den verschiedenen Modellen sowie Produktentwicklungen siehe [http://de.wikipedia.org/wiki/Raspberry_Pi#Hardware Wikipedia].<br />
Dank der kleinen Abmessungen, dem recht geringen Energieverbrauch (bis ca. 4 Watt) sowie der günstigen Anschaffungskosten (ca. 30€) ist der Raspberry Pi eine attraktive Hardware für die Heimautomatisierung mit FHEM. Er ist dank dem Linux-Betriebssystem vollständig kompatibel zur aktuell vorhandenen und von FHEM unterstützen Hardware. Das derzeit empfohlene Standard-Image zum Betrieb des Raspberry Pi ist die auf Debian basierende Raspberry Pi OS Distribution (ab Mitte 2019 ''Buster'').<br />
<br />
== Installation / Setup ==<br />
=== Betriebssystem ===<br />
====Vorbemerkung====<br />
Raspberry Pi OS ist direkt bei raspberrybi.org unter https://www.raspberrypi.org/downloads/raspberry-pi-os/ herunterladbar. Die folgende Anleitung gilt für die lite-Version ohne grafischen Desktop und für die Modelle für B, B+, B2, B3, B3+, Zero W. (Stand Juni 2018)<br />
<br />
Alle in diesem Abschnitt verwendeten Code Blöcke benötigen root Rechte. Deshalb bitte immer am Besten im Kontext <code>sudo su</code> ausführen. Man kann auch einzelne Befehle mit sudo davor ausführen, allerdings wird die Berechtigung bei Pipe Befehlen nicht durchgereicht. Einige dieser Kommandos funktionieren in der angegebenen Form nicht unter der Wheezy-Version [https://en.wikipedia.org/wiki/Raspberry_Pi_OS#Release_history] des RPi OS. Läuft der betreffende RPi noch unter Wheezy, ist ein Upgrade des RPi OS empfehlenswert.<br />
<br />
Alle Dateien müssen im Linux-Format (nur LF als Zeilenende) erzeugt/editiert werden! Unbedingt einen geeigneten Editor verwenden und auf das Format beim Speichern achten!<br />
<br />
====SD-Karte vorbereiten====<br />
Die heruntergeladene Datei muss entpackt und auf die Speicherkarte geschrieben werden. Es gibt dazu verschiedene Tools je nach Betriebssystem. Für Windows ist windisk32imager zu empfehlen, Projektseite [https://sourceforge.net/projects/win32diskimager/]. Für Mac OS gibt es den Pi Filler.<br />
<br />
Detaillierte Anleitungen zur Vorgehensweise finden sich für die Betriebssysteme Linux, Mac OS und Windows unter [https://www.raspberrypi.org/documentation/installation/installing-images/README.md Writing an image to the SD card]<br />
<br />
Die SD Card enthält nun zwei Partitionen/Laufwerke, wobei das erste Laufwerk unter alle Betriebssystemen lesbar ist. In diesem Laufwerk (/boot) müssen jetzt noch zwei Dateien erzeugt werden:<br />
* eine leere Datei mit dem Namen ssh, um den (headless) Zugriff per ssh zu ermöglichen (Pi Filler macht dies automatisch). Hinweis: Eine spätere Aktivierung von SSH ist mit <code>sudo raspi-config</code> (Punkt 5 "Interfacing Options", dann Punkt 2 SSH) möglich, erfordert dann aber Tastatur und Monitor am RPi.<br />
* eine Textdatei im Linux Format mit Namen wpa_supplicant.conf und folgendem Inhalt, wenn der Pi sofort mit WLAN starten soll.<br />
<br />
<pre>country=DE<br />
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev<br />
update_config=1<br />
network={<br />
ssid="FRITZ!Box 7490"<br />
psk="12345678901234567890" <br />
}<br />
</pre><br />
* SD Karte auswerfen.<br />
* SD Karte in Raspberry Pi stecken und booten.<br />
<br />
Alternativ kann auch Monitor und Tastatur verwendet werden.<br />
<br />
====Anmeldung und Grundkonfiguration====<br />
Default raspberrypi-os: Host raspberrypi, User pi, Passwort raspberry <br />
<br />
Default ubuntu: Host ubuntu, User ubuntu, Passwort ubuntu<br />
<br />
Anmeldung entweder lokal oder mit dem Befehl: ssh <user>@<hostname><br />
<br />
Das Passwort sollte geändert werden, dazu dem Sicherheitshinweis folgen und <code>passwd</code> eingeben.<br />
<br />
Alle unten genannten Befehle müssen mit erhöhten Rechten ausgeführt werden (z. B. sudo)!<br />
<br />
Als Erstes sollte: Zeitzone, Sprache und Hostname angepasst werden. <br />
Entweder Menügeführt mit <code>sudo raspi-config</code> <br />
oder per Script / Shell Befehle:<br />
<br />
<syntaxhighlight lang="bash"># Zeitzone einstellen & Zeitsynchronisierung über das Internet aktivieren<br />
timedatectl set-timezone Europe/Berlin<br />
timedatectl set-ntp true<br />
<br />
# Konfigurieren lokale Sprache deutsch<br />
sed -i -e 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/' /etc/locale.gen<br />
locale-gen<br />
localectl set-locale LANG=de_DE.UTF-8 LANGUAGE=de_DE<br />
<br />
# Hostname <br />
hostnamectl set-hostname mymachine<br />
<br />
# System aktualisieren <br />
apt-get update<br />
apt-get upgrade<br />
<br />
#Neustart<br />
reboot</syntaxhighlight><br />
<br />
Am Anfang sollte man Befehle nicht verketten, sondern immer auf die Ausgabe warten (es sei denn, man hat Erfahrung): also kein <code>apt-get update && apt-get upgrade </code>. Ebenso sollte man nicht mit automatischen Bestätigungen arbeiten, also kein upgrade mit "-y". Nach einer Installation ist ein aufräumen immer gut, also:<br />
<syntaxhighlight lang="bash"><br />
apt-get autoremove<br />
apt-get clean<br />
apt-get purge $(dpkg --get-selections | grep deinstall | cut -f1 | xargs)<br />
</syntaxhighlight><br />
<br />
====Verwendung UART für Zusatzmodule====<br />
Einige Aufsteckmodule (z.B. HM-MOD-RPI-PCB) für den GPIO Port verwenden die serielle Schnittstelle UART. Der Zugriff auf diese serielle Schnittstelle erfordert eine modellabhängige Konfiguration. Siehe auch [https://www.raspberrypi.com/documentation/computers/configuration.html Raspberry Pi Dokumentation]<br />
<br />
Bei allen Modellen muss die Verwendung der seriellen Linux console an ttyAMA0 deaktiviert werden:<br />
<syntaxhighlight lang="bash"># seriell-getty Dienst für ttyAMA0 dauerhaft deaktivieren<br />
systemctl stop serial-getty@ttyAMA0.service<br />
systemctl disable serial-getty@ttyAMA0.service<br />
systemctl mask serial-getty@ttyAMA0.service<br />
</syntaxhighlight><br />
Bei den Modellen mit Bluetooth muss die UART aktiviert und umkonfiguriert werden. Hier ein bash Script, welches die Originaldatei entsprechend modifiziert:<br />
{{Randnotiz|RNTyp=Info|RNText=Im aktuellen RaspberryPi OS Bookworm Image ist die config.txt in den Pfad /boot/firmware gewandert. Die alte Datei wurde durch einen Dummy ersetzt}}<syntaxhighlight lang="bash"><br />
# serielle Schnittstelle aktivieren und mit BT Schnittstelle tauschen<br />
config="/boot/firmware/config.txt"<br />
# für Raspberry Pi OS vor Bookworm <br />
# config="/boot/config.txt"<br />
# für Ubuntu<br />
#config="/boot/firmware/usercfg.txt"<br />
<br />
bash -c "cat <<EOF >> $config<br />
enable_uart=1<br />
dtoverlay=miniuart-bt<br />
core_freq=250<br />
EOF"<br />
</syntaxhighlight><br />
Wer dem nicht traut, der editiert die Datei von Hand (Linux Editor!) und fügt am Ende die drei Zeilen aus dem Script ein, die vor EOF stehen.<br />
<br />
Die config Datei von ubuntu verwendet den Befehl include usercfg.txt. Mit Erscheinen des Pi 4 wurden die overlay Dateien umbenannt (Start mit Pi3- entfernt) die alten Namen funktionieren aber noch.<br />
<br />
Um die Konfiguration abzuschließen ist ein Neustart erforderlich<br />
<syntaxhighlight lang="bash">#Neustart erforderlich <br />
reboot</syntaxhighlight><br />
<br />
====Troubleshooting====<br />
{{Randnotiz|RNTyp=r|RNText=Das hat sich mit RaspberryPI OS Bookworm geändert, aktuell wird darüber ab {{Link2Forum|Topic=135864|Message=1294588|LinkText=diesem Forenbeitrag}} diskutiert.}} <br />
'''Kontrolle der seriellen Schnittstelle'''<br />
<br />
Der Befehl <code>ls -l /dev/ttyAMA0</code> muss folgende Ausgabe liefern.<br />
crw-rw---- 1 root dialout 204, 64 Jun 7 22:56 /dev/ttyAMA0<br />
Sollte dies nicht der Fall sein, muss der Dienst serial-getty@ttyAMA0.service deaktiviert werden!<br />
<br />
Kontrolle der Verlinkung von /dev/serial*<br />
<br />
Der Befehl <code>ls -l /dev/serial*</code> muss folgende Ausgabe liefern.<br />
* Bei Modellen mit BT und richtiger Konfiguration (funktioniert nur unter Raspberry Pi OS)<br />
lrwxrwxrwx 1 root root 7 Jun 7 22:55 /dev/serial0 -> ttyAMA0<br />
lrwxrwxrwx 1 root root 5 Jun 7 22:55 /dev/serial1 -> ttyS0<br />
* Bei den Modellen ohne BT und richtiger Konfiguration<br />
lrwxrwxrwx 1 root root 7 Jun 8 18:30 /dev/serial0 -> ttyAMA0<br />
Sollte das nicht der Fall sein, sind die Einträge in der /boot/config.txt fehlerhaft. <br />
<br />
Sollte die serielle Schnittstelle unerwartet nicht funktionieren, kann auch andere Software daran Schuld sein, weil diese einfach versucht, alle Schnittstellen abzufragen / zu initialisieren. Für die Fehlersuche ist es also wichtig zu wissen, welche Software so installiert wurde, speziell wenn diese serielle Schnitttstellen (USB) verwendet / verwenden will. Ein Beispiel (deconz/conbee) wird in {{Link2Forum|Topic=116428|Message=1107317|LinkText=diesem Forenbeitrag}} behandelt. <br />
<br />
Bei einem Raspberry 4 stört unter Umständen die Temperaturkontrolle des Lüfters, siehe auch Abschnitt bekannte Probleme: [[HM-MOD-RPI-PCB HomeMatic Funkmodul für Raspberry Pi]]. <br />
<br />
'''Kontrolle Bluetooth'''<br />
<br />
Die Funktion von Bluetooth kann mit dem hcitool überprüft werden. Mit <code>hcitool dev</code> wird das interne BT Gerät mit MAC Adresse angezeigt. Mit <code>hcitool scan</code> bzw. <code>hcitool lescan</code> kann nach sichtbaren Geräten gesucht werden.<br />
<br />
Weitergehende Informationen zur Anpassung der Konfiguration von Raspberry Pi OS sind nachzulesen auf https://www.raspberrypi.org/documentation/configuration/.<br />
<br />
Sollte die Bluetooth Schnittstelle nach der Installation von FHEM nicht funktionieren, hilft es den Dienst abhängig zu starten, siehe diesen Wiki Artikel [[Fhem.service (systemd unit file)]] <br />
<br />
=== FHEM ===<br />
Die Installation von FHEM kann nach der Raspberry Pi OS Installation sehr einfach über das Debian-Repository [http://debian.fhem.de] erfolgen. <br />
* Es wird unbedingt empfohlen zur Grundinstallation zunächst keine Module, USB Sticks oder ähnliche Zusatzbaugruppen an den IO Ports des Raspberry gesteckt zu haben. <br />
* Dieser Abschnitt beschreibt nur die Grundinstallation von FHEM auf einem Raspberry Pi mit Raspberry Pi OS! <br />
* Weitere Installationsschritte sind je nach verwendeten FHEM-Modulen notwendig. <br />
** Informationen hierzu liefert üblicherweise die {{Link2CmdRef}} zum jeweiligen Modul.<br />
** Den weiteren Einstieg in FHEM findet man im Artikel [[Quick-Start]]<br />
<br />
==== Der einfache Weg zum aktuellen System ====<br />
Der folgende Befehlsblock ist die praktische Umsetzung der Beschreibung auf http://debian.fhem.de. Bitte unbedingt vor Installation rückversichern, ob es dort (insbesondere unter ''The easy way: use apt-get'') Aktualisierungen gab. <br />
* Dieser Befehlsblock erfordert erhöhte Rechte, also bitte als Erstes <code>sudo su</code> ausführen!<br />
* Beim Kopieren aufpassen! Jede Zeile muss einzeln ausgeführt werden!<br />
Dieser Befehlsblock gilt ab der Version ''debian buster'' als veraltet (es gibt Sicherheitsbedenken), muss aber bis einschließlich ''debian stretch'' eingesetzt werden.<br />
<syntaxhighlight lang="bash"><br />
# von debian.fhem.de installieren - siehe aktuelle Anleitung dort https://debian.fhem.de/<br />
wget -qO - https://debian.fhem.de/archive.key | apt-key add -<br />
echo "deb http://debian.fhem.de/nightly/ /" >> /etc/apt/sources.list<br />
apt-get update<br />
apt-get install fhem<br />
</syntaxhighlight><br />
Dieser Befehlsblock funktioniert erst ab ''debian buster'' (erfordert erhöhte Rechte <code>sudo su</code>)<br />
<syntaxhighlight lang="bash"><br />
# Bei manchen debian Distributionen fehlt das Paket gpg -> nachinstallieren<br />
apt update<br />
apt install gpg<br />
# von debian.fhem.de installieren - siehe aktuelle Anleitung dort https://debian.fhem.de/<br />
wget -O- https://debian.fhem.de/archive.key | gpg --dearmor > /usr/share/keyrings/debianfhemde-archive-keyring.gpg<br />
echo "deb [signed-by=/usr/share/keyrings/debianfhemde-archive-keyring.gpg] https://debian.fhem.de/nightly/ /" >> /etc/apt/sources.list<br />
apt update<br />
apt install fhem<br />
</syntaxhighlight><br />
<br />
==== Das offizielle Release ====<br />
Man kann FHEM mit dem Debian-Paket von [https://fhem.de/#Installation fhem.de] installieren. Dieser Weg führt zu einem offiziellen Release, welches aber unter Umständen erheblich vom aktuellen Versions- und Diskussionsstand im Forum abweicht. <br />
<br />
Alternativ kann man auch den manuellen Weg von https://debian.fhem.de/ wählen.<br />
<br />
==== Empfohlener Patch ====<br />
Da gerade auf dem Raspberry die automatische Erkennung der USB Schnittstellen zu 100% CPU Last führt (FHEM träge und reagiert nicht), wird empfohlen sofort nach der Installation noch diesen "Patch" auszuführen: FHEM starten, wenn alle USB-Geräte ausgesteckt sind. Dann <code>attr initialUsbCheck disable 1</code> in der Kommandozeile in FHEMWEB eingeben, <code>save</code> ausführen und FHEM anschließen wieder mit eingesteckten USB-Geräten neu starten.<br />
<br />
==== Deinstallation ====<br />
Man kann FHEM auch wieder spurlos vom System entfernen und ganz von vorn beginnen. Allerdings sollte man sich im Klaren sein, damit ensteht kein jungfräuliches System!<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get purge fhem<br />
sudo apt-get autoremove<br />
</syntaxhighlight><br />
<br />
=== Zusatzpakete bei FHEM-Erst- und Zweitinstallation ===<br />
Nachdem der RPi eingerichtet ist, können weitere Pakete installiert werden. Keines davon ist zwingend erforderlich, um das Grundgerüst von FHEM betreiben zu können. Einige Pakete erhöhen aber den Bedienungskomfort, andere sind zur Nutzung bestimmter weiterer FHEM-Module (siehe {{Link2CmdRef}}) erforderlich. <br />
<br />
Hierzu wurden in letzter Zeit mehrere Hilfsmodule entwickelt, die insbesondere bei Wiederinstallation (etwa nach Absturz) wichtig sein können. So zeigt das Modul Installer die installierten Perl-Module an, siehe dazu {{Link2Forum|Topic=98381|LinkText=diesen Thread}}.<br />
<br />
Wenn man eine frühere Installation auf einer anderen SD-Karte installieren möchte und nicht mehr weiß, welche Zusatzpakete man auf der alten Karte installiert hatte, hilft (diese und nachfolgende Hinweise sind aus dem Blog [https://heinz-otto.blogspot.com/2019/07/infos-zur-installation-von-modulen-und.html])<br />
zcat $(ls -tr /var/log/apt/history.log.*.gz)|grep -A1 Start-Date<br />
weiter. Hier werden frühere Eingaben der Kommandozeile wiedergegeben. Es gibt einen analogen Befehl, um die mit CPAN installierten Pakete anzuzeigen. Dazu muss man das debian Paket perl-doc installiert haben und gibt dann ein<br />
for M in `perldoc -t perllocal|grep Module |sed -e 's/^.*" //'`; do V=`perldoc -t perllocal|awk "/$M/{y=1;next}y" |grep VERSION |head -n 1`; printf "%30s %s\n" "$M" "$V"; done |sort<br />
Ebenso kann man herausfinden, ob und durch welches debian-Paket das Perl-Paket installiert wurde. Die zweite Version sucht nur in Paketen die -perl im Namen tragen und läuft damit wesentlich schneller:<br />
s='Device::SerialPort' ## zu diesem Paket wird gesucht<br />
perl -M$s -e '' 2>/dev/null &&echo "Modul $s ist vorhanden"''<br />
for i in $(dpkg -l |grep ^ii| awk '{ print $2 }'|tr -d "\r"|tr "\n" " ");do if dpkg -L $i|grep $s &> /dev/null;then echo $i enthält $s;fi;done<br />
for i in $(dpkg -l |grep ^ii|grep '\-perl'| awk '{ print $2 }'|tr -d "\r"|tr "\n" " ");do if dpkg -L $i|grep $s &> /dev/null;then echo $i enthält $s;fi;done<br />
<br />
Es gibt gute Gründe, die Installation von Perl Modulen über debian-Pakete der Installation über cpan zu bevorzugen. Dazu zählt die Updatefähigkeit und die Geschwindigkeit. Man kann im Internet nach den Paketen suchen, man kann aber auch einfach die Verfügbarkeit für das lokale System testen. Dazu braucht man das Tool apt-file, welches man zuerst installieren muss. Der letzte Befehl lädt den Infocache lokal und dauert etwas:<br />
sudo apt-get update<br />
sudo apt-get install apt-file<br />
sudo apt-file update<br />
Die folgende Suche nutzt den Umstand, dass in der im Paket enthaltenen Liste der Dateien auch die Doku in der Form "/usr/share/man/man3/IO::File.3perl.gz" enthalten ist. Der search Befehl unten akzeptiert mehrere Modulnamen durch Zeilenumbruch getrennt. In dem Beispiel sind die Modulnamen in einem String durch Leerzeichen getrennt, die Trennung wird in Zeilenumbruch geändert, jede Zeile ergänzt und über stdin an den search Befehl von apt-file übergeben. Die Option -l bewirkt das nur die gefunden Pakete gelistet werden, werden mehrere der abgefragten Modulnamen in einem Paket gefunden, wird es nur einmal gelistet:<br />
s="IO::File Digest::MD5" ##Such-String<br />
echo $s|tr " " "\n"|sed 's/$/./;s/^/\//'|apt-file search -l -f -<br />
<br />
Zuletzt eine Übersicht diverser Zusatzpakete.<br />
{| class="wikitable"<br />
! style="width:10%" | Beschreibung<br />
! style="width:10%" | Paketname<br />
! style="width:50%" | Kontext<br />
! style="width:30%" | Installieren<br />
|-<br />
|Zeitserver<br />
|ntpdate<br />
|Setzt die Systemzeit bei Start des RPi. Wird für FHEM benötigt, da es sonst nicht startet.<br />
|<code>sudo apt-get install ntpdate<br />
sudo ntpdate -u de.pool.ntp.org</code><br />
|-<br />
|Perl JSON<br />
|JSON<br />
|Wird von einigen Modulen benötigt, z.B. harmony, iTunes<br />
|<code>sudo apt-get install libjson-perl</code><br />
|-<br />
|Samba-Server<br />
|samba<br />
|Mittels Samba kann man z.B. den Ordner /opt/fhem als Share freigeben. Dieser Share kann z.B. im Windows-Explorer als Laufwerk verbunden werden, so dass die Bearbeitung von config- und Programmdateien bequem möglich ist. Hier eine hilfreiche [https://www.elektronik-kompendium.de/sites/raspberry-pi/2007071.htm Kurzanleitung] aus der (wenn man auf einen speziellen user verzichtet) nur die Einträge für smb.conf gesetzt werden müssen.<br />
|<code>sudo apt-get install samba cifs-utils</code><br />
Danach muss der share definiert werden mittels<br />
<br />
<code>sudo nano /etc/samba/smb.conf</code><br />
|-<br />
|Mailversand<br />
|sendemail (alt: sendEmail)<br />
|Wird benötigt, um Mails versenden zu können, bspw. für Alarm-Benachrichtigungen.<br />
Nach Installation des Paketes benötigt man noch eine Routine in FHEM gemäß [[E-Mail senden#Raspberry Pi]]<br />
|<code>sudo apt-get install sendemail</code> bzw. <code>sudo apt-get install sendEmail</code><br />
|-<br />
|Wake-on-LAN<br />
|etherwake<br />
|Wird z.B. für das Modul WOL benötigt.<br />
|<code>sudo apt-get install etherwake</code><br />
|-<br />
|Perl Telnet<br />
|telnet<br />
|Wurde vor Fritz!OS 6.2x z.B. für das Modul [[FRITZBOX]] benötigt, da es eine im Netzwerk vorhandene Fritzbox über deren Telnet-Port ansprach. Mittlerweile wird TR-64 und SOAP verwendet.<br />
|<code>sudo apt-get install libnet-telnet-perl</code><br />
|-<br />
|Socat<br />
|socat<br />
|Kann verwendet werden, um auf anderen Rechnern im Netzwerk Linux-Befehle oder Skripts auszuführen. Auch können auf Slave-FHEM-Installationen Befehl ausgeführt werden, z.B. mit <br />
<br />
<code><nowiki>system("echo 'set lampe on' | /usr/bin/socat - TCP:1.2.3.4:7072");</nowiki></code><br />
<br />
1.2.3.4 muss natürlich durch die IP-Adresse des Zielrechners ersetzt werden.<br />
|<code>sudo apt-get install socat</code><br />
|-<br />
|Libcrypt<br />
|Libcrypt<br />
|Perl libcrypt, erforderlich falls Homematic-devices mit AES verwendet werden sollen.<br />
|<code>sudo apt-get install libcrypt-rijndael-perl</code><br />
|-<br />
|libdatetime<br />
|libdatetime<br />
|Perl libdatetime, erforderlich für das Weather-Modul.<br />
|<code>sudo apt-get install libdatetime-format-strptime-perl</code><br />
|-<br />
|EnOcean XML functions<br />
|libxml simple<br />
|Perl XML::SIMPLE, erforderlich für die XML Funktionen des ENOCEAN Moduls.<br />
|<code>sudo apt-get install libxml-simple-perl</code><br />
|-<br />
|EnOcean Cryptographic functions<br />
|libcrypt-random-source-perl<br />
|Perl Crypt::Random, erforderlich für die Cryptographic Funktionen des ENOCEAN Moduls.<br />
|<code>sudo /usr/bin/perl -MCPAN -e 'install Crypt::Random'</code><br />
|}<br />
<br />
== Bekannte Probleme ==<br />
=== Netzteil ===<br />
Der RPi verwendet ein USB Netzteil als Spannungsversorgung. Gemessen kann der RPi allein bereits um die 900mA Strom fordern. Das bringt kleine Netzteile, besonders wenn noch CULs oder WLAN Sticks an USB hängen schnell an die Grenze. Die Fehler die daraus resultieren sind Abstürze, Netzwerkprobleme uvm. Daher bitte ein ausreichend starkes Netzteil mit mind. 2000mA oder einen aktiven USB-HUB für die Periperie verwenden.<br />
<br />
=== Kabel (Micro-USB) ===<br />
Auch das verwendete Kabel kann einen (großen) Unterschied machen. Billige Kabel haben sehr dünne Kupferadern, die auf größeren Strecken (bereits ab 30cm!) einen Spannungsabfall verursachen können, der sonst nicht nachvollziehbare Probleme (Festplattenausfall, SD-Kartenausfall etc.) auslöst. Siehe beispielsweise diesen Thread mit einer Tabelle, die die Höhe des Spannungsabfalls explizit beschreibt: [https://forum.fhem.de/index.php/topic,127508.0.html Link zum Forum] <br />
<br />
=== Echtzeituhr ===<br />
Der RPi hat keine [http://de.wikipedia.org/wiki/Echtzeituhr Real-Time-Clock] (RTC), das heißt, dass er nach einem Neustart keine gültige (im Sinne von aktuell) Systemzeit hat, sondern ein Datum in der Vergangenheit. Dieses Problem wird sinnvollerweise mit einer [http://de.wikipedia.org/wiki/Network_Time_Protocol NTP-Konfiguration] oder durch [[Raspberry Pi: RTC Hat|Installation einer Echtzeituhr]] umgangen.<br />
<br />
Dabei muss Sorge getragen werden, dass der [http://wiki.debian.org/NTP ntpd] schon einen Datums-/Zeitabgleich gemacht hat, bevor FHEM gestartet wird. Geschieht der Abgleich nicht vorher, sondern erst nachdem FHEM schon läuft, stellt FHEM die Logs zwar auf das nun aktuelle Datum um (die "alten" Logs mit dem eigentlich ungültigen Datum werden natürlich behalten), aber irgendetwas scheint FHEM dabei so zu belasten, dass es eine Last von über 0.8 bis 0.9 erzeugt. Diese Last besteht auf Dauer und verschwindet erst, wenn man das Ganze sauber durchkonfiguriert und FHEM neu gestartet hat. Die hohe Systemauslastung zeigt sich auch in einem sehr trägen Laden der FHEM-Webseiten in einem beliebigen Browser. (siehe {{Link2Forum|Topic=70741}})<br />
<br />
=== Last durch Backup (während update) ===<br />
Bei einen [[Update]] von FHEM durch den Befehl <code>update</code> kann durch Setzen des Attributs "<code>attr global backup_before_update 1</code>" automatisch vorab ein [[Backup]] durchgeführt werden. Die (ggf. großen) Log-Dateien werden dabei ebenfalls archiviert. Während der Archivierung ist FHEM blockiert. Durch die beschränkte Leistungsfähigkeit des Raspberry Pi kann das Backup zudem lange dauern. Durch ein "<code>attr global updateInBackground 1</code>" wird ein Backup im Hintergrund ausgeführt (Quelle: {{Link2Forum|Topic=15729}}). <br />
<br />
Alternative Möglichkeiten: <br />
* Backup ausschalten und manuell durchführen <br />
* Backup-Befehl anpassen und so große Dateien bzw. Verzeichnisse (log/) nicht archivieren<br />
<br />
== Watchdog einrichten ==<br />
Man kann den RPi regelmäßig prüfen lassen, ob FHEM noch läuft und gegebenenfalls einen Neustart durchführen lassen. Eine mögliche Vorgehensweise ist in diesem {{Link2Forum|Topic=20553|LinkText=Forumsthema}} beschrieben.<br />
{{Hinweis|Statt des Einsatzes derartiger Methoden ist zu empfehlen, nach der eigentliche Fehlerursache zu forschen und diese abzustellen. Haben Sie dennoch einen solchen Watchdog eingerichtet, sollten Sie bei Fragen zu Ihnen seltsam erscheinenden Phänomänen im Forum darauf hinweisen, auch wenn die Symptome scheinbar nichts mit dem Watchdog zu tun haben sollten.}}<br />
<br />
== Interne Links ==<br />
* [[CUL am Raspberry Pi flashen]]<br />
* [[Raspberry Pi und 1-Wire]]<br />
<br />
== Externe Links ==<br />
* {{Link2Forum|Topic=33460|Message=264679}} zum Umzug von Raspberry B auf Raspberry Pi 2<br />
* [http://www.raspberrypi.org/ Offizielle Webseite der Raspberry Pi Foundation]<br />
* [http://www.raspberrypi.org/downloads Offizielle Downloads der Raspberry Pi Foundation]<br />
<br />
[[Kategorie:Raspberry Pi]]<br />
[[Kategorie:HOWTOS]]</div>Otto123http://wiki.fhem.de/w/index.php?title=Raspberry_Pi&diff=39181Raspberry Pi2024-03-17T11:42:29Z<p>Otto123: /* Verwendung UART für Zusatzmodule */ Link zur UART Doku eingebaut</p>
<hr />
<div>Beim [[Raspberry Pi]] handelt es sich um einen postkartengroßen Einplatinen-Computer, der von der Raspberry Pi Foundation entwickelt wird. Die Hardware basiert auf dem BCM 283x SoC (System-on-Chip) von Broadcom, einem ARM-Prozessor. Zu Hardwaredetails und den verschiedenen Modellen sowie Produktentwicklungen siehe [http://de.wikipedia.org/wiki/Raspberry_Pi#Hardware Wikipedia].<br />
Dank der kleinen Abmessungen, dem recht geringen Energieverbrauch (bis ca. 4 Watt) sowie der günstigen Anschaffungskosten (ca. 30€) ist der Raspberry Pi eine attraktive Hardware für die Heimautomatisierung mit FHEM. Er ist dank dem Linux-Betriebssystem vollständig kompatibel zur aktuell vorhandenen und von FHEM unterstützen Hardware. Das derzeit empfohlene Standard-Image zum Betrieb des Raspberry Pi ist die auf Debian basierende Raspberry Pi OS Distribution (ab Mitte 2019 ''Buster'').<br />
<br />
== Installation / Setup ==<br />
=== Betriebssystem ===<br />
====Vorbemerkung====<br />
Raspberry Pi OS ist direkt bei raspberrybi.org unter https://www.raspberrypi.org/downloads/raspberry-pi-os/ herunterladbar. Die folgende Anleitung gilt für die lite-Version ohne grafischen Desktop und für die Modelle für B, B+, B2, B3, B3+, Zero W. (Stand Juni 2018)<br />
<br />
Alle in diesem Abschnitt verwendeten Code Blöcke benötigen root Rechte. Deshalb bitte immer am Besten im Kontext <code>sudo su</code> ausführen. Man kann auch einzelne Befehle mit sudo davor ausführen, allerdings wird die Berechtigung bei Pipe Befehlen nicht durchgereicht. Einige dieser Kommandos funktionieren in der angegebenen Form nicht unter der Wheezy-Version [https://en.wikipedia.org/wiki/Raspberry_Pi_OS#Release_history] des RPi OS. Läuft der betreffende RPi noch unter Wheezy, ist ein Upgrade des RPi OS empfehlenswert.<br />
<br />
Alle Dateien müssen im Linux-Format (nur LF als Zeilenende) erzeugt/editiert werden! Unbedingt einen geeigneten Editor verwenden und auf das Format beim Speichern achten!<br />
<br />
====SD-Karte vorbereiten====<br />
Die heruntergeladene Datei muss entpackt und auf die Speicherkarte geschrieben werden. Es gibt dazu verschiedene Tools je nach Betriebssystem. Für Windows ist windisk32imager zu empfehlen, Projektseite [https://sourceforge.net/projects/win32diskimager/]. Für Mac OS gibt es den Pi Filler.<br />
<br />
Detaillierte Anleitungen zur Vorgehensweise finden sich für die Betriebssysteme Linux, Mac OS und Windows unter [https://www.raspberrypi.org/documentation/installation/installing-images/README.md Writing an image to the SD card]<br />
<br />
Die SD Card enthält nun zwei Partitionen/Laufwerke, wobei das erste Laufwerk unter alle Betriebssystemen lesbar ist. In diesem Laufwerk (/boot) müssen jetzt noch zwei Dateien erzeugt werden:<br />
* eine leere Datei mit dem Namen ssh, um den (headless) Zugriff per ssh zu ermöglichen (Pi Filler macht dies automatisch). Hinweis: Eine spätere Aktivierung von SSH ist mit <code>sudo raspi-config</code> (Punkt 5 "Interfacing Options", dann Punkt 2 SSH) möglich, erfordert dann aber Tastatur und Monitor am RPi.<br />
* eine Textdatei im Linux Format mit Namen wpa_supplicant.conf und folgendem Inhalt, wenn der Pi sofort mit WLAN starten soll.<br />
<br />
<pre>country=DE<br />
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev<br />
update_config=1<br />
network={<br />
ssid="FRITZ!Box 7490"<br />
psk="12345678901234567890" <br />
}<br />
</pre><br />
* SD Karte auswerfen.<br />
* SD Karte in Raspberry Pi stecken und booten.<br />
<br />
Alternativ kann auch Monitor und Tastatur verwendet werden.<br />
<br />
====Anmeldung und Grundkonfiguration====<br />
Default raspberrypi-os: Host raspberrypi, User pi, Passwort raspberry <br />
<br />
Default ubuntu: Host ubuntu, User ubuntu, Passwort ubuntu<br />
<br />
Anmeldung entweder lokal oder mit dem Befehl: ssh <user>@<hostname><br />
<br />
Das Passwort sollte geändert werden, dazu dem Sicherheitshinweis folgen und <code>passwd</code> eingeben.<br />
<br />
Alle unten genannten Befehle müssen mit erhöhten Rechten ausgeführt werden (z. B. sudo)!<br />
<br />
Als Erstes sollte: Zeitzone, Sprache und Hostname angepasst werden. <br />
Entweder Menügeführt mit <code>sudo raspi-config</code> <br />
oder per Script / Shell Befehle:<br />
<br />
<syntaxhighlight lang="bash"># Zeitzone einstellen & Zeitsynchronisierung über das Internet aktivieren<br />
timedatectl set-timezone Europe/Berlin<br />
timedatectl set-ntp true<br />
<br />
# Konfigurieren lokale Sprache deutsch<br />
sed -i -e 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/' /etc/locale.gen<br />
locale-gen<br />
localectl set-locale LANG=de_DE.UTF-8 LANGUAGE=de_DE<br />
<br />
# Hostname <br />
hostnamectl set-hostname mymachine<br />
<br />
# System aktualisieren <br />
apt-get update<br />
apt-get upgrade<br />
<br />
#Neustart<br />
reboot</syntaxhighlight><br />
<br />
Am Anfang sollte man Befehle nicht verketten, sondern immer auf die Ausgabe warten (es sei denn, man hat Erfahrung): also kein <code>apt-get update && apt-get upgrade </code>. Ebenso sollte man nicht mit automatischen Bestätigungen arbeiten, also kein upgrade mit "-y". Nach einer Installation ist ein aufräumen immer gut, also:<br />
<syntaxhighlight lang="bash"><br />
apt-get autoremove<br />
apt-get clean<br />
apt-get purge $(dpkg --get-selections | grep deinstall | cut -f1 | xargs)<br />
</syntaxhighlight><br />
<br />
====Verwendung UART für Zusatzmodule====<br />
Einige Aufsteckmodule (z.B. HM-MOD-RPI-PCB) für den GPIO Port verwenden die serielle Schnittstelle UART. Der Zugriff auf diese serielle Schnittstelle erfordert eine modellabhängige Konfiguration. Siehe auch [https://www.raspberrypi.com/documentation/computers/configuration.html Raspberry Pi Dokumentation]<br />
<br />
Bei allen Modellen muss die Verwendung der seriellen Linux console an ttyAMA0 deaktiviert werden:<br />
<syntaxhighlight lang="bash"># seriell-getty Dienst für ttyAMA0 dauerhaft deaktivieren<br />
systemctl stop serial-getty@ttyAMA0.service<br />
systemctl disable serial-getty@ttyAMA0.service<br />
systemctl mask serial-getty@ttyAMA0.service<br />
</syntaxhighlight><br />
Bei den Modellen mit Bluetooth muss die UART aktiviert und umkonfiguriert werden. Hier ein bash Script, welches die Originaldatei entsprechend modifiziert:<br />
{{Randnotiz|RNTyp=Info|RNText=Im aktuellen RaspberryPi OS Bookworm Image ist die config.txt in den Pfad /boot/firmware gewandert. Es existiert aber ein Link, man kann arbeiten wie bisher.}}<syntaxhighlight lang="bash"><br />
# serielle Schnittstelle aktivieren und mit BT Schnittstelle tauschen<br />
# für Raspberry Pi OS<br />
config="/boot/config.txt"<br />
# für Ubuntu<br />
#config="/boot/firmware/usercfg.txt"<br />
<br />
bash -c "cat <<EOF >> $config<br />
enable_uart=1<br />
dtoverlay=miniuart-bt<br />
core_freq=250<br />
EOF"<br />
</syntaxhighlight><br />
Wer dem nicht traut, der editiert die Datei von Hand (Linux Editor!) und fügt am Ende die drei Zeilen aus dem Script ein, die vor EOF stehen.<br />
<br />
Die config Datei von ubuntu verwendet den Befehl include usercfg.txt. Mit Erscheinen des Pi 4 wurden die overlay Dateien umbenannt (Start mit Pi3- entfernt) die alten Namen funktionieren aber noch.<br />
<br />
Um die Konfiguration abzuschließen ist ein Neustart erforderlich<br />
<syntaxhighlight lang="bash">#Neustart erforderlich <br />
reboot</syntaxhighlight><br />
<br />
====Troubleshooting====<br />
{{Randnotiz|RNTyp=r|RNText=Das hat sich mit RaspberryPI OS Bookworm geändert, aktuell wird darüber ab {{Link2Forum|Topic=135864|Message=1294588|LinkText=diesem Forenbeitrag}} diskutiert.}} <br />
'''Kontrolle der seriellen Schnittstelle'''<br />
<br />
Der Befehl <code>ls -l /dev/ttyAMA0</code> muss folgende Ausgabe liefern.<br />
crw-rw---- 1 root dialout 204, 64 Jun 7 22:56 /dev/ttyAMA0<br />
Sollte dies nicht der Fall sein, muss der Dienst serial-getty@ttyAMA0.service deaktiviert werden!<br />
<br />
Kontrolle der Verlinkung von /dev/serial*<br />
<br />
Der Befehl <code>ls -l /dev/serial*</code> muss folgende Ausgabe liefern.<br />
* Bei Modellen mit BT und richtiger Konfiguration (funktioniert nur unter Raspberry Pi OS)<br />
lrwxrwxrwx 1 root root 7 Jun 7 22:55 /dev/serial0 -> ttyAMA0<br />
lrwxrwxrwx 1 root root 5 Jun 7 22:55 /dev/serial1 -> ttyS0<br />
* Bei den Modellen ohne BT und richtiger Konfiguration<br />
lrwxrwxrwx 1 root root 7 Jun 8 18:30 /dev/serial0 -> ttyAMA0<br />
Sollte das nicht der Fall sein, sind die Einträge in der /boot/config.txt fehlerhaft. <br />
<br />
Sollte die serielle Schnittstelle unerwartet nicht funktionieren, kann auch andere Software daran Schuld sein, weil diese einfach versucht, alle Schnittstellen abzufragen / zu initialisieren. Für die Fehlersuche ist es also wichtig zu wissen, welche Software so installiert wurde, speziell wenn diese serielle Schnitttstellen (USB) verwendet / verwenden will. Ein Beispiel (deconz/conbee) wird in {{Link2Forum|Topic=116428|Message=1107317|LinkText=diesem Forenbeitrag}} behandelt. <br />
<br />
Bei einem Raspberry 4 stört unter Umständen die Temperaturkontrolle des Lüfters, siehe auch Abschnitt bekannte Probleme: [[HM-MOD-RPI-PCB HomeMatic Funkmodul für Raspberry Pi]]. <br />
<br />
'''Kontrolle Bluetooth'''<br />
<br />
Die Funktion von Bluetooth kann mit dem hcitool überprüft werden. Mit <code>hcitool dev</code> wird das interne BT Gerät mit MAC Adresse angezeigt. Mit <code>hcitool scan</code> bzw. <code>hcitool lescan</code> kann nach sichtbaren Geräten gesucht werden.<br />
<br />
Weitergehende Informationen zur Anpassung der Konfiguration von Raspberry Pi OS sind nachzulesen auf https://www.raspberrypi.org/documentation/configuration/.<br />
<br />
Sollte die Bluetooth Schnittstelle nach der Installation von FHEM nicht funktionieren, hilft es den Dienst abhängig zu starten, siehe diesen Wiki Artikel [[Fhem.service (systemd unit file)]] <br />
<br />
=== FHEM ===<br />
Die Installation von FHEM kann nach der Raspberry Pi OS Installation sehr einfach über das Debian-Repository [http://debian.fhem.de] erfolgen. <br />
* Es wird unbedingt empfohlen zur Grundinstallation zunächst keine Module, USB Sticks oder ähnliche Zusatzbaugruppen an den IO Ports des Raspberry gesteckt zu haben. <br />
* Dieser Abschnitt beschreibt nur die Grundinstallation von FHEM auf einem Raspberry Pi mit Raspberry Pi OS! <br />
* Weitere Installationsschritte sind je nach verwendeten FHEM-Modulen notwendig. <br />
** Informationen hierzu liefert üblicherweise die {{Link2CmdRef}} zum jeweiligen Modul.<br />
** Den weiteren Einstieg in FHEM findet man im Artikel [[Quick-Start]]<br />
<br />
==== Der einfache Weg zum aktuellen System ====<br />
Der folgende Befehlsblock ist die praktische Umsetzung der Beschreibung auf http://debian.fhem.de. Bitte unbedingt vor Installation rückversichern, ob es dort (insbesondere unter ''The easy way: use apt-get'') Aktualisierungen gab. <br />
* Dieser Befehlsblock erfordert erhöhte Rechte, also bitte als Erstes <code>sudo su</code> ausführen!<br />
* Beim Kopieren aufpassen! Jede Zeile muss einzeln ausgeführt werden!<br />
Dieser Befehlsblock gilt ab der Version ''debian buster'' als veraltet (es gibt Sicherheitsbedenken), muss aber bis einschließlich ''debian stretch'' eingesetzt werden.<br />
<syntaxhighlight lang="bash"><br />
# von debian.fhem.de installieren - siehe aktuelle Anleitung dort https://debian.fhem.de/<br />
wget -qO - https://debian.fhem.de/archive.key | apt-key add -<br />
echo "deb http://debian.fhem.de/nightly/ /" >> /etc/apt/sources.list<br />
apt-get update<br />
apt-get install fhem<br />
</syntaxhighlight><br />
Dieser Befehlsblock funktioniert erst ab ''debian buster'' (erfordert erhöhte Rechte <code>sudo su</code>)<br />
<syntaxhighlight lang="bash"><br />
# Bei manchen debian Distributionen fehlt das Paket gpg -> nachinstallieren<br />
apt update<br />
apt install gpg<br />
# von debian.fhem.de installieren - siehe aktuelle Anleitung dort https://debian.fhem.de/<br />
wget -O- https://debian.fhem.de/archive.key | gpg --dearmor > /usr/share/keyrings/debianfhemde-archive-keyring.gpg<br />
echo "deb [signed-by=/usr/share/keyrings/debianfhemde-archive-keyring.gpg] https://debian.fhem.de/nightly/ /" >> /etc/apt/sources.list<br />
apt update<br />
apt install fhem<br />
</syntaxhighlight><br />
<br />
==== Das offizielle Release ====<br />
Man kann FHEM mit dem Debian-Paket von [https://fhem.de/#Installation fhem.de] installieren. Dieser Weg führt zu einem offiziellen Release, welches aber unter Umständen erheblich vom aktuellen Versions- und Diskussionsstand im Forum abweicht. <br />
<br />
Alternativ kann man auch den manuellen Weg von https://debian.fhem.de/ wählen.<br />
<br />
==== Empfohlener Patch ====<br />
Da gerade auf dem Raspberry die automatische Erkennung der USB Schnittstellen zu 100% CPU Last führt (FHEM träge und reagiert nicht), wird empfohlen sofort nach der Installation noch diesen "Patch" auszuführen: FHEM starten, wenn alle USB-Geräte ausgesteckt sind. Dann <code>attr initialUsbCheck disable 1</code> in der Kommandozeile in FHEMWEB eingeben, <code>save</code> ausführen und FHEM anschließen wieder mit eingesteckten USB-Geräten neu starten.<br />
<br />
==== Deinstallation ====<br />
Man kann FHEM auch wieder spurlos vom System entfernen und ganz von vorn beginnen. Allerdings sollte man sich im Klaren sein, damit ensteht kein jungfräuliches System!<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get purge fhem<br />
sudo apt-get autoremove<br />
</syntaxhighlight><br />
<br />
=== Zusatzpakete bei FHEM-Erst- und Zweitinstallation ===<br />
Nachdem der RPi eingerichtet ist, können weitere Pakete installiert werden. Keines davon ist zwingend erforderlich, um das Grundgerüst von FHEM betreiben zu können. Einige Pakete erhöhen aber den Bedienungskomfort, andere sind zur Nutzung bestimmter weiterer FHEM-Module (siehe {{Link2CmdRef}}) erforderlich. <br />
<br />
Hierzu wurden in letzter Zeit mehrere Hilfsmodule entwickelt, die insbesondere bei Wiederinstallation (etwa nach Absturz) wichtig sein können. So zeigt das Modul Installer die installierten Perl-Module an, siehe dazu {{Link2Forum|Topic=98381|LinkText=diesen Thread}}.<br />
<br />
Wenn man eine frühere Installation auf einer anderen SD-Karte installieren möchte und nicht mehr weiß, welche Zusatzpakete man auf der alten Karte installiert hatte, hilft (diese und nachfolgende Hinweise sind aus dem Blog [https://heinz-otto.blogspot.com/2019/07/infos-zur-installation-von-modulen-und.html])<br />
zcat $(ls -tr /var/log/apt/history.log.*.gz)|grep -A1 Start-Date<br />
weiter. Hier werden frühere Eingaben der Kommandozeile wiedergegeben. Es gibt einen analogen Befehl, um die mit CPAN installierten Pakete anzuzeigen. Dazu muss man das debian Paket perl-doc installiert haben und gibt dann ein<br />
for M in `perldoc -t perllocal|grep Module |sed -e 's/^.*" //'`; do V=`perldoc -t perllocal|awk "/$M/{y=1;next}y" |grep VERSION |head -n 1`; printf "%30s %s\n" "$M" "$V"; done |sort<br />
Ebenso kann man herausfinden, ob und durch welches debian-Paket das Perl-Paket installiert wurde. Die zweite Version sucht nur in Paketen die -perl im Namen tragen und läuft damit wesentlich schneller:<br />
s='Device::SerialPort' ## zu diesem Paket wird gesucht<br />
perl -M$s -e '' 2>/dev/null &&echo "Modul $s ist vorhanden"''<br />
for i in $(dpkg -l |grep ^ii| awk '{ print $2 }'|tr -d "\r"|tr "\n" " ");do if dpkg -L $i|grep $s &> /dev/null;then echo $i enthält $s;fi;done<br />
for i in $(dpkg -l |grep ^ii|grep '\-perl'| awk '{ print $2 }'|tr -d "\r"|tr "\n" " ");do if dpkg -L $i|grep $s &> /dev/null;then echo $i enthält $s;fi;done<br />
<br />
Es gibt gute Gründe, die Installation von Perl Modulen über debian-Pakete der Installation über cpan zu bevorzugen. Dazu zählt die Updatefähigkeit und die Geschwindigkeit. Man kann im Internet nach den Paketen suchen, man kann aber auch einfach die Verfügbarkeit für das lokale System testen. Dazu braucht man das Tool apt-file, welches man zuerst installieren muss. Der letzte Befehl lädt den Infocache lokal und dauert etwas:<br />
sudo apt-get update<br />
sudo apt-get install apt-file<br />
sudo apt-file update<br />
Die folgende Suche nutzt den Umstand, dass in der im Paket enthaltenen Liste der Dateien auch die Doku in der Form "/usr/share/man/man3/IO::File.3perl.gz" enthalten ist. Der search Befehl unten akzeptiert mehrere Modulnamen durch Zeilenumbruch getrennt. In dem Beispiel sind die Modulnamen in einem String durch Leerzeichen getrennt, die Trennung wird in Zeilenumbruch geändert, jede Zeile ergänzt und über stdin an den search Befehl von apt-file übergeben. Die Option -l bewirkt das nur die gefunden Pakete gelistet werden, werden mehrere der abgefragten Modulnamen in einem Paket gefunden, wird es nur einmal gelistet:<br />
s="IO::File Digest::MD5" ##Such-String<br />
echo $s|tr " " "\n"|sed 's/$/./;s/^/\//'|apt-file search -l -f -<br />
<br />
Zuletzt eine Übersicht diverser Zusatzpakete.<br />
{| class="wikitable"<br />
! style="width:10%" | Beschreibung<br />
! style="width:10%" | Paketname<br />
! style="width:50%" | Kontext<br />
! style="width:30%" | Installieren<br />
|-<br />
|Zeitserver<br />
|ntpdate<br />
|Setzt die Systemzeit bei Start des RPi. Wird für FHEM benötigt, da es sonst nicht startet.<br />
|<code>sudo apt-get install ntpdate<br />
sudo ntpdate -u de.pool.ntp.org</code><br />
|-<br />
|Perl JSON<br />
|JSON<br />
|Wird von einigen Modulen benötigt, z.B. harmony, iTunes<br />
|<code>sudo apt-get install libjson-perl</code><br />
|-<br />
|Samba-Server<br />
|samba<br />
|Mittels Samba kann man z.B. den Ordner /opt/fhem als Share freigeben. Dieser Share kann z.B. im Windows-Explorer als Laufwerk verbunden werden, so dass die Bearbeitung von config- und Programmdateien bequem möglich ist. Hier eine hilfreiche [https://www.elektronik-kompendium.de/sites/raspberry-pi/2007071.htm Kurzanleitung] aus der (wenn man auf einen speziellen user verzichtet) nur die Einträge für smb.conf gesetzt werden müssen.<br />
|<code>sudo apt-get install samba cifs-utils</code><br />
Danach muss der share definiert werden mittels<br />
<br />
<code>sudo nano /etc/samba/smb.conf</code><br />
|-<br />
|Mailversand<br />
|sendemail (alt: sendEmail)<br />
|Wird benötigt, um Mails versenden zu können, bspw. für Alarm-Benachrichtigungen.<br />
Nach Installation des Paketes benötigt man noch eine Routine in FHEM gemäß [[E-Mail senden#Raspberry Pi]]<br />
|<code>sudo apt-get install sendemail</code> bzw. <code>sudo apt-get install sendEmail</code><br />
|-<br />
|Wake-on-LAN<br />
|etherwake<br />
|Wird z.B. für das Modul WOL benötigt.<br />
|<code>sudo apt-get install etherwake</code><br />
|-<br />
|Perl Telnet<br />
|telnet<br />
|Wurde vor Fritz!OS 6.2x z.B. für das Modul [[FRITZBOX]] benötigt, da es eine im Netzwerk vorhandene Fritzbox über deren Telnet-Port ansprach. Mittlerweile wird TR-64 und SOAP verwendet.<br />
|<code>sudo apt-get install libnet-telnet-perl</code><br />
|-<br />
|Socat<br />
|socat<br />
|Kann verwendet werden, um auf anderen Rechnern im Netzwerk Linux-Befehle oder Skripts auszuführen. Auch können auf Slave-FHEM-Installationen Befehl ausgeführt werden, z.B. mit <br />
<br />
<code><nowiki>system("echo 'set lampe on' | /usr/bin/socat - TCP:1.2.3.4:7072");</nowiki></code><br />
<br />
1.2.3.4 muss natürlich durch die IP-Adresse des Zielrechners ersetzt werden.<br />
|<code>sudo apt-get install socat</code><br />
|-<br />
|Libcrypt<br />
|Libcrypt<br />
|Perl libcrypt, erforderlich falls Homematic-devices mit AES verwendet werden sollen.<br />
|<code>sudo apt-get install libcrypt-rijndael-perl</code><br />
|-<br />
|libdatetime<br />
|libdatetime<br />
|Perl libdatetime, erforderlich für das Weather-Modul.<br />
|<code>sudo apt-get install libdatetime-format-strptime-perl</code><br />
|-<br />
|EnOcean XML functions<br />
|libxml simple<br />
|Perl XML::SIMPLE, erforderlich für die XML Funktionen des ENOCEAN Moduls.<br />
|<code>sudo apt-get install libxml-simple-perl</code><br />
|-<br />
|EnOcean Cryptographic functions<br />
|libcrypt-random-source-perl<br />
|Perl Crypt::Random, erforderlich für die Cryptographic Funktionen des ENOCEAN Moduls.<br />
|<code>sudo /usr/bin/perl -MCPAN -e 'install Crypt::Random'</code><br />
|}<br />
<br />
== Bekannte Probleme ==<br />
=== Netzteil ===<br />
Der RPi verwendet ein USB Netzteil als Spannungsversorgung. Gemessen kann der RPi allein bereits um die 900mA Strom fordern. Das bringt kleine Netzteile, besonders wenn noch CULs oder WLAN Sticks an USB hängen schnell an die Grenze. Die Fehler die daraus resultieren sind Abstürze, Netzwerkprobleme uvm. Daher bitte ein ausreichend starkes Netzteil mit mind. 2000mA oder einen aktiven USB-HUB für die Periperie verwenden.<br />
<br />
=== Kabel (Micro-USB) ===<br />
Auch das verwendete Kabel kann einen (großen) Unterschied machen. Billige Kabel haben sehr dünne Kupferadern, die auf größeren Strecken (bereits ab 30cm!) einen Spannungsabfall verursachen können, der sonst nicht nachvollziehbare Probleme (Festplattenausfall, SD-Kartenausfall etc.) auslöst. Siehe beispielsweise diesen Thread mit einer Tabelle, die die Höhe des Spannungsabfalls explizit beschreibt: [https://forum.fhem.de/index.php/topic,127508.0.html Link zum Forum] <br />
<br />
=== Echtzeituhr ===<br />
Der RPi hat keine [http://de.wikipedia.org/wiki/Echtzeituhr Real-Time-Clock] (RTC), das heißt, dass er nach einem Neustart keine gültige (im Sinne von aktuell) Systemzeit hat, sondern ein Datum in der Vergangenheit. Dieses Problem wird sinnvollerweise mit einer [http://de.wikipedia.org/wiki/Network_Time_Protocol NTP-Konfiguration] oder durch [[Raspberry Pi: RTC Hat|Installation einer Echtzeituhr]] umgangen.<br />
<br />
Dabei muss Sorge getragen werden, dass der [http://wiki.debian.org/NTP ntpd] schon einen Datums-/Zeitabgleich gemacht hat, bevor FHEM gestartet wird. Geschieht der Abgleich nicht vorher, sondern erst nachdem FHEM schon läuft, stellt FHEM die Logs zwar auf das nun aktuelle Datum um (die "alten" Logs mit dem eigentlich ungültigen Datum werden natürlich behalten), aber irgendetwas scheint FHEM dabei so zu belasten, dass es eine Last von über 0.8 bis 0.9 erzeugt. Diese Last besteht auf Dauer und verschwindet erst, wenn man das Ganze sauber durchkonfiguriert und FHEM neu gestartet hat. Die hohe Systemauslastung zeigt sich auch in einem sehr trägen Laden der FHEM-Webseiten in einem beliebigen Browser. (siehe {{Link2Forum|Topic=70741}})<br />
<br />
=== Last durch Backup (während update) ===<br />
Bei einen [[Update]] von FHEM durch den Befehl <code>update</code> kann durch Setzen des Attributs "<code>attr global backup_before_update 1</code>" automatisch vorab ein [[Backup]] durchgeführt werden. Die (ggf. großen) Log-Dateien werden dabei ebenfalls archiviert. Während der Archivierung ist FHEM blockiert. Durch die beschränkte Leistungsfähigkeit des Raspberry Pi kann das Backup zudem lange dauern. Durch ein "<code>attr global updateInBackground 1</code>" wird ein Backup im Hintergrund ausgeführt (Quelle: {{Link2Forum|Topic=15729}}). <br />
<br />
Alternative Möglichkeiten: <br />
* Backup ausschalten und manuell durchführen <br />
* Backup-Befehl anpassen und so große Dateien bzw. Verzeichnisse (log/) nicht archivieren<br />
<br />
== Watchdog einrichten ==<br />
Man kann den RPi regelmäßig prüfen lassen, ob FHEM noch läuft und gegebenenfalls einen Neustart durchführen lassen. Eine mögliche Vorgehensweise ist in diesem {{Link2Forum|Topic=20553|LinkText=Forumsthema}} beschrieben.<br />
{{Hinweis|Statt des Einsatzes derartiger Methoden ist zu empfehlen, nach der eigentliche Fehlerursache zu forschen und diese abzustellen. Haben Sie dennoch einen solchen Watchdog eingerichtet, sollten Sie bei Fragen zu Ihnen seltsam erscheinenden Phänomänen im Forum darauf hinweisen, auch wenn die Symptome scheinbar nichts mit dem Watchdog zu tun haben sollten.}}<br />
<br />
== Interne Links ==<br />
* [[CUL am Raspberry Pi flashen]]<br />
* [[Raspberry Pi und 1-Wire]]<br />
<br />
== Externe Links ==<br />
* {{Link2Forum|Topic=33460|Message=264679}} zum Umzug von Raspberry B auf Raspberry Pi 2<br />
* [http://www.raspberrypi.org/ Offizielle Webseite der Raspberry Pi Foundation]<br />
* [http://www.raspberrypi.org/downloads Offizielle Downloads der Raspberry Pi Foundation]<br />
<br />
[[Kategorie:Raspberry Pi]]<br />
[[Kategorie:HOWTOS]]</div>Otto123http://wiki.fhem.de/w/index.php?title=HM-LC-SW1-FM_Schaltaktor_1-fach_UP&diff=39150HM-LC-SW1-FM Schaltaktor 1-fach UP2024-03-01T13:02:40Z<p>Otto123: /* Links */</p>
<hr />
<div>Homematic Funk-Schaltaktor 1-fach (Unterputz)<br />
{{Infobox Hardware<br />
|Bild=HM-LC-SW1-FM.jpg<br />
|Bildbeschreibung=HomeMatic Funk-Schaltaktor<br />
|HWProtocol=HomeMatic<br />
|HWType=Aktor<br />
|HWCategory=HomeMatic<br />
|HWComm=868MHz<br />
|HWChannels=1<br />
|HWVoltage=230V AC<br />
|HWPowerConsumption=0,5W<br />
|HWPoweredBy=Netzspannung<br />
|HWSize=53x53x30mm<br />
|HWDeviceFHEM=[[CUL_HM]]<br />
|HWManufacturer=ELV / eQ-3<br />
}}<br />
== Features ==<br />
<br />
Schalten eines angeschlossenen Verbrauchers mittels [[CUL]]/[[CUN]]/[[HMLAN Konfigurator]] und über einen mechanischen spannungsfesten Taster. <br />
<br />
== Hinweise zur Hardware-Installation ==<br />
<br />
'''WICHTIG''': die Installation von Komponenten mit Netzspannung darf nur von Fachpersonal durchgeführt werden.<br />
<br />
Will man die Funk-Schaltaktoren auch manuell betreiben, d.h. man upgradet eine vorhandene Elektroinstallation, so sind Taster notwendig. Schalter können notfalls mittels einer zusätzlichen Feder zu Taster umgebaut werden, Tastschalter sind leider nicht geeignet. <br />
<br />
Aber auch bei Tastern kann es bei einer Tastenbetätigung >4 Sekunden passieren, dass der Aktor in den Anlernmodus versetzt wird und auch in diesem verbleibt oder bei einer erneuten Betätigung sogar zurückgesetzt wird. Dies kann durch eine einmalige Registermanipulation erreicht werden - danach ist der Anlernmodus nach einer kurzen Zeit gesperrt, stattdessen stehen weitere Schaltfunktionen über einen langen Tastendruck zur Verfügung, wie es auch mit verknüpften externen Tastern möglich ist. Details zu dem Eingriff sind [[HomeMatic Register programmieren#confBtnTime - Kurz oder lang und der Konfigurationsmodus|hier]] zu finden.<br />
<br />
Je nach vorhandenen Schalterdosen empfiehlt es sich bestehende Schalterdosen nach hinten auszuweiten, d.h. die Abdeckung nach hinten heraus zu brechen, da die Aktoren und Kabel nicht gerade sparsam mit dem Platz umgehen. Alternativ könnte man den Aktor auch in eine zusätzliche Schalterdosen unterbringen und diese mit einem Federdeckel abschließen. Dies hat den Vorteil, dass man auch durch relativ dicke Tapete die LED und somit den Zustand des Aktors ablesen kann.<br />
<br />
Der Aktor kann auch gänzlich ohne Taster, also nur per ''set''-Befehlen durch FHEM oder per gepeerten Geräten gesteuert werden, jedoch muss zumindest für das Anlernen zeitweise ein Taster angeschlossen werden.<br />
<br />
== Hinweise zum Betrieb mit FHEM ==<br />
<br />
Das [[Pairing (HomeMatic)|Pairing]] sollte wie in [[HomeMatic Devices pairen]] beschrieben durchgeführt werden. Hierfür wird ein am Aktor temporär angeschlossener spannungsfester Taster zwingend benötigt.<br />
<br />
# Sicherstellen, dass ''autocreate'' aktiv ist<br />
# Am CUL/HMLAN o.ä. <code>set HMLAN hmPairForSec 60</code><br />
# Binnen 60 Sekunden Aktor in Anlernmodus bringen (Taster 4s festhalten bis LED blinkt) -> Device wird in fhem angelegt, z.B. als CUL_HM_HM_LC_SW1_FM_2BAD45<br />
# <code>rename <Aktor> <AktorNameNeu></code> -> richtigen Namen zuordnen<br />
<br />
=== FHEM Config-Auszug ===<br />
<br />
Ein exemplarischer Auszug aus der fhem.cfg:<br />
<br />
<pre><br />
define LichtTerasse CUL_HM 17AEA6<br />
attr LichtTerasse devInfo 010100<br />
attr LichtTerasse firmware 1.9<br />
attr LichtTerasse hmClass receiver<br />
attr LichtTerasse model HM-LC-SW1-FM<br />
attr LichtTerasse room Terasse<br />
attr LichtTerasse serialNr IEQ00xxxx<br />
attr LichtTerasse subType switch<br />
</pre><br />
<br />
=== Mögliche Schaltoperationen ===<br />
<br />
Der Aktor versteht folgende Aktionen:<br />
<pre><br />
set <name> on -> Schaltet den Aktor ein<br />
set <name> off -> Schaltet den Aktor aus<br />
set <name> toggle -> Ändert den Zustand des Aktors, d.h. ein eingeschalteter Aktor wird ausgeschaltet<br />
</pre><br />
<br />
=== Log-Auszug ===<br />
<br />
In FHEM ist nach dem Schalten des HM-LC-SW1-FM folgendes Log zu sehen:<br />
<pre><br />
2012.02.05 16:51:44 2: CUL_HM set LichtTerasse on<br />
2012.02.05 16:52:14 2: CUL_HM set LichtTerasse off<br />
2012.02.05 16:52:15 2: CUL_HM set LichtTerasse toggle<br />
</pre><br />
<br />
== Nützliches Zubehör ==<br />
<br />
Wer den Schaltaktor im Sicherungskasten selbst einbauen möchte, z.B. um einen Stromstossschalter zu ersetzen, dem kann folgendes Zubehör empfohlen werden: Hutschienengehäuse CNMB-4V-Kit, Bestellnr. 532659 bei conrad. Das ist zwar sicher auch nicht VdE-konform, aber besser wie ohne. Alternativ kann auch der [[HM-LC-Sw1-DR 1fach Schaltaktor Hutschiene]] zur direkten Montage auf Hutschienen eingesetzt werde.<br />
<br />
== Probleme ==<br />
<br />
Um den HM-LC-SW1-FM in den Anlernmodus zu versetzen, soll man lt. Anleitung den (temporär) angeschlossenen Taster für 4 Sekunden gedrückt halten. Falls dies bei Ihnen nicht funktioniert, so versuchen Sie den Taster einfach mal ca. 7 bis 8 Sekunden gedrückt zu halten (bis die LED des SW1-FM kurz aufleuchtet).<br />
<br />
Wenn das Pairing nicht komplett durchläuft (Device zeigt als Status MissingACK und kann nicht von FHEM aus gesteuert werden), dann hilft ggf. ein weiteres Pairing über hmPairSerial.<br />
<br />
== Links ==<br />
<br />
Ein Integrationsbeispiel ist in [[Jalousie und Beleuchtung in mehreren Räumen]] zu finden. <br />
<br />
[https://files2.elv.com/public/07/0767/076793/Internet/76793_um.pdf Anleitung (PDF)]<br />
<br />
[[Kategorie:HomeMatic Components]]<br />
[[Kategorie:Schalter (Empfänger)]]</div>Otto123http://wiki.fhem.de/w/index.php?title=ConBee&diff=38871ConBee2024-01-07T18:04:14Z<p>Otto123: /* Dokumentation und Setup */</p>
<hr />
<div>{{Todo|Noch zu vervollständigen und zu verlinken}}<br />
[[ConBee]] ist ein [[ZigBee]] USB Gateway ([[Interface]]), mit dem herstellerübergreifend ZigBee-Geräte bedient werden können. Unter der Bezeichnung RaspBee ist auch eine Variante als [[Raspberry Pi]] Modul erhältlich. Beide Geräte sind als ''ConBee II'' und ''RaspBee II'' in einer aktualisierten Version erhältlich. Im folgenden werden alle Version als ''ConBee'' bezeichnet und die Ausführungen gelten auch RaspBee; sofern es relevante Unterschiede gibt, wird das ausdrücklich erwähnt.<br />
{{Infobox Hardware<br />
|Bild=ConBee_II.jpg<br />
|Bildbeschreibung=dresden Electronik, ConBee II<br />
|HWProtocol=ZigBee<br />
|HWType=[[Interface]]<br />
|HWCategory=diverse Hersteller<br />
|HWComm=Funk 2.4 GHz<br />
|HWChannels=Zigbee Channel 11 15 20 25<br />
|HWVoltage=5V=<br />
|HWPowerConsumption=ca. 0,1 W<br />
|HWPoweredBy=USB<br />
|HWSize=40 x 17 x 8 (ohne USB Stecker)<br />
|HWDeviceFHEM=HUEBridge.pm, HUEDevice.pm<br />
|HWManufacturer=dresden elektronik, Vertrieb: [http://phoscon.de Phoscon] <br />
}}<br />
== Beschreibung ==<br />
Das ConBee Gateway benötigt/hat keine Cloud-Anbindung. Eine Liste der kompatiblen ZigBee Geräte und Hersteller findet sich [https://phoscon.de/de/conbee2/compatible hier].<br />
<br />
== Dokumentation und Setup ==<br />
* Offizielle deconz [https://phoscon.de/de/conbee/install Installationsanleitung] inklusive docker Installation. Das Ergebnis der Installation ist vom verwendeten System abhängig.<br />
* Beschreibung der Parameter findet man versteckt im [https://github.com/dresden-elektronik/deconz-rest-plugin/wiki/deCONZ-command-line-parameters deconz Rest-Plugin Wiki]<br />
Das Setup erzeugt auf einem Pi mit PiOS Lite sieben Services, die bis auf zwei alle disabled sind (<code>systemctl list-unit-files|grep deconz</code>).<br />
<br />
Um den minimalen Dienst (deconz) in Betrieb zu nehmen, sind noch folgende Schritte notwendig:<br />
# Optionale Konfiguration (empfohlen): serielle Schnittstelle und WEB-Port (Standard: 80) einstellen (siehe [[#Problembehebung|Problembehebung]])<br />
# Start und Test: <code>sudo systemctl start deconz</code>, mit dem Browser Zugriff auf Phoscon App testen: http://gatewayIP:Portnummer<br />
# Funktioniert alles, kann man den Service dauerhaft aktivieren: <code>sudo systemctl enable deconz</code><br />
'''Hinweise''': <br />
* Das Programm deCONZ verwendet die Hardwareschnittstelle und kann nicht mehrfach gestartet werden und dabei die gleiche Hardwareschnittstelle verwenden! <br />
* Es gibt eine Ungereimtheit in der Beschreibung des Parameters ''platform'': es scheint aktuell (April 2021) egal zu sein, ob man <code>-platform minimal</code> oder <code>--platform minimal</code> verwendet. <br />
* Beim deCONZ Aufruf empfiehlt es sich generell, den --dev= Parameter anzuhängen (siehe [[#Problembehebung|Problembehebung]]). <br />
* deconz.service und deconz-gui.service sind alternative Aufrufe der gleichen Binary - es kann nur einer von beiden Diensten gestartet werden. <br />
* Alternativ (nicht empfohlen) kann man das deconz Setup auf einem Desktop System ausführen und den Dienst deconz-gui konfigurieren und aktivieren. Der Zugriff auf die GUI erfolgt dann mit einem VNC Viewer (RealVNC bietet eine portable Version). <br />
* Wer eine einfache Konfiguration möchte und sich mit docker auskennt, kann die docker Variante wählen. <br />
Mit der Phoscon Web-App kann man <br />
* Das Gateway verwalten: Firmware, Backup/Restore, Zeitzone, Sprache<br />
* ZigBee Geräte anmelden und verknüpfen, Szenen einrichten ...<br />
* Applikationen mit dem Gateway verbinden, dazu zählt auch das HUEBridge Device von FHEM<br />
* Zugriff auf die alte WebApp erhalten (Hilfe Seite)<br />
Mit der deCONZ GUI kann man<br />
* Die Firmware der Geräte aktualisieren (OTA Plugin)<br />
* Das Zigbee Netzwerk visualisieren<br />
* EIne direkte Kommunikation zwischen zwei Geräten - Binding - einrichten<br />
* ... (noch vervollständigen)<br />
Um den Zugriff auf die deCONZ GUI zu erhalten, kann man '''X11 Forwarding''' verwenden, dazu braucht man nur einen X11 Server (Linux Desktop oder Windows VcXsrv, Xming; beides auf SourceForge.net verfügbar).<br />
<br />
Sieh dazu auch den Beitrag im [https://forum.fhem.de/index.php/topic,117470.msg1200344.html#msg1200344 Forum]<br />
<br />
Einzeiler für Linux Desktop : <code>ssh -X <user>@<host> "sudo systemctl stop deconz; deCONZ --dev=/dev/ttyACM0;sudo systemctl start deconz"</code><br />
<br />
Einzeiler für Windows 10 : <code>ssh -X <user>@<host> "export DISPLAY=%COMPUTERNAME%:0.0;sudo systemctl stop deconz; deCONZ --dev=/dev/ttyACM0;sudo systemctl start deconz"</code><br />
<br />
'''Tipp für Windows Einsteiger:''' <br />
* Programme wie den X11 Server muss man herunterladen und installieren.<br />
* Beispiel: VcXsrv wird gestartet mit xlaunch - alles Standard lassen nur im letzten Fenster: "disable access control" aktivieren<br />
* CMD Box aufmachen mit: Windows Taste + r und dann CMD enter. <br />
* Funktionstest <code>ssh -X pi@raspberrypi "export DISPLAY=%COMPUTERNAME%:0.0;xcalc"</code> <br />
<br />
=== Problembehebung ===<br />
'''Service'''<br />
<br />
deCONZ verwendet offenbar beim Start auch per default die Schnittstelle /dev/ttyAMA0 (raspbee Modul). Die Kommunikation eines dort steckenden anderen Moduls wird dabei gestört, die GUI reagiert eine Zeit lang nicht.<br />
<br />
Hat man andere Module an AMA0 (UART GPIO) oder an den Standard USB Schnittstellen (ACM0 usw.), muss der deCONZ Aufruf mit den richtigen Schnittstellen Parametern konfiguriert werden. <br />
<br />
Am zuverlässigsten ist es, die Definition per ID einzutragen. Der richtige Eintrag kann mit leicht abgefragt werden:<br />
<br />
<code>ls -lha /dev/serial/by-id</code><br />
<br />
Die Konfiguration der Dienste erfolgt mit dem systemctl Editor:<br />
<br />
<code>sudo systemctl edit --full deconz</code><br />
<br />
und die Zeile ExecStart um diesen Parameter ergänzen (Beispiel): <br />
<br />
<code>--dev=/dev/serial/by-id/usb-dresden_elektronik_ingenieurtechnik_GmbH_ConBee_II_DE1234567-if00</code> <br />
<br />
Grundsätzlich ist diese Art der Einbindung auch für [[Mehrere USB-Geräte einbinden|alle seriellen Geräte]] in FHEM dringend anzuraten, wenn andere Services wie deconz auf demselben Server betrieben werden.<br />
<br />
'''Docker'''<br />
<br />
Im docker run Aufruf verändert man den device Parameter aus der [https://github.com/marthoc/docker-deconz Original Dokumentation] am Einfachsten wie folgt:<br />
<br />
<code>--device=/dev/serial/by-id/usb-dresden_elektronik_ingenieurtechnik_GmbH_ConBee_II_DE1234567-if00:/dev/ttyACM0</code><br />
<br />
docker-compose.yml<syntaxhighlight lang="docker"><br />
devices:<br />
- /dev/serial/by-id/usb-dresden_elektronik_ingenieurtechnik_GmbH_ConBee_II_DE1234567-if00:/dev/ttyACM0<br />
</syntaxhighlight>Damit wird der Stick vom Host eindeutig mit serial/by-id eingebunden und im Container an der Standard Schnittstelle ttyACM0 bereitgestellt. <br />
<br />
'''X11 Server'''<br />
<br />
Sollte bei der Verbindung zum X11 Server die Fehlermeldung ''Authorization required'' kommen, kann man beim Start des VcXsrv Server einfach den Haken bei ''disable access control'' setzen.<br />
<br />
== Update in Docker Umgebung ==<br />
Das Update der PhosCon App erfolgt durch ein update des docker containers (Image neu ziehen und Container neu machen -> run bzw. compose up). <br />
<br />
Das Update der Firmware funktioniert nach dieser [https://github.com/marthoc/docker-deconz#updating-conbeeraspbee-firmware offiziellen Beschreibung].<br />
<br />
== Unterstützung in FHEM ==<br />
{{Randnotiz|RNTyp=g|RNText=Alternativ kann man das Model ConBee II auch als Interface für [[Zigbee2mqtt|zigbee2mqtt]] verwenden und dann die ZigBee-Geräte als [[MQTT2_DEVICE]] in FHEM einbinden.}} <br />
ConBee wird über das Modul [[Hue|HUEBridge]] und über die deCONZ Software, die Wireless Light Control WebApp und die Phoscon WebApp (kommt zusammen mit deConz) in FHEM eingebunden.<br />
<br />
Sensoren werden nicht automatisch erzeugt und müssen manuell angelegt werden. <br />
<br />
Tipps:<br />
* Die HUEBridge funktioniert (noch undokumentiert) auch mit Portangaben, falls nicht Standard Port 80 verwendet wird.<br />
* Der SSL Port wird im Modul von der API abgefragt und kann in der HUEBridge nicht extra angegeben werden. Dazu darf der SSL Port nicht extern umgemappt werden, sondern der deconz Service muss wissen, auf welchem Port er läuft.<br />
* Die Bridge muss einmalig mit dem Gateway gepairt werden. Das FHEM Bridge Device erzeugt einen Key, in der Phoscon App muss man im Menüpunkt Gateway/erweitert/App die Funktion {{Taste|verbinden}} wählen.<br />
<br />
== Binding einrichten ==<br />
Um das Licht ohne "Umwege" direkt mit einem Taster/Schalter zu steuern, muss man beide direkt verbinden. Im Zigbee Umfeld wird dies Binding genannt. Beim ConBee Stick erfolgt das mit der deconz-gui.<br />
[[Datei:Deconz-binding-zeichnung.png|mini|Beispiel Binding Taster -> Lampe]]<br />
Die Binding Logik geht normalerweise vom steuernden (Taster) zum gesteuerten Device (Lampe).<br />
# Panel Bind Dropbox anhaken, Kartenreiter (unten!) wird damit angezeigt und muss in den Vordergrund gebracht werden.<br />
# Bei beiden Geräten die Home Automation Tabelle öffnen: linker grauer "Knopf" im Symbol.<br />
# Per drag&drop die gewünschte Zeile in der Tabelle (z.B. 006 on/off) in das jeweilige (linke oder rechte) Feld (Source -> Destination) fallen lassen. <br />
# Den Bind Knopf drücken.<br />
Voraussetzung zum Erfolg: Beide Geräte unterstützen ein Binding, damit kann man zumindest Grundfunktionen direkt ausführen.<br />
<br />
== Bekannte Probleme ==<br />
Wenn alles gut aussieht, aber trotzdem scheinbar keine Kommunikation mit Zigbee Geräten stattfindet (Anlernen geht nicht, auch nicht mit Abstand von wenigen cm) sollte man den Stick mit einer USB Verlängerung (30-50 cm) anschließen.<br />
<br />
== Links ==<br />
* Internetseite des [http://www.dresden-elektronik.de Herstellers] und des [https://phoscon.de Vertreibers]<br />
* [https://phoscon.de/de/conbee2/compatible Liste der kompatiblen Hersteller / Geräte].<br />
<br />
[[Kategorie:Interfaces]]<br />
[[Kategorie:ZigBee]]</div>Otto123http://wiki.fhem.de/w/index.php?title=FHEM_auf_Raspberry_PI_mit_COC_betreiben&diff=38786FHEM auf Raspberry PI mit COC betreiben2023-12-14T08:42:22Z<p>Otto123: /* COC in Betrieb nehmen */</p>
<hr />
<div>Um einen [[COC]] mit einem Raspberry Pi und FHEM zu nutzen, sind mehrere Schritte notwendig. Die folgende Anleitung zeigt diese entsprechend auf.<br />
<br />
== Vorausetzung ==<br />
Erforderliche Hardware:<br />
* Raspberry Pi<br />
* Busware [[COC]]<br />
<br />
Erforderliche Software:<br />
* Raspbian OS (Lite Version dringend empfohlen)<br />
<br />
Notwendige Vorbereitungen:<br />
* Busware [[COC]] ist auf dem Raspberry Pi montiert<br />
* Raspberry Pi ist ans Netzwerk angeschlossen und mit dem Internet verbunden.<br />
<br />
== Raspberry Pi Grundinstallation ==<br />
# Bitte immer zuerst https://fhem.de/fhem.html#Installation lesen!<br />
# Die empfohlene Grundinstallation des Raspberry Pi ist im Artikel '''[[Raspberry Pi]]''' beschrieben<br />
::Dabei ist besonders der Abschnitt '''[[Raspberry Pi#Verwendung UART für Zusatzmodule|Verwendung UART für Zusatzmodule]]''' zu beachten<br />
<br />
== Zusatzeinstellungen ==<br />
{{Randnotiz|RNTyp=y|RNText=Dieser Abschnit muss überprüft werden. Eigentlich sind diese Rechte nicht notwendig: FHEM ist schon in der Gruppe dialout, gpio Initialisierung erfolgt mit root Rechten}}<br />
Zusätzlich zur Grundinstallation fügen wir den Benutzer fhem der Gruppe tty und gpio hinzu (Zugriffsrechte auf Serial- und USB-Ports und GPIO)<br />
:<code>sudo usermod -aG tty,gpio fhem</code><br />
<br />
== COC in Betrieb nehmen ==<br />
Hinweis: Offenbar gibt es im laufe der Jahre unterschiedliche Versionen des COC. Das folgende Script stammt aus der Zusammenarbeit in diesem {{Link2Forum|Topic=111106|LinkText=Forenthema}}. Offenbar wurden die Pins zur Aktivierung geändert, deshalb bitte die Unterlagen des [http://busware.de/ Herstellers] konsultieren! Dort steht aktuell ein anderes [http://busware.de/tiki-index.php?page=COC_Installation Script].<br />
<br />
Bitte die folgenden Befehlszeilen separat mit root Rechten (sudo) testen und erst nach Erfolg in den Systemstart einbauen!<syntaxhighlight lang="bash"><br />
echo "resetting 868MHz extension..."<br />
if test ! -d /sys/class/gpio/gpio17; then echo 17 > /sys/class/gpio/export; fi<br />
if test ! -d /sys/class/gpio/gpio18; then echo 18 > /sys/class/gpio/export; fi<br />
echo out > /sys/class/gpio/gpio17/direction<br />
echo out > /sys/class/gpio/gpio18/direction<br />
echo 1 > /sys/class/gpio/gpio18/value<br />
echo 0 > /sys/class/gpio/gpio17/value<br />
sleep 1<br />
echo 1 > /sys/class/gpio/gpio17/value<br />
sleep 1<br />
</syntaxhighlight>Damit der COC beim Start von FHEM initialisiert wird, muss der obige Code als Script ausgeführt werden.<br />
* Bei systemd Systemen kann man nach diesem [[Fhem.service (systemd unit file)|'''Wiki Artikel''']] vorgehen. Der obige Code wird dabei einfach als Inhalt für die dort erzeugten Scripte verwendet.<br />
* Bei init.d Systemen muss die Datei '''/etc/init.d/fhem''' z.B. mittels <br />
:<code>sudo nano /etc/init.d/fhem</code><br />
:editiert, und der Scriptcode unterhalb von "Start)" eingefügt werden.<br />
Nun wird der Raspberry PI vollständig neu gestartet:<br />
:<code>sudo shutdown -r now</code><br />
<br />
In FHEM wird in der Weboberfläche die Definition durchgeführt:<br />
:<code>define COC CUL /dev/ttyAMA0@38400 1234</code><br />
<br />
Der Raspberry PI sollte nun via '''auto detect''' die Komponenten auffinden<br />
<br />
[[Kategorie:Raspberry Pi]]<br />
[[Kategorie:HOWTOS]]</div>Otto123http://wiki.fhem.de/w/index.php?title=FHEM_startet_nicht_-_Tipps_zur_Fehlersuche&diff=38741FHEM startet nicht - Tipps zur Fehlersuche2023-12-01T12:56:40Z<p>Otto123: /* Minimal Config starten */ Platte voll eingefügt</p>
<hr />
<div>Es gibt einen weiteren Artikel zur Fehlersuche. [[Hilfe! Mein FHEM funktioniert nicht!]]<br />
<br />
'''Kein Zugriff auf FHEMWEB/FHEM startet nicht - Was kann ich tun?'''<br />
<br />
Deine [[FHEMWEB]]-Seite ist nicht erreichbar? Ist FHEM tot, oder ist das Netzwerk kaputt? Was kann ich machen, um zu prüfen, woran es genau liegt?<br />
<br />
In diesem Wiki-Artikel soll es darum gehen, wie Du für Dich prüfen kannst, ob ein Fehler bei FHEM, im Netzwerk oder ein anderes Problem vorliegt.<br />
== Prüfen: Läuft überhaupt ein FHEM-Prozess? ==<br />
Man kann sich unter einem Linuxsystem sämtliche laufende Prozesse auflisten lassen<br />
<br />
<code>ps ax</code><br />
<br />
Der Befehl ''ps'' listet je nach Argument alle laufende Prozesse auf. Die Liste kann man nun noch nach einem bestimmten Prozess filtern. Aufruf und Ausgabe einer Prozessliste mit einem Filter nach perl sieht z. B. so aus:<br />
<br />
<code>ps ax | grep perl</code><br />
<br />
<code>cooltux@fhem01-cluster:~> ps ax | grep perl</code><br />
<br />
<code>11320 pts/0 S+ 0:00 grep --color=auto perl</code><br />
<br />
Wie wir sehen, wird hier lediglich der gerade ausgeführte Befehl ''ps'' gefunden (weil das Wort ''perl'' in der Aufrufzeile stand. Es wird hier überhaupt kein Perl-Prozess gelistet. Aktuell läuft also definitiv kein FHEM, das ja ein Perl-Programm/Prozess ist.<br />
<br />
Eine Prozessliste mit einem laufenden FHEM-Prozess könnte so aussehen:<br />
<br />
<code>[11:31 root@fhem01-cluster cooltux] > ps ax | grep perl</code><br />
<br />
<code>15852 ? R 2119:09 /usr/bin/perl fhem.pl configDB</code><br />
<br />
<code>21447 pts/0 S+ 0:00 grep perl</code><br />
<br />
FHEM (''perl fhem.pl ...'') ist in diesem Fall also aktiv.<br />
<br />
=== systemd ===<br />
<br />
Nutzt das Linux-System den systemd, kann mit folgendem Befehl der Status des FHEM-Prozesses geprüft werden:<br />
<br />
<code>service fhem status</code><br />
<br />
Eine Ausgabe könnte z.B. so aussehen:<br />
<pre><br />
● fhem.service - FHEM Home Automation<br />
Loaded: loaded (/etc/systemd/system/fhem.service; enabled; vendor preset: enabled)<br />
Active: active (running) since Thu 2018-08-09 14:32:16 CEST; 20h ago<br />
Process: 27641 ExecStart=/usr/bin/perl fhem.pl fhem.cfg (code=exited, status=0/SUCCESS)<br />
Main PID: 27643 (perl)<br />
Tasks: 1 (limit: 4915)<br />
CGroup: /system.slice/fhem.service<br />
└─27643 /usr/bin/perl fhem.pl fhem.cfg<br />
<br />
Aug 09 14:32:16 fhem-host systemd[1]: Starting FHEM Home Automation...<br />
Aug 09 14:32:16 fhem-host systemd[1]: Started FHEM Home Automation.<br />
</pre><br />
<br />
== Prüfen: Ist der laufende FHEM-Prozess überlastet? ==<br />
Ich sollte mir anschauen, ob der FHEM-Prozess vielleicht zu sehr ausgelastet ist, der Prozess also 100 Prozent CPU Auslastung produziert?<br />
<br />
Ein weiterer Linuxbefehl ''top'' wird uns hierbei behilflich sein:<br />
<pre style="white-space: pre;"><br />
[11:38 root@fhem01-cluster cooltux] > top<br />
top - 11:38:18 up 11 days, 18:58, 1 user, load average: 1,07, 1,03, 1,00<br />
Tasks: 125 total, 2 running, 123 sleeping, 0 stopped, 0 zombie<br />
%Cpu(s): 24,9 us, 0,9 sy, 0,0 ni, 74,1 id, 0,0 wa, 0,0 hi, 0,1 si, 0,0 st<br />
KiB Mem: 945524 total, 833532 used, 111992 free, 41552 buffers<br />
KiB Swap: 102396 total, 46564 used, 55832 free. 496240 cached Mem<br />
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND<br />
15852 fhem 20 0 103652 82160 5068 R 100,0 8,7 2125:41 perl <br />
21683 root 20 0 5740 2560 2092 R 1,0 0,3 0:00.37 top <br />
19129 cooltux 20 0 86204 22348 3668 S 0,3 2,4 64:16.90 insync-portable <br />
21350 cooltux 20 0 11436 2848 2248 S 0,3 0,3 0:00.10 sshd <br />
1 root 20 0 23292 2368 1380 S 0,0 0,3 0:54.23 systemd <br />
2 root 20 0 0 0 0 S 0,0 0,0 0:01.09 kthreadd <br />
3 root 20 0 0 0 0 S 0,0 0,0 3:37.20 ksoftirqd/0 <br />
5 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kworker/0:0H <br />
7 root 20 0 0 0 0 S 0,0 0,0 8:20.71 rcu_sched <br />
8 root 20 0 0 0 0 S 0,0 0,0 0:00.00 rcu_bh <br />
9 root rt 0 0 0 0 S 0,0 0,0 0:05.45 migration/0<br />
</pre><br />
Hier können wir nun eindeutig erkennen, dass unser FHEM die CPU mit 100 Prozent auslastet. FHEM hat also ein Problem!<br />
<br />
Zum Vergleich ein FHEM/Perl-Prozess ohne Probleme:<br />
<pre style="white-space: pre;"><br />
[11:50 root@fhem01-cluster cooltux] > top<br />
top - 11:50:33 up 11 days, 19:10, 1 user, load average: 0,84, 1,03, 1,00<br />
Tasks: 133 total, 1 running, 132 sleeping, 0 stopped, 0 zombie<br />
%Cpu(s): 0,6 us, 0,8 sy, 0,0 ni, 98,6 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st<br />
KiB Mem: 945524 total, 818344 used, 127180 free, 43748 buffers<br />
KiB Swap: 102396 total, 46820 used, 55576 free. 489652 cached Mem<br />
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND<br />
22074 fhem 20 0 86424 68516 7200 S 1,3 7,2 0:47.64 perl<br />
22294 root 20 0 5740 2564 2092 R 1,3 0,3 0:00.19 top<br />
22296 fhem 20 0 86424 63556 2240 S 1,3 6,7 0:00.04 perl<br />
22297 fhem 20 0 2088 408 328 S 0,7 0,0 0:00.02 ping<br />
7 root 20 0 0 0 0 S 0,3 0,0 8:21.23 rcu_sched<br />
1366 mysql 20 0 620608 157132 5736 S 0,3 16,6 70:12.59 mysqld<br />
19481 root 20 0 0 0 0 S 0,3 0,0 0:02.35 kworker/3:0<br />
1 root 20 0 23292 2408 1420 S 0,0 0,3 0:54.27 systemd<br />
2 root 20 0 0 0 0 S 0,0 0,0 0:01.09 kthreadd<br />
3 root 20 0 0 0 0 S 0,0 0,0 3:37.42 ksoftirqd/0<br />
5 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kworker/0:0H<br />
</pre><br />
== Prüfen: Stimmen die Dateiberechtigungen? ==<br />
Alle Dateien im Verzeichnis /opt/fhem/ und allen Unterverzeichnissen gehören nach der Installation dem Benutzer fhem und der Gruppe dialout. Man kann es leicht prüfen:<br />
<code>ls -la /opt/fhem/</code><br />
<br />
Häufig wird der Eigentümer durch Manipulation der Dateien falsch gesetzt, mit diesem Befehl kann man alle Dateien auf den Eigentümer fhem und dessen primäre Gruppe setzen.<br />
<br />
<code>sudo chown -R fhem: /opt/fhem/</code><br />
<br />
Die Setup Routine setzt den Besitz auf fhem:dialout <code>sudo chown -R fhem:dialout /opt/fhem/</code><br />
<br />
== Und wenn sich gar nichts mehr tut? ==<br />
=== Die letzen Zeilen im existierenden FHEM Log anzeigen ===<br />
So lässt man sich auf Systemebene die letzen 20 Zeilen im Log anzeigen<syntaxhighlight lang="bash"><br />
tail -n 20 /opt/fhem/log/fhem-$(date '+%Y-%m').log<br />
</syntaxhighlight><br />
<br />
=== Fehlernachrichten von FHEM bei dessen Start analysieren ===<br />
In der Regel werden die Ausgaben von FHEM, auch die beim Start, gemeinsam mit vielen anderen Nachrichten in ein Logfile geschrieben. Dort kann natürlich nach Ursachen geforscht werden.<br />
<br />
Eine einfachere Auswertung wird möglich, wenn man diese Meldungen zeitweilig in einem Terminalfenster (das Ding, um Kommandozeilenbefehle einzugeben) angezeigt bekommt.<br />
<br />
Seit dem 01.08.2017 gibt es die Möglichkeit beim manuellen Starten von FHEM im Terminal den Schalter -d zu verwenden ({{Link2Forum|Topic=74774|Message=666766}}). Dieser startet FHEM mit den beiden gesetzten Attributen <code>attr global logfile -</code> und <code>attr global verbose 5</code> und gibt somit alle Meldungen im Terminalfenster aus. Zuerst mit ins FHEM Verzeichnis wechseln. Root oder sudo ist nicht erforderlich!<br />
<br />
Allerdings muss ein (mit 100 %) laufendes FHEM zunächst beendet werden! z.B.: <code>sudo systemctl stop fhem</code><br />
<br />
ins FHEM Verzeichnis wechseln: <code>cd /opt/fhem</code><br />
<br />
Je nach Konfiguration FHEM im debug Modus starten:<br />
<br />
fhem.cfg - Nutzer: <code>perl fhem.pl -d fhem.cfg</code><br />
<br />
configDB - Nutzer: <code>perl fhem.pl -d configDB</code><br />
<br />
Wenn man genug analysiert hat, FHEM mit Ctrl-C/Strg-C stoppen<br />
<br />
== Es ist nach dem letzten Update passiert? ==<br />
Beispielhaft für das Vorgehen wird das in diesem {{Link2Forum|Topic=118533|LinkText=Forumthread}} beschrieben. FHEM speichert vor dem Update die Dateien ins Verzeichnis restoreDir die aktualisiert werden. Es handelt sich dabei nicht um eine komplette Sicherung des Systems!<br />
<br />
Man kann sich über die gesicherten Versionen/Dateien einen Überblick verschaffen (Datum anpassen!):<br />
:<code>ls -lha /opt/fhem/restoreDir/update</code><br />
:<code>ls -lhaR /opt/fhem/restoreDir/update/2020-02-28</code><br />
<br />
Hat man die verursachende Datei ermittelt, kann man gezielt diese Datei wieder herstellen:<br />
:<code>sudo -su fhem cp /opt/fhem/restoreDir/update/2021-02-06/FHEM/NameDerDatei /opt/fhem/FHEM/</code><br />
Es gibt bei einigen Modulen Abhängigkeiten von anderen Dateien, es ist dringend angeraten, dann den kompletten zusammengehörigen Satz wieder herzustellen!<br />
<br />
Will man einen kompletten Schritt zurück vor dem Update gehen, weil man den Fehler nicht einkreisen kann, stellt man so alles vor dem Update wieder her. <br />
:<code>sudo -su fhem cp -R /opt/fhem/restoreDir/update/2021-02-05/* /opt/fhem/</code><br />
<br />
== Die config Datei ist das Problem? ==<br />
Bei jedem save wird in /opt/fhem/restoreDirs eine Sicherung der fhem.cfg und das Statefile fhem.save durchgeführt. <br />
<br />
Auf der Kommandozeile vom System kann man sich einen Überblick verschaffen:<br />
<br />
<code>ls -lha /opt/fhem/restoreDir/save</code><br />
<br />
Dort sollten Pfade mit Datums Angaben sein.<br />
<br />
Den exakten Zeitpunkt der gesicherten Dateien kann man sich so anzeigen lassen (Beispiel).<br />
<br />
<code>ls -lhaR /opt/fhem/restoreDir/save/2020-02-28</code><br />
<br />
Die "lastKnownGood" Konfiguration kann man so wiederherstellen und anschließend FHEM wieder starten:<br />
<br />
<code>sudo -su fhem cp -R /opt/fhem/restoreDir/save/2020-02-28/* /opt/fhem/</code><br />
<br />
Die Berechtigungen werden durch verwenden von User fhem eigentlich erhalten. <br />
<br />
Falls die Berechtigungen nicht stimmen:<br />
<br />
<code>sudo chown fhem: /opt/fhem/fhem.cfg</code><br />
<br />
<code>sudo chown fhem: /opt/fhem/log/fhem.save</code><br />
<br />
== Minimal Config starten ==<br />
Wenn gar nichts mehr geht, ist es manchmal ratsam eine minimal Konfiguration zu starten um die Hardware oder Netzwerkanbindung an sich zu testen.<br />
<br />
Wichtig ist zunächst sicher zu stellen, dass kein FHEM Prozess läuft (siehe oben)<br />
<br />
Die fhem.cfg.demo (Bestandteil von FHEM) ist extra für den interaktiven Start gedacht, die Logausgaben landen in der Konsole. <br />
<br />
Die Demo kann interaktiv mit Ctrl+C beendet werden. <syntaxhighlight lang="bash"><br />
cd /opt/fhem<br />
sudo perl fhem.pl fhem.cfg.demo<br />
<br />
</syntaxhighlight>Oder man holt sich die Original minimal fhem.cfg<syntaxhighlight lang="bash"><br />
cd /opt/fhem<br />
sudo -su fhem wget -qO minimal.cfg https://svn.fhem.de/fhem/trunk/fhem/fhem.cfg<br />
sudo perl fhem.pl minimal.cfg<br />
</syntaxhighlight><br />
<br />
Damit wäre es auch möglich ein [[Update]] zu machen oder Dateien wie im Update Wiki Artikel beschrieben direkt aus dem SVN zu holen.<br />
<br />
'''Hinweis:''' Es ist wichtig fhem.pl mit erhöhten Rechten zu starten, da sonst fhem.pl nicht auf den user fhem umschalten kann - das würde zu Rechte Problemen führen!<br />
<br />
Für configDB User gibt es den {{Link2Forum|Topic=86225|LinkText= rescue Modus}}.<br />
<br />
== Ist die Platte voll? ==<br />
So kann man anzeigen wie viel Platz frei / belegt ist.<syntaxhighlight lang="bash"><br />
df -h<br />
</syntaxhighlight>Ist 100% belegt oder 0 verfügbar. Dann kann man suchen wo die großen Brocken sind:<syntaxhighlight lang="bash"><br />
sudo du -h -d 2 / |sort -h|tail<br />
</syntaxhighlight>Ist der FHEM Pfad das Problem kann man gezielter suchen:<syntaxhighlight lang="bash"><br />
du -h /opt/fhem/backup<br />
<br />
du -h /opt/fhem/log<br />
</syntaxhighlight>Und eventuell löschen, im Beispiel die ältesten 5 Backups Schritt für Schritt: <br />
<br />
# alle anzeigen, <br />
# die ältesten 5 anzeigen, <br />
# die ältesten 5 löschen.<br />
<syntaxhighlight lang="bash"><br />
ls -lha /opt/fhem/backup/ <br />
ls -d /opt/fhem/backup/FHEM-*.tar.gz |head -5<br />
ls -d /opt/fhem/backup/FHEM-*.tar.gz |head -5|xargs rm<br />
</syntaxhighlight><br />
[[Kategorie:HOWTOS]]</div>Otto123http://wiki.fhem.de/w/index.php?title=Raspberry_Pi&diff=38733Raspberry Pi2023-11-25T13:20:09Z<p>Otto123: /* Troubleshooting */</p>
<hr />
<div>Beim [[Raspberry Pi]] handelt es sich um einen postkartengroßen Einplatinen-Computer, der von der Raspberry Pi Foundation entwickelt wird. Die Hardware basiert auf dem BCM 283x SoC (System-on-Chip) von Broadcom, einem ARM-Prozessor. Zu Hardwaredetails und den verschiedenen Modellen sowie Produktentwicklungen siehe [http://de.wikipedia.org/wiki/Raspberry_Pi#Hardware Wikipedia].<br />
Dank der kleinen Abmessungen, dem recht geringen Energieverbrauch (bis ca. 4 Watt) sowie der günstigen Anschaffungskosten (ca. 30€) ist der Raspberry Pi eine attraktive Hardware für die Heimautomatisierung mit FHEM. Er ist dank dem Linux-Betriebssystem vollständig kompatibel zur aktuell vorhandenen und von FHEM unterstützen Hardware. Das derzeit empfohlene Standard-Image zum Betrieb des Raspberry Pi ist die auf Debian basierende Raspberry Pi OS Distribution (ab Mitte 2019 ''Buster'').<br />
<br />
== Installation / Setup ==<br />
=== Betriebssystem ===<br />
====Vorbemerkung====<br />
Raspberry Pi OS ist direkt bei raspberrybi.org unter https://www.raspberrypi.org/downloads/raspberry-pi-os/ herunterladbar. Die folgende Anleitung gilt für die lite-Version ohne grafischen Desktop und für die Modelle für B, B+, B2, B3, B3+, Zero W. (Stand Juni 2018)<br />
<br />
Alle in diesem Abschnitt verwendeten Code Blöcke benötigen root Rechte. Deshalb bitte immer am Besten im Kontext <code>sudo su</code> ausführen. Man kann auch einzelne Befehle mit sudo davor ausführen, allerdings wird die Berechtigung bei Pipe Befehlen nicht durchgereicht. Einige dieser Kommandos funktionieren in der angegebenen Form nicht unter der Wheezy-Version [https://en.wikipedia.org/wiki/Raspberry_Pi_OS#Release_history] des RPi OS. Läuft der betreffende RPi noch unter Wheezy, ist ein Upgrade des RPi OS empfehlenswert.<br />
<br />
Alle Dateien müssen im Linux-Format (nur LF als Zeilenende) erzeugt/editiert werden! Unbedingt einen geeigneten Editor verwenden und auf das Format beim Speichern achten!<br />
<br />
====SD-Karte vorbereiten====<br />
Die heruntergeladene Datei muss entpackt und auf die Speicherkarte geschrieben werden. Es gibt dazu verschiedene Tools je nach Betriebssystem. Für Windows ist windisk32imager zu empfehlen, Projektseite [https://sourceforge.net/projects/win32diskimager/]. Für Mac OS gibt es den Pi Filler.<br />
<br />
Detaillierte Anleitungen zur Vorgehensweise finden sich für die Betriebssysteme Linux, Mac OS und Windows unter [https://www.raspberrypi.org/documentation/installation/installing-images/README.md Writing an image to the SD card]<br />
<br />
Die SD Card enthält nun zwei Partitionen/Laufwerke, wobei das erste Laufwerk unter alle Betriebssystemen lesbar ist. In diesem Laufwerk (/boot) müssen jetzt noch zwei Dateien erzeugt werden:<br />
* eine leere Datei mit dem Namen ssh, um den (headless) Zugriff per ssh zu ermöglichen (Pi Filler macht dies automatisch). Hinweis: Eine spätere Aktivierung von SSH ist mit <code>sudo raspi-config</code> (Punkt 5 "Interfacing Options", dann Punkt 2 SSH) möglich, erfordert dann aber Tastatur und Monitor am RPi.<br />
* eine Textdatei im Linux Format mit Namen wpa_supplicant.conf und folgendem Inhalt, wenn der Pi sofort mit WLAN starten soll.<br />
<br />
<pre>country=DE<br />
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev<br />
update_config=1<br />
network={<br />
ssid="FRITZ!Box 7490"<br />
psk="12345678901234567890" <br />
}<br />
</pre><br />
* SD Karte auswerfen.<br />
* SD Karte in Raspberry Pi stecken und booten.<br />
<br />
Alternativ kann auch Monitor und Tastatur verwendet werden.<br />
<br />
====Anmeldung und Grundkonfiguration====<br />
Default raspberrypi-os: Host raspberrypi, User pi, Passwort raspberry <br />
<br />
Default ubuntu: Host ubuntu, User ubuntu, Passwort ubuntu<br />
<br />
Anmeldung entweder lokal oder mit dem Befehl: ssh <user>@<hostname><br />
<br />
Das Passwort sollte geändert werden, dazu dem Sicherheitshinweis folgen und <code>passwd</code> eingeben.<br />
<br />
Alle unten genannten Befehle müssen mit erhöhten Rechten ausgeführt werden (z. B. sudo)!<br />
<br />
Als Erstes sollte: Zeitzone, Sprache und Hostname angepasst werden. <br />
Entweder Menügeführt mit <code>sudo raspi-config</code> <br />
oder per Script / Shell Befehle:<br />
<br />
<syntaxhighlight lang="bash"># Zeitzone einstellen & Zeitsynchronisierung über das Internet aktivieren<br />
timedatectl set-timezone Europe/Berlin<br />
timedatectl set-ntp true<br />
<br />
# Konfigurieren lokale Sprache deutsch<br />
sed -i -e 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/' /etc/locale.gen<br />
locale-gen<br />
localectl set-locale LANG=de_DE.UTF-8 LANGUAGE=de_DE<br />
<br />
# Hostname <br />
hostnamectl set-hostname mymachine<br />
<br />
# System aktualisieren <br />
apt-get update<br />
apt-get upgrade<br />
<br />
#Neustart<br />
reboot</syntaxhighlight><br />
<br />
Am Anfang sollte man Befehle nicht verketten, sondern immer auf die Ausgabe warten (es sei denn, man hat Erfahrung): also kein <code>apt-get update && apt-get upgrade </code>. Ebenso sollte man nicht mit automatischen Bestätigungen arbeiten, also kein upgrade mit "-y". Nach einer Installation ist ein aufräumen immer gut, also:<br />
<syntaxhighlight lang="bash"><br />
apt-get autoremove<br />
apt-get clean<br />
apt-get purge $(dpkg --get-selections | grep deinstall | cut -f1 | xargs)<br />
</syntaxhighlight><br />
<br />
====Verwendung UART für Zusatzmodule====<br />
Einige Aufsteckmodule (z.B. HM-MOD-RPI-PCB) für den GPIO Port verwenden die serielle Schnittstelle UART. Der Zugriff auf diese serielle Schnittstelle erfordert eine modellabhängige Konfiguration.<br />
<br />
Bei allen Modellen muss die Verwendung der seriellen Linux console an ttyAMA0 deaktiviert werden:<br />
<syntaxhighlight lang="bash"># seriell-getty Dienst für ttyAMA0 dauerhaft deaktivieren<br />
systemctl stop serial-getty@ttyAMA0.service<br />
systemctl disable serial-getty@ttyAMA0.service<br />
systemctl mask serial-getty@ttyAMA0.service<br />
</syntaxhighlight><br />
Bei den Modellen mit Bluetooth muss die UART aktiviert und umkonfiguriert werden. Hier ein bash Script, welches die Originaldatei entsprechend modifiziert:<br />
{{Randnotiz|RNTyp=Info|RNText=Im aktuellen RaspberryPi OS Bookworm Image ist die config.txt in den Pfad /boot/firmware gewandert. Es existiert aber ein Link, man kann arbeiten wie bisher.}}<syntaxhighlight lang="bash"><br />
# serielle Schnittstelle aktivieren und mit BT Schnittstelle tauschen<br />
# für Raspberry Pi OS<br />
config="/boot/config.txt"<br />
# für Ubuntu<br />
#config="/boot/firmware/usercfg.txt"<br />
<br />
bash -c "cat <<EOF >> $config<br />
enable_uart=1<br />
dtoverlay=miniuart-bt<br />
core_freq=250<br />
EOF"<br />
</syntaxhighlight><br />
Wer dem nicht traut, der editiert die Datei von Hand (Linux Editor!) und fügt am Ende die drei Zeilen aus dem Script ein, die vor EOF stehen.<br />
<br />
Die config Datei von ubuntu verwendet den Befehl include usercfg.txt. Mit Erscheinen des Pi 4 wurden die overlay Dateien umbenannt (Start mit Pi3- entfernt) die alten Namen funktionieren aber noch.<br />
<br />
Um die Konfiguration abzuschließen ist ein Neustart erforderlich<br />
<syntaxhighlight lang="bash">#Neustart erforderlich <br />
reboot</syntaxhighlight><br />
<br />
====Troubleshooting====<br />
{{Randnotiz|RNTyp=r|RNText=Das hat sich mit RaspberryPI OS Bookworm geändert, aktuell wird hier diskutiert. https://forum.fhem.de/index.php?msg=1294588}}<br />
'''Kontrolle der seriellen Schnittstelle'''<br />
<br />
Der Befehl <code>ls -l /dev/ttyAMA0</code> muss folgende Ausgabe liefern.<br />
crw-rw---- 1 root dialout 204, 64 Jun 7 22:56 /dev/ttyAMA0<br />
Sollte dies nicht der Fall sein, muss der Dienst serial-getty@ttyAMA0.service deaktiviert werden!<br />
<br />
Kontrolle der Verlinkung von /dev/serial*<br />
<br />
Der Befehl <code>ls -l /dev/serial*</code> muss folgende Ausgabe liefern.<br />
* Bei Modellen mit BT und richtiger Konfiguration (funktioniert nur unter Raspberry Pi OS)<br />
lrwxrwxrwx 1 root root 7 Jun 7 22:55 /dev/serial0 -> ttyAMA0<br />
lrwxrwxrwx 1 root root 5 Jun 7 22:55 /dev/serial1 -> ttyS0<br />
* Bei den Modellen ohne BT und richtiger Konfiguration<br />
lrwxrwxrwx 1 root root 7 Jun 8 18:30 /dev/serial0 -> ttyAMA0<br />
Sollte das nicht der Fall sein, sind die Einträge in der /boot/config.txt fehlerhaft. <br />
<br />
Sollte die serielle Schnittstelle unerwartet nicht funktionieren, kann auch andere Software daran Schuld sein, weil diese einfach versucht, alle Schnittstellen abzufragen / zu initialisieren. Für die Fehlersuche ist es also wichtig zu wissen, welche Software so installiert wurde, speziell wenn diese serielle Schnitttstellen (USB) verwendet / verwenden will. Ein Beispiel (deconz/conbee) wird in {{Link2Forum|Topic=116428|Message=1107317|LinkText=diesem Forenbeitrag}} behandelt. <br />
<br />
Bei einem Raspberry 4 stört unter Umständen die Temperaturkontrolle des Lüfters, siehe auch Abschnitt bekannte Probleme: [[HM-MOD-RPI-PCB HomeMatic Funkmodul für Raspberry Pi]]. <br />
<br />
'''Kontrolle Bluetooth'''<br />
<br />
Die Funktion von Bluetooth kann mit dem hcitool überprüft werden. Mit <code>hcitool dev</code> wird das interne BT Gerät mit MAC Adresse angezeigt. Mit <code>hcitool scan</code> bzw. <code>hcitool lescan</code> kann nach sichtbaren Geräten gesucht werden.<br />
<br />
Weitergehende Informationen zur Anpassung der Konfiguration von Raspberry Pi OS sind nachzulesen auf https://www.raspberrypi.org/documentation/configuration/.<br />
<br />
Sollte die Bluetooth Schnittstelle nach der Installation von FHEM nicht funktionieren, hilft es den Dienst abhängig zu starten, siehe diesen Wiki Artikel [[Fhem.service (systemd unit file)]] <br />
<br />
=== FHEM ===<br />
Die Installation von FHEM kann nach der Raspberry Pi OS Installation sehr einfach über das Debian-Repository [http://debian.fhem.de] erfolgen. <br />
* Es wird unbedingt empfohlen zur Grundinstallation zunächst keine Module, USB Sticks oder ähnliche Zusatzbaugruppen an den IO Ports des Raspberry gesteckt zu haben. <br />
* Dieser Abschnitt beschreibt nur die Grundinstallation von FHEM auf einem Raspberry Pi mit Raspberry Pi OS! <br />
* Weitere Installationsschritte sind je nach verwendeten FHEM-Modulen notwendig. <br />
** Informationen hierzu liefert üblicherweise die {{Link2CmdRef}} zum jeweiligen Modul.<br />
** Den weiteren Einstieg in FHEM findet man im Artikel [[Quick-Start]]<br />
<br />
==== Der einfache Weg zum aktuellen System ====<br />
Der folgende Befehlsblock ist die praktische Umsetzung der Beschreibung auf http://debian.fhem.de. Bitte unbedingt vor Installation rückversichern, ob es dort (insbesondere unter ''The easy way: use apt-get'') Aktualisierungen gab. <br />
* Dieser Befehlsblock erfordert erhöhte Rechte, also bitte als Erstes <code>sudo su</code> ausführen!<br />
* Beim Kopieren aufpassen! Jede Zeile muss einzeln ausgeführt werden!<br />
Dieser Befehlsblock gilt ab der Version ''debian buster'' als veraltet (es gibt Sicherheitsbedenken), muss aber bis einschließlich ''debian stretch'' eingesetzt werden.<br />
<syntaxhighlight lang="bash"><br />
# von debian.fhem.de installieren - siehe aktuelle Anleitung dort https://debian.fhem.de/<br />
wget -qO - https://debian.fhem.de/archive.key | apt-key add -<br />
echo "deb http://debian.fhem.de/nightly/ /" >> /etc/apt/sources.list<br />
apt-get update<br />
apt-get install fhem<br />
</syntaxhighlight><br />
Dieser Befehlsblock funktioniert erst ab ''debian buster'' (erfordert erhöhte Rechte <code>sudo su</code>)<br />
<syntaxhighlight lang="bash"><br />
# Bei manchen debian Distributionen fehlt das Paket gpg -> nachinstallieren<br />
apt update<br />
apt install gpg<br />
# von debian.fhem.de installieren - siehe aktuelle Anleitung dort https://debian.fhem.de/<br />
wget -O- https://debian.fhem.de/archive.key | gpg --dearmor > /usr/share/keyrings/debianfhemde-archive-keyring.gpg<br />
echo "deb [signed-by=/usr/share/keyrings/debianfhemde-archive-keyring.gpg] https://debian.fhem.de/nightly/ /" >> /etc/apt/sources.list<br />
apt update<br />
apt install fhem<br />
</syntaxhighlight><br />
<br />
==== Das offizielle Release ====<br />
Man kann FHEM mit dem Debian-Paket von [https://fhem.de/#Installation fhem.de] installieren. Dieser Weg führt zu einem offiziellen Release, welches aber unter Umständen erheblich vom aktuellen Versions- und Diskussionsstand im Forum abweicht. <br />
<br />
Alternativ kann man auch den manuellen Weg von https://debian.fhem.de/ wählen.<br />
<br />
==== Empfohlener Patch ====<br />
Da gerade auf dem Raspberry die automatische Erkennung der USB Schnittstellen zu 100% CPU Last führt (FHEM träge und reagiert nicht), wird empfohlen sofort nach der Installation noch diesen "Patch" auszuführen: FHEM starten, wenn alle USB-Geräte ausgesteckt sind. Dann <code>attr initialUsbCheck disable 1</code> in der Kommandozeile in FHEMWEB eingeben, <code>save</code> ausführen und FHEM anschließen wieder mit eingesteckten USB-Geräten neu starten.<br />
<br />
==== Deinstallation ====<br />
Man kann FHEM auch wieder spurlos vom System entfernen und ganz von vorn beginnen. Allerdings sollte man sich im Klaren sein, damit ensteht kein jungfräuliches System!<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get purge fhem<br />
sudo apt-get autoremove<br />
</syntaxhighlight><br />
<br />
=== Zusatzpakete bei FHEM-Erst- und Zweitinstallation ===<br />
Nachdem der RPi eingerichtet ist, können weitere Pakete installiert werden. Keines davon ist zwingend erforderlich, um das Grundgerüst von FHEM betreiben zu können. Einige Pakete erhöhen aber den Bedienungskomfort, andere sind zur Nutzung bestimmter weiterer FHEM-Module (siehe {{Link2CmdRef}}) erforderlich. <br />
<br />
Hierzu wurden in letzter Zeit mehrere Hilfsmodule entwickelt, die insbesondere bei Wiederinstallation (etwa nach Absturz) wichtig sein können. So zeigt das Modul Installer die installierten Perl-Module an, siehe dazu {{Link2Forum|Topic=98381|LinkText=diesen Thread}}.<br />
<br />
Wenn man eine frühere Installation auf einer anderen SD-Karte installieren möchte und nicht mehr weiß, welche Zusatzpakete man auf der alten Karte installiert hatte, hilft (diese und nachfolgende Hinweise sind aus dem Blog [https://heinz-otto.blogspot.com/2019/07/infos-zur-installation-von-modulen-und.html])<br />
zcat $(ls -tr /var/log/apt/history.log.*.gz)|grep -A1 Start-Date<br />
weiter. Hier werden frühere Eingaben der Kommandozeile wiedergegeben. Es gibt einen analogen Befehl, um die mit CPAN installierten Pakete anzuzeigen. Dazu muss man das debian Paket perl-doc installiert haben und gibt dann ein<br />
for M in `perldoc -t perllocal|grep Module |sed -e 's/^.*" //'`; do V=`perldoc -t perllocal|awk "/$M/{y=1;next}y" |grep VERSION |head -n 1`; printf "%30s %s\n" "$M" "$V"; done |sort<br />
Ebenso kann man herausfinden, ob und durch welches debian-Paket das Perl-Paket installiert wurde. Die zweite Version sucht nur in Paketen die -perl im Namen tragen und läuft damit wesentlich schneller:<br />
s='Device::SerialPort' ## zu diesem Paket wird gesucht<br />
perl -M$s -e '' 2>/dev/null &&echo "Modul $s ist vorhanden"''<br />
for i in $(dpkg -l |grep ^ii| awk '{ print $2 }'|tr -d "\r"|tr "\n" " ");do if dpkg -L $i|grep $s &> /dev/null;then echo $i enthält $s;fi;done<br />
for i in $(dpkg -l |grep ^ii|grep '\-perl'| awk '{ print $2 }'|tr -d "\r"|tr "\n" " ");do if dpkg -L $i|grep $s &> /dev/null;then echo $i enthält $s;fi;done<br />
<br />
Es gibt gute Gründe, die Installation von Perl Modulen über debian-Pakete der Installation über cpan zu bevorzugen. Dazu zählt die Updatefähigkeit und die Geschwindigkeit. Man kann im Internet nach den Paketen suchen, man kann aber auch einfach die Verfügbarkeit für das lokale System testen. Dazu braucht man das Tool apt-file, welches man zuerst installieren muss. Der letzte Befehl lädt den Infocache lokal und dauert etwas:<br />
sudo apt-get update<br />
sudo apt-get install apt-file<br />
sudo apt-file update<br />
Die folgende Suche nutzt den Umstand, dass in der im Paket enthaltenen Liste der Dateien auch die Doku in der Form "/usr/share/man/man3/IO::File.3perl.gz" enthalten ist. Der search Befehl unten akzeptiert mehrere Modulnamen durch Zeilenumbruch getrennt. In dem Beispiel sind die Modulnamen in einem String durch Leerzeichen getrennt, die Trennung wird in Zeilenumbruch geändert, jede Zeile ergänzt und über stdin an den search Befehl von apt-file übergeben. Die Option -l bewirkt das nur die gefunden Pakete gelistet werden, werden mehrere der abgefragten Modulnamen in einem Paket gefunden, wird es nur einmal gelistet:<br />
s="IO::File Digest::MD5" ##Such-String<br />
echo $s|tr " " "\n"|sed 's/$/./;s/^/\//'|apt-file search -l -f -<br />
<br />
Zuletzt eine Übersicht diverser Zusatzpakete.<br />
{| class="wikitable"<br />
! style="width:10%" | Beschreibung<br />
! style="width:10%" | Paketname<br />
! style="width:50%" | Kontext<br />
! style="width:30%" | Installieren<br />
|-<br />
|Zeitserver<br />
|ntpdate<br />
|Setzt die Systemzeit bei Start des RPi. Wird für FHEM benötigt, da es sonst nicht startet.<br />
|<code>sudo apt-get install ntpdate<br />
sudo ntpdate -u de.pool.ntp.org</code><br />
|-<br />
|Perl JSON<br />
|JSON<br />
|Wird von einigen Modulen benötigt, z.B. harmony, iTunes<br />
|<code>sudo apt-get install libjson-perl</code><br />
|-<br />
|Samba-Server<br />
|samba<br />
|Mittels Samba kann man z.B. den Ordner /opt/fhem als Share freigeben. Dieser Share kann z.B. im Windows-Explorer als Laufwerk verbunden werden, so dass die Bearbeitung von config- und Programmdateien bequem möglich ist. Hier eine hilfreiche [https://www.elektronik-kompendium.de/sites/raspberry-pi/2007071.htm Kurzanleitung] aus der (wenn man auf einen speziellen user verzichtet) nur die Einträge für smb.conf gesetzt werden müssen.<br />
|<code>sudo apt-get install samba cifs-utils</code><br />
Danach muss der share definiert werden mittels<br />
<br />
<code>sudo nano /etc/samba/smb.conf</code><br />
|-<br />
|Mailversand<br />
|sendemail (alt: sendEmail)<br />
|Wird benötigt, um Mails versenden zu können, bspw. für Alarm-Benachrichtigungen.<br />
Nach Installation des Paketes benötigt man noch eine Routine in FHEM gemäß [[E-Mail senden#Raspberry Pi]]<br />
|<code>sudo apt-get install sendemail</code> bzw. <code>sudo apt-get install sendEmail</code><br />
|-<br />
|Wake-on-LAN<br />
|etherwake<br />
|Wird z.B. für das Modul WOL benötigt.<br />
|<code>sudo apt-get install etherwake</code><br />
|-<br />
|Perl Telnet<br />
|telnet<br />
|Wurde vor Fritz!OS 6.2x z.B. für das Modul [[FRITZBOX]] benötigt, da es eine im Netzwerk vorhandene Fritzbox über deren Telnet-Port ansprach. Mittlerweile wird TR-64 und SOAP verwendet.<br />
|<code>sudo apt-get install libnet-telnet-perl</code><br />
|-<br />
|Socat<br />
|socat<br />
|Kann verwendet werden, um auf anderen Rechnern im Netzwerk Linux-Befehle oder Skripts auszuführen. Auch können auf Slave-FHEM-Installationen Befehl ausgeführt werden, z.B. mit <br />
<br />
<code><nowiki>system("echo 'set lampe on' | /usr/bin/socat - TCP:1.2.3.4:7072");</nowiki></code><br />
<br />
1.2.3.4 muss natürlich durch die IP-Adresse des Zielrechners ersetzt werden.<br />
|<code>sudo apt-get install socat</code><br />
|-<br />
|Libcrypt<br />
|Libcrypt<br />
|Perl libcrypt, erforderlich falls Homematic-devices mit AES verwendet werden sollen.<br />
|<code>sudo apt-get install libcrypt-rijndael-perl</code><br />
|-<br />
|libdatetime<br />
|libdatetime<br />
|Perl libdatetime, erforderlich für das Weather-Modul.<br />
|<code>sudo apt-get install libdatetime-format-strptime-perl</code><br />
|-<br />
|EnOcean XML functions<br />
|libxml simple<br />
|Perl XML::SIMPLE, erforderlich für die XML Funktionen des ENOCEAN Moduls.<br />
|<code>sudo apt-get install libxml-simple-perl</code><br />
|-<br />
|EnOcean Cryptographic functions<br />
|libcrypt-random-source-perl<br />
|Perl Crypt::Random, erforderlich für die Cryptographic Funktionen des ENOCEAN Moduls.<br />
|<code>sudo /usr/bin/perl -MCPAN -e 'install Crypt::Random'</code><br />
|}<br />
<br />
== Bekannte Probleme ==<br />
=== Netzteil ===<br />
Der RPi verwendet ein USB Netzteil als Spannungsversorgung. Gemessen kann der RPi allein bereits um die 900mA Strom fordern. Das bringt kleine Netzteile, besonders wenn noch CULs oder WLAN Sticks an USB hängen schnell an die Grenze. Die Fehler die daraus resultieren sind Abstürze, Netzwerkprobleme uvm. Daher bitte ein ausreichend starkes Netzteil mit mind. 2000mA oder einen aktiven USB-HUB für die Periperie verwenden.<br />
<br />
=== Kabel (Micro-USB) ===<br />
Auch das verwendete Kabel kann einen (großen) Unterschied machen. Billige Kabel haben sehr dünne Kupferadern, die auf größeren Strecken (bereits ab 30cm!) einen Spannungsabfall verursachen können, der sonst nicht nachvollziehbare Probleme (Festplattenausfall, SD-Kartenausfall etc.) auslöst. Siehe beispielsweise diesen Thread mit einer Tabelle, die die Höhe des Spannungsabfalls explizit beschreibt: [https://forum.fhem.de/index.php/topic,127508.0.html Link zum Forum] <br />
<br />
=== Echtzeituhr ===<br />
Der RPi hat keine [http://de.wikipedia.org/wiki/Echtzeituhr Real-Time-Clock] (RTC), das heißt, dass er nach einem Neustart keine gültige (im Sinne von aktuell) Systemzeit hat, sondern ein Datum in der Vergangenheit. Dieses Problem wird sinnvollerweise mit einer [http://de.wikipedia.org/wiki/Network_Time_Protocol NTP-Konfiguration] oder durch [[Raspberry Pi: RTC Hat|Installation einer Echtzeituhr]] umgangen.<br />
<br />
Dabei muss Sorge getragen werden, dass der [http://wiki.debian.org/NTP ntpd] schon einen Datums-/Zeitabgleich gemacht hat, bevor FHEM gestartet wird. Geschieht der Abgleich nicht vorher, sondern erst nachdem FHEM schon läuft, stellt FHEM die Logs zwar auf das nun aktuelle Datum um (die "alten" Logs mit dem eigentlich ungültigen Datum werden natürlich behalten), aber irgendetwas scheint FHEM dabei so zu belasten, dass es eine Last von über 0.8 bis 0.9 erzeugt. Diese Last besteht auf Dauer und verschwindet erst, wenn man das Ganze sauber durchkonfiguriert und FHEM neu gestartet hat. Die hohe Systemauslastung zeigt sich auch in einem sehr trägen Laden der FHEM-Webseiten in einem beliebigen Browser. (siehe {{Link2Forum|Topic=70741}})<br />
<br />
=== Last durch Backup (während update) ===<br />
Bei einen [[Update]] von FHEM durch den Befehl <code>update</code> kann durch Setzen des Attributs "<code>attr global backup_before_update 1</code>" automatisch vorab ein [[Backup]] durchgeführt werden. Die (ggf. großen) Log-Dateien werden dabei ebenfalls archiviert. Während der Archivierung ist FHEM blockiert. Durch die beschränkte Leistungsfähigkeit des Raspberry Pi kann das Backup zudem lange dauern. Durch ein "<code>attr global updateInBackground 1</code>" wird ein Backup im Hintergrund ausgeführt (Quelle: {{Link2Forum|Topic=15729}}). <br />
<br />
Alternative Möglichkeiten: <br />
* Backup ausschalten und manuell durchführen <br />
* Backup-Befehl anpassen und so große Dateien bzw. Verzeichnisse (log/) nicht archivieren<br />
<br />
== Watchdog einrichten ==<br />
Man kann den RPi regelmäßig prüfen lassen, ob FHEM noch läuft und gegebenenfalls einen Neustart durchführen lassen. Eine mögliche Vorgehensweise ist in diesem {{Link2Forum|Topic=20553|LinkText=Forumsthema}} beschrieben.<br />
{{Hinweis|Statt des Einsatzes derartiger Methoden ist zu empfehlen, nach der eigentliche Fehlerursache zu forschen und diese abzustellen. Haben Sie dennoch einen solchen Watchdog eingerichtet, sollten Sie bei Fragen zu Ihnen seltsam erscheinenden Phänomänen im Forum darauf hinweisen, auch wenn die Symptome scheinbar nichts mit dem Watchdog zu tun haben sollten.}}<br />
<br />
== Interne Links ==<br />
* [[CUL am Raspberry Pi flashen]]<br />
* [[Raspberry Pi und 1-Wire]]<br />
<br />
== Externe Links ==<br />
* {{Link2Forum|Topic=33460|Message=264679}} zum Umzug von Raspberry B auf Raspberry Pi 2<br />
* [http://www.raspberrypi.org/ Offizielle Webseite der Raspberry Pi Foundation]<br />
* [http://www.raspberrypi.org/downloads Offizielle Downloads der Raspberry Pi Foundation]<br />
<br />
[[Kategorie:Raspberry Pi]]<br />
[[Kategorie:HOWTOS]]</div>Otto123http://wiki.fhem.de/w/index.php?title=Raspberry_Pi&diff=38732Raspberry Pi2023-11-25T13:19:01Z<p>Otto123: /* Troubleshooting */</p>
<hr />
<div>Beim [[Raspberry Pi]] handelt es sich um einen postkartengroßen Einplatinen-Computer, der von der Raspberry Pi Foundation entwickelt wird. Die Hardware basiert auf dem BCM 283x SoC (System-on-Chip) von Broadcom, einem ARM-Prozessor. Zu Hardwaredetails und den verschiedenen Modellen sowie Produktentwicklungen siehe [http://de.wikipedia.org/wiki/Raspberry_Pi#Hardware Wikipedia].<br />
Dank der kleinen Abmessungen, dem recht geringen Energieverbrauch (bis ca. 4 Watt) sowie der günstigen Anschaffungskosten (ca. 30€) ist der Raspberry Pi eine attraktive Hardware für die Heimautomatisierung mit FHEM. Er ist dank dem Linux-Betriebssystem vollständig kompatibel zur aktuell vorhandenen und von FHEM unterstützen Hardware. Das derzeit empfohlene Standard-Image zum Betrieb des Raspberry Pi ist die auf Debian basierende Raspberry Pi OS Distribution (ab Mitte 2019 ''Buster'').<br />
<br />
== Installation / Setup ==<br />
=== Betriebssystem ===<br />
====Vorbemerkung====<br />
Raspberry Pi OS ist direkt bei raspberrybi.org unter https://www.raspberrypi.org/downloads/raspberry-pi-os/ herunterladbar. Die folgende Anleitung gilt für die lite-Version ohne grafischen Desktop und für die Modelle für B, B+, B2, B3, B3+, Zero W. (Stand Juni 2018)<br />
<br />
Alle in diesem Abschnitt verwendeten Code Blöcke benötigen root Rechte. Deshalb bitte immer am Besten im Kontext <code>sudo su</code> ausführen. Man kann auch einzelne Befehle mit sudo davor ausführen, allerdings wird die Berechtigung bei Pipe Befehlen nicht durchgereicht. Einige dieser Kommandos funktionieren in der angegebenen Form nicht unter der Wheezy-Version [https://en.wikipedia.org/wiki/Raspberry_Pi_OS#Release_history] des RPi OS. Läuft der betreffende RPi noch unter Wheezy, ist ein Upgrade des RPi OS empfehlenswert.<br />
<br />
Alle Dateien müssen im Linux-Format (nur LF als Zeilenende) erzeugt/editiert werden! Unbedingt einen geeigneten Editor verwenden und auf das Format beim Speichern achten!<br />
<br />
====SD-Karte vorbereiten====<br />
Die heruntergeladene Datei muss entpackt und auf die Speicherkarte geschrieben werden. Es gibt dazu verschiedene Tools je nach Betriebssystem. Für Windows ist windisk32imager zu empfehlen, Projektseite [https://sourceforge.net/projects/win32diskimager/]. Für Mac OS gibt es den Pi Filler.<br />
<br />
Detaillierte Anleitungen zur Vorgehensweise finden sich für die Betriebssysteme Linux, Mac OS und Windows unter [https://www.raspberrypi.org/documentation/installation/installing-images/README.md Writing an image to the SD card]<br />
<br />
Die SD Card enthält nun zwei Partitionen/Laufwerke, wobei das erste Laufwerk unter alle Betriebssystemen lesbar ist. In diesem Laufwerk (/boot) müssen jetzt noch zwei Dateien erzeugt werden:<br />
* eine leere Datei mit dem Namen ssh, um den (headless) Zugriff per ssh zu ermöglichen (Pi Filler macht dies automatisch). Hinweis: Eine spätere Aktivierung von SSH ist mit <code>sudo raspi-config</code> (Punkt 5 "Interfacing Options", dann Punkt 2 SSH) möglich, erfordert dann aber Tastatur und Monitor am RPi.<br />
* eine Textdatei im Linux Format mit Namen wpa_supplicant.conf und folgendem Inhalt, wenn der Pi sofort mit WLAN starten soll.<br />
<br />
<pre>country=DE<br />
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev<br />
update_config=1<br />
network={<br />
ssid="FRITZ!Box 7490"<br />
psk="12345678901234567890" <br />
}<br />
</pre><br />
* SD Karte auswerfen.<br />
* SD Karte in Raspberry Pi stecken und booten.<br />
<br />
Alternativ kann auch Monitor und Tastatur verwendet werden.<br />
<br />
====Anmeldung und Grundkonfiguration====<br />
Default raspberrypi-os: Host raspberrypi, User pi, Passwort raspberry <br />
<br />
Default ubuntu: Host ubuntu, User ubuntu, Passwort ubuntu<br />
<br />
Anmeldung entweder lokal oder mit dem Befehl: ssh <user>@<hostname><br />
<br />
Das Passwort sollte geändert werden, dazu dem Sicherheitshinweis folgen und <code>passwd</code> eingeben.<br />
<br />
Alle unten genannten Befehle müssen mit erhöhten Rechten ausgeführt werden (z. B. sudo)!<br />
<br />
Als Erstes sollte: Zeitzone, Sprache und Hostname angepasst werden. <br />
Entweder Menügeführt mit <code>sudo raspi-config</code> <br />
oder per Script / Shell Befehle:<br />
<br />
<syntaxhighlight lang="bash"># Zeitzone einstellen & Zeitsynchronisierung über das Internet aktivieren<br />
timedatectl set-timezone Europe/Berlin<br />
timedatectl set-ntp true<br />
<br />
# Konfigurieren lokale Sprache deutsch<br />
sed -i -e 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/' /etc/locale.gen<br />
locale-gen<br />
localectl set-locale LANG=de_DE.UTF-8 LANGUAGE=de_DE<br />
<br />
# Hostname <br />
hostnamectl set-hostname mymachine<br />
<br />
# System aktualisieren <br />
apt-get update<br />
apt-get upgrade<br />
<br />
#Neustart<br />
reboot</syntaxhighlight><br />
<br />
Am Anfang sollte man Befehle nicht verketten, sondern immer auf die Ausgabe warten (es sei denn, man hat Erfahrung): also kein <code>apt-get update && apt-get upgrade </code>. Ebenso sollte man nicht mit automatischen Bestätigungen arbeiten, also kein upgrade mit "-y". Nach einer Installation ist ein aufräumen immer gut, also:<br />
<syntaxhighlight lang="bash"><br />
apt-get autoremove<br />
apt-get clean<br />
apt-get purge $(dpkg --get-selections | grep deinstall | cut -f1 | xargs)<br />
</syntaxhighlight><br />
<br />
====Verwendung UART für Zusatzmodule====<br />
Einige Aufsteckmodule (z.B. HM-MOD-RPI-PCB) für den GPIO Port verwenden die serielle Schnittstelle UART. Der Zugriff auf diese serielle Schnittstelle erfordert eine modellabhängige Konfiguration.<br />
<br />
Bei allen Modellen muss die Verwendung der seriellen Linux console an ttyAMA0 deaktiviert werden:<br />
<syntaxhighlight lang="bash"># seriell-getty Dienst für ttyAMA0 dauerhaft deaktivieren<br />
systemctl stop serial-getty@ttyAMA0.service<br />
systemctl disable serial-getty@ttyAMA0.service<br />
systemctl mask serial-getty@ttyAMA0.service<br />
</syntaxhighlight><br />
Bei den Modellen mit Bluetooth muss die UART aktiviert und umkonfiguriert werden. Hier ein bash Script, welches die Originaldatei entsprechend modifiziert:<br />
{{Randnotiz|RNTyp=Info|RNText=Im aktuellen Raspberry OS Bookworm Image ist die config.txt in den Pfad /boot/firmware gewandert. Es existiert aber ein Link, man kann arbeiten wie bisher.}}<syntaxhighlight lang="bash"><br />
# serielle Schnittstelle aktivieren und mit BT Schnittstelle tauschen<br />
# für Raspberry Pi OS<br />
config="/boot/config.txt"<br />
# für Ubuntu<br />
#config="/boot/firmware/usercfg.txt"<br />
<br />
bash -c "cat <<EOF >> $config<br />
enable_uart=1<br />
dtoverlay=miniuart-bt<br />
core_freq=250<br />
EOF"<br />
</syntaxhighlight><br />
Wer dem nicht traut, der editiert die Datei von Hand (Linux Editor!) und fügt am Ende die drei Zeilen aus dem Script ein, die vor EOF stehen.<br />
<br />
Die config Datei von ubuntu verwendet den Befehl include usercfg.txt. Mit Erscheinen des Pi 4 wurden die overlay Dateien umbenannt (Start mit Pi3- entfernt) die alten Namen funktionieren aber noch.<br />
<br />
Um die Konfiguration abzuschließen ist ein Neustart erforderlich<br />
<syntaxhighlight lang="bash">#Neustart erforderlich <br />
reboot</syntaxhighlight><br />
<br />
====Troubleshooting====<br />
{{Randnotiz|RNTyp=r|RNText=Das hat sich mit Bookworm geändert, aktuell wird hier diskutiert. https://forum.fhem.de/index.php?msg=1294588}}<br />
'''Kontrolle der seriellen Schnittstelle'''<br />
<br />
Der Befehl <code>ls -l /dev/ttyAMA0</code> muss folgende Ausgabe liefern.<br />
crw-rw---- 1 root dialout 204, 64 Jun 7 22:56 /dev/ttyAMA0<br />
Sollte dies nicht der Fall sein, muss der Dienst serial-getty@ttyAMA0.service deaktiviert werden!<br />
<br />
Kontrolle der Verlinkung von /dev/serial*<br />
<br />
Der Befehl <code>ls -l /dev/serial*</code> muss folgende Ausgabe liefern.<br />
* Bei Modellen mit BT und richtiger Konfiguration (funktioniert nur unter Raspberry Pi OS)<br />
lrwxrwxrwx 1 root root 7 Jun 7 22:55 /dev/serial0 -> ttyAMA0<br />
lrwxrwxrwx 1 root root 5 Jun 7 22:55 /dev/serial1 -> ttyS0<br />
* Bei den Modellen ohne BT und richtiger Konfiguration<br />
lrwxrwxrwx 1 root root 7 Jun 8 18:30 /dev/serial0 -> ttyAMA0<br />
Sollte das nicht der Fall sein, sind die Einträge in der /boot/config.txt fehlerhaft. <br />
<br />
Sollte die serielle Schnittstelle unerwartet nicht funktionieren, kann auch andere Software daran Schuld sein, weil diese einfach versucht, alle Schnittstellen abzufragen / zu initialisieren. Für die Fehlersuche ist es also wichtig zu wissen, welche Software so installiert wurde, speziell wenn diese serielle Schnitttstellen (USB) verwendet / verwenden will. Ein Beispiel (deconz/conbee) wird in {{Link2Forum|Topic=116428|Message=1107317|LinkText=diesem Forenbeitrag}} behandelt. <br />
<br />
Bei einem Raspberry 4 stört unter Umständen die Temperaturkontrolle des Lüfters, siehe auch Abschnitt bekannte Probleme: [[HM-MOD-RPI-PCB HomeMatic Funkmodul für Raspberry Pi]]. <br />
<br />
'''Kontrolle Bluetooth'''<br />
<br />
Die Funktion von Bluetooth kann mit dem hcitool überprüft werden. Mit <code>hcitool dev</code> wird das interne BT Gerät mit MAC Adresse angezeigt. Mit <code>hcitool scan</code> bzw. <code>hcitool lescan</code> kann nach sichtbaren Geräten gesucht werden.<br />
<br />
Weitergehende Informationen zur Anpassung der Konfiguration von Raspberry Pi OS sind nachzulesen auf https://www.raspberrypi.org/documentation/configuration/.<br />
<br />
Sollte die Bluetooth Schnittstelle nach der Installation von FHEM nicht funktionieren, hilft es den Dienst abhängig zu starten, siehe diesen Wiki Artikel [[Fhem.service (systemd unit file)]] <br />
<br />
=== FHEM ===<br />
Die Installation von FHEM kann nach der Raspberry Pi OS Installation sehr einfach über das Debian-Repository [http://debian.fhem.de] erfolgen. <br />
* Es wird unbedingt empfohlen zur Grundinstallation zunächst keine Module, USB Sticks oder ähnliche Zusatzbaugruppen an den IO Ports des Raspberry gesteckt zu haben. <br />
* Dieser Abschnitt beschreibt nur die Grundinstallation von FHEM auf einem Raspberry Pi mit Raspberry Pi OS! <br />
* Weitere Installationsschritte sind je nach verwendeten FHEM-Modulen notwendig. <br />
** Informationen hierzu liefert üblicherweise die {{Link2CmdRef}} zum jeweiligen Modul.<br />
** Den weiteren Einstieg in FHEM findet man im Artikel [[Quick-Start]]<br />
<br />
==== Der einfache Weg zum aktuellen System ====<br />
Der folgende Befehlsblock ist die praktische Umsetzung der Beschreibung auf http://debian.fhem.de. Bitte unbedingt vor Installation rückversichern, ob es dort (insbesondere unter ''The easy way: use apt-get'') Aktualisierungen gab. <br />
* Dieser Befehlsblock erfordert erhöhte Rechte, also bitte als Erstes <code>sudo su</code> ausführen!<br />
* Beim Kopieren aufpassen! Jede Zeile muss einzeln ausgeführt werden!<br />
Dieser Befehlsblock gilt ab der Version ''debian buster'' als veraltet (es gibt Sicherheitsbedenken), muss aber bis einschließlich ''debian stretch'' eingesetzt werden.<br />
<syntaxhighlight lang="bash"><br />
# von debian.fhem.de installieren - siehe aktuelle Anleitung dort https://debian.fhem.de/<br />
wget -qO - https://debian.fhem.de/archive.key | apt-key add -<br />
echo "deb http://debian.fhem.de/nightly/ /" >> /etc/apt/sources.list<br />
apt-get update<br />
apt-get install fhem<br />
</syntaxhighlight><br />
Dieser Befehlsblock funktioniert erst ab ''debian buster'' (erfordert erhöhte Rechte <code>sudo su</code>)<br />
<syntaxhighlight lang="bash"><br />
# Bei manchen debian Distributionen fehlt das Paket gpg -> nachinstallieren<br />
apt update<br />
apt install gpg<br />
# von debian.fhem.de installieren - siehe aktuelle Anleitung dort https://debian.fhem.de/<br />
wget -O- https://debian.fhem.de/archive.key | gpg --dearmor > /usr/share/keyrings/debianfhemde-archive-keyring.gpg<br />
echo "deb [signed-by=/usr/share/keyrings/debianfhemde-archive-keyring.gpg] https://debian.fhem.de/nightly/ /" >> /etc/apt/sources.list<br />
apt update<br />
apt install fhem<br />
</syntaxhighlight><br />
<br />
==== Das offizielle Release ====<br />
Man kann FHEM mit dem Debian-Paket von [https://fhem.de/#Installation fhem.de] installieren. Dieser Weg führt zu einem offiziellen Release, welches aber unter Umständen erheblich vom aktuellen Versions- und Diskussionsstand im Forum abweicht. <br />
<br />
Alternativ kann man auch den manuellen Weg von https://debian.fhem.de/ wählen.<br />
<br />
==== Empfohlener Patch ====<br />
Da gerade auf dem Raspberry die automatische Erkennung der USB Schnittstellen zu 100% CPU Last führt (FHEM träge und reagiert nicht), wird empfohlen sofort nach der Installation noch diesen "Patch" auszuführen: FHEM starten, wenn alle USB-Geräte ausgesteckt sind. Dann <code>attr initialUsbCheck disable 1</code> in der Kommandozeile in FHEMWEB eingeben, <code>save</code> ausführen und FHEM anschließen wieder mit eingesteckten USB-Geräten neu starten.<br />
<br />
==== Deinstallation ====<br />
Man kann FHEM auch wieder spurlos vom System entfernen und ganz von vorn beginnen. Allerdings sollte man sich im Klaren sein, damit ensteht kein jungfräuliches System!<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get purge fhem<br />
sudo apt-get autoremove<br />
</syntaxhighlight><br />
<br />
=== Zusatzpakete bei FHEM-Erst- und Zweitinstallation ===<br />
Nachdem der RPi eingerichtet ist, können weitere Pakete installiert werden. Keines davon ist zwingend erforderlich, um das Grundgerüst von FHEM betreiben zu können. Einige Pakete erhöhen aber den Bedienungskomfort, andere sind zur Nutzung bestimmter weiterer FHEM-Module (siehe {{Link2CmdRef}}) erforderlich. <br />
<br />
Hierzu wurden in letzter Zeit mehrere Hilfsmodule entwickelt, die insbesondere bei Wiederinstallation (etwa nach Absturz) wichtig sein können. So zeigt das Modul Installer die installierten Perl-Module an, siehe dazu {{Link2Forum|Topic=98381|LinkText=diesen Thread}}.<br />
<br />
Wenn man eine frühere Installation auf einer anderen SD-Karte installieren möchte und nicht mehr weiß, welche Zusatzpakete man auf der alten Karte installiert hatte, hilft (diese und nachfolgende Hinweise sind aus dem Blog [https://heinz-otto.blogspot.com/2019/07/infos-zur-installation-von-modulen-und.html])<br />
zcat $(ls -tr /var/log/apt/history.log.*.gz)|grep -A1 Start-Date<br />
weiter. Hier werden frühere Eingaben der Kommandozeile wiedergegeben. Es gibt einen analogen Befehl, um die mit CPAN installierten Pakete anzuzeigen. Dazu muss man das debian Paket perl-doc installiert haben und gibt dann ein<br />
for M in `perldoc -t perllocal|grep Module |sed -e 's/^.*" //'`; do V=`perldoc -t perllocal|awk "/$M/{y=1;next}y" |grep VERSION |head -n 1`; printf "%30s %s\n" "$M" "$V"; done |sort<br />
Ebenso kann man herausfinden, ob und durch welches debian-Paket das Perl-Paket installiert wurde. Die zweite Version sucht nur in Paketen die -perl im Namen tragen und läuft damit wesentlich schneller:<br />
s='Device::SerialPort' ## zu diesem Paket wird gesucht<br />
perl -M$s -e '' 2>/dev/null &&echo "Modul $s ist vorhanden"''<br />
for i in $(dpkg -l |grep ^ii| awk '{ print $2 }'|tr -d "\r"|tr "\n" " ");do if dpkg -L $i|grep $s &> /dev/null;then echo $i enthält $s;fi;done<br />
for i in $(dpkg -l |grep ^ii|grep '\-perl'| awk '{ print $2 }'|tr -d "\r"|tr "\n" " ");do if dpkg -L $i|grep $s &> /dev/null;then echo $i enthält $s;fi;done<br />
<br />
Es gibt gute Gründe, die Installation von Perl Modulen über debian-Pakete der Installation über cpan zu bevorzugen. Dazu zählt die Updatefähigkeit und die Geschwindigkeit. Man kann im Internet nach den Paketen suchen, man kann aber auch einfach die Verfügbarkeit für das lokale System testen. Dazu braucht man das Tool apt-file, welches man zuerst installieren muss. Der letzte Befehl lädt den Infocache lokal und dauert etwas:<br />
sudo apt-get update<br />
sudo apt-get install apt-file<br />
sudo apt-file update<br />
Die folgende Suche nutzt den Umstand, dass in der im Paket enthaltenen Liste der Dateien auch die Doku in der Form "/usr/share/man/man3/IO::File.3perl.gz" enthalten ist. Der search Befehl unten akzeptiert mehrere Modulnamen durch Zeilenumbruch getrennt. In dem Beispiel sind die Modulnamen in einem String durch Leerzeichen getrennt, die Trennung wird in Zeilenumbruch geändert, jede Zeile ergänzt und über stdin an den search Befehl von apt-file übergeben. Die Option -l bewirkt das nur die gefunden Pakete gelistet werden, werden mehrere der abgefragten Modulnamen in einem Paket gefunden, wird es nur einmal gelistet:<br />
s="IO::File Digest::MD5" ##Such-String<br />
echo $s|tr " " "\n"|sed 's/$/./;s/^/\//'|apt-file search -l -f -<br />
<br />
Zuletzt eine Übersicht diverser Zusatzpakete.<br />
{| class="wikitable"<br />
! style="width:10%" | Beschreibung<br />
! style="width:10%" | Paketname<br />
! style="width:50%" | Kontext<br />
! style="width:30%" | Installieren<br />
|-<br />
|Zeitserver<br />
|ntpdate<br />
|Setzt die Systemzeit bei Start des RPi. Wird für FHEM benötigt, da es sonst nicht startet.<br />
|<code>sudo apt-get install ntpdate<br />
sudo ntpdate -u de.pool.ntp.org</code><br />
|-<br />
|Perl JSON<br />
|JSON<br />
|Wird von einigen Modulen benötigt, z.B. harmony, iTunes<br />
|<code>sudo apt-get install libjson-perl</code><br />
|-<br />
|Samba-Server<br />
|samba<br />
|Mittels Samba kann man z.B. den Ordner /opt/fhem als Share freigeben. Dieser Share kann z.B. im Windows-Explorer als Laufwerk verbunden werden, so dass die Bearbeitung von config- und Programmdateien bequem möglich ist. Hier eine hilfreiche [https://www.elektronik-kompendium.de/sites/raspberry-pi/2007071.htm Kurzanleitung] aus der (wenn man auf einen speziellen user verzichtet) nur die Einträge für smb.conf gesetzt werden müssen.<br />
|<code>sudo apt-get install samba cifs-utils</code><br />
Danach muss der share definiert werden mittels<br />
<br />
<code>sudo nano /etc/samba/smb.conf</code><br />
|-<br />
|Mailversand<br />
|sendemail (alt: sendEmail)<br />
|Wird benötigt, um Mails versenden zu können, bspw. für Alarm-Benachrichtigungen.<br />
Nach Installation des Paketes benötigt man noch eine Routine in FHEM gemäß [[E-Mail senden#Raspberry Pi]]<br />
|<code>sudo apt-get install sendemail</code> bzw. <code>sudo apt-get install sendEmail</code><br />
|-<br />
|Wake-on-LAN<br />
|etherwake<br />
|Wird z.B. für das Modul WOL benötigt.<br />
|<code>sudo apt-get install etherwake</code><br />
|-<br />
|Perl Telnet<br />
|telnet<br />
|Wurde vor Fritz!OS 6.2x z.B. für das Modul [[FRITZBOX]] benötigt, da es eine im Netzwerk vorhandene Fritzbox über deren Telnet-Port ansprach. Mittlerweile wird TR-64 und SOAP verwendet.<br />
|<code>sudo apt-get install libnet-telnet-perl</code><br />
|-<br />
|Socat<br />
|socat<br />
|Kann verwendet werden, um auf anderen Rechnern im Netzwerk Linux-Befehle oder Skripts auszuführen. Auch können auf Slave-FHEM-Installationen Befehl ausgeführt werden, z.B. mit <br />
<br />
<code><nowiki>system("echo 'set lampe on' | /usr/bin/socat - TCP:1.2.3.4:7072");</nowiki></code><br />
<br />
1.2.3.4 muss natürlich durch die IP-Adresse des Zielrechners ersetzt werden.<br />
|<code>sudo apt-get install socat</code><br />
|-<br />
|Libcrypt<br />
|Libcrypt<br />
|Perl libcrypt, erforderlich falls Homematic-devices mit AES verwendet werden sollen.<br />
|<code>sudo apt-get install libcrypt-rijndael-perl</code><br />
|-<br />
|libdatetime<br />
|libdatetime<br />
|Perl libdatetime, erforderlich für das Weather-Modul.<br />
|<code>sudo apt-get install libdatetime-format-strptime-perl</code><br />
|-<br />
|EnOcean XML functions<br />
|libxml simple<br />
|Perl XML::SIMPLE, erforderlich für die XML Funktionen des ENOCEAN Moduls.<br />
|<code>sudo apt-get install libxml-simple-perl</code><br />
|-<br />
|EnOcean Cryptographic functions<br />
|libcrypt-random-source-perl<br />
|Perl Crypt::Random, erforderlich für die Cryptographic Funktionen des ENOCEAN Moduls.<br />
|<code>sudo /usr/bin/perl -MCPAN -e 'install Crypt::Random'</code><br />
|}<br />
<br />
== Bekannte Probleme ==<br />
=== Netzteil ===<br />
Der RPi verwendet ein USB Netzteil als Spannungsversorgung. Gemessen kann der RPi allein bereits um die 900mA Strom fordern. Das bringt kleine Netzteile, besonders wenn noch CULs oder WLAN Sticks an USB hängen schnell an die Grenze. Die Fehler die daraus resultieren sind Abstürze, Netzwerkprobleme uvm. Daher bitte ein ausreichend starkes Netzteil mit mind. 2000mA oder einen aktiven USB-HUB für die Periperie verwenden.<br />
<br />
=== Kabel (Micro-USB) ===<br />
Auch das verwendete Kabel kann einen (großen) Unterschied machen. Billige Kabel haben sehr dünne Kupferadern, die auf größeren Strecken (bereits ab 30cm!) einen Spannungsabfall verursachen können, der sonst nicht nachvollziehbare Probleme (Festplattenausfall, SD-Kartenausfall etc.) auslöst. Siehe beispielsweise diesen Thread mit einer Tabelle, die die Höhe des Spannungsabfalls explizit beschreibt: [https://forum.fhem.de/index.php/topic,127508.0.html Link zum Forum] <br />
<br />
=== Echtzeituhr ===<br />
Der RPi hat keine [http://de.wikipedia.org/wiki/Echtzeituhr Real-Time-Clock] (RTC), das heißt, dass er nach einem Neustart keine gültige (im Sinne von aktuell) Systemzeit hat, sondern ein Datum in der Vergangenheit. Dieses Problem wird sinnvollerweise mit einer [http://de.wikipedia.org/wiki/Network_Time_Protocol NTP-Konfiguration] oder durch [[Raspberry Pi: RTC Hat|Installation einer Echtzeituhr]] umgangen.<br />
<br />
Dabei muss Sorge getragen werden, dass der [http://wiki.debian.org/NTP ntpd] schon einen Datums-/Zeitabgleich gemacht hat, bevor FHEM gestartet wird. Geschieht der Abgleich nicht vorher, sondern erst nachdem FHEM schon läuft, stellt FHEM die Logs zwar auf das nun aktuelle Datum um (die "alten" Logs mit dem eigentlich ungültigen Datum werden natürlich behalten), aber irgendetwas scheint FHEM dabei so zu belasten, dass es eine Last von über 0.8 bis 0.9 erzeugt. Diese Last besteht auf Dauer und verschwindet erst, wenn man das Ganze sauber durchkonfiguriert und FHEM neu gestartet hat. Die hohe Systemauslastung zeigt sich auch in einem sehr trägen Laden der FHEM-Webseiten in einem beliebigen Browser. (siehe {{Link2Forum|Topic=70741}})<br />
<br />
=== Last durch Backup (während update) ===<br />
Bei einen [[Update]] von FHEM durch den Befehl <code>update</code> kann durch Setzen des Attributs "<code>attr global backup_before_update 1</code>" automatisch vorab ein [[Backup]] durchgeführt werden. Die (ggf. großen) Log-Dateien werden dabei ebenfalls archiviert. Während der Archivierung ist FHEM blockiert. Durch die beschränkte Leistungsfähigkeit des Raspberry Pi kann das Backup zudem lange dauern. Durch ein "<code>attr global updateInBackground 1</code>" wird ein Backup im Hintergrund ausgeführt (Quelle: {{Link2Forum|Topic=15729}}). <br />
<br />
Alternative Möglichkeiten: <br />
* Backup ausschalten und manuell durchführen <br />
* Backup-Befehl anpassen und so große Dateien bzw. Verzeichnisse (log/) nicht archivieren<br />
<br />
== Watchdog einrichten ==<br />
Man kann den RPi regelmäßig prüfen lassen, ob FHEM noch läuft und gegebenenfalls einen Neustart durchführen lassen. Eine mögliche Vorgehensweise ist in diesem {{Link2Forum|Topic=20553|LinkText=Forumsthema}} beschrieben.<br />
{{Hinweis|Statt des Einsatzes derartiger Methoden ist zu empfehlen, nach der eigentliche Fehlerursache zu forschen und diese abzustellen. Haben Sie dennoch einen solchen Watchdog eingerichtet, sollten Sie bei Fragen zu Ihnen seltsam erscheinenden Phänomänen im Forum darauf hinweisen, auch wenn die Symptome scheinbar nichts mit dem Watchdog zu tun haben sollten.}}<br />
<br />
== Interne Links ==<br />
* [[CUL am Raspberry Pi flashen]]<br />
* [[Raspberry Pi und 1-Wire]]<br />
<br />
== Externe Links ==<br />
* {{Link2Forum|Topic=33460|Message=264679}} zum Umzug von Raspberry B auf Raspberry Pi 2<br />
* [http://www.raspberrypi.org/ Offizielle Webseite der Raspberry Pi Foundation]<br />
* [http://www.raspberrypi.org/downloads Offizielle Downloads der Raspberry Pi Foundation]<br />
<br />
[[Kategorie:Raspberry Pi]]<br />
[[Kategorie:HOWTOS]]</div>Otto123http://wiki.fhem.de/w/index.php?title=Raspberry_Pi&diff=38731Raspberry Pi2023-11-25T13:18:20Z<p>Otto123: /* Troubleshooting */ Diskussion eingefügt</p>
<hr />
<div>Beim [[Raspberry Pi]] handelt es sich um einen postkartengroßen Einplatinen-Computer, der von der Raspberry Pi Foundation entwickelt wird. Die Hardware basiert auf dem BCM 283x SoC (System-on-Chip) von Broadcom, einem ARM-Prozessor. Zu Hardwaredetails und den verschiedenen Modellen sowie Produktentwicklungen siehe [http://de.wikipedia.org/wiki/Raspberry_Pi#Hardware Wikipedia].<br />
Dank der kleinen Abmessungen, dem recht geringen Energieverbrauch (bis ca. 4 Watt) sowie der günstigen Anschaffungskosten (ca. 30€) ist der Raspberry Pi eine attraktive Hardware für die Heimautomatisierung mit FHEM. Er ist dank dem Linux-Betriebssystem vollständig kompatibel zur aktuell vorhandenen und von FHEM unterstützen Hardware. Das derzeit empfohlene Standard-Image zum Betrieb des Raspberry Pi ist die auf Debian basierende Raspberry Pi OS Distribution (ab Mitte 2019 ''Buster'').<br />
<br />
== Installation / Setup ==<br />
=== Betriebssystem ===<br />
====Vorbemerkung====<br />
Raspberry Pi OS ist direkt bei raspberrybi.org unter https://www.raspberrypi.org/downloads/raspberry-pi-os/ herunterladbar. Die folgende Anleitung gilt für die lite-Version ohne grafischen Desktop und für die Modelle für B, B+, B2, B3, B3+, Zero W. (Stand Juni 2018)<br />
<br />
Alle in diesem Abschnitt verwendeten Code Blöcke benötigen root Rechte. Deshalb bitte immer am Besten im Kontext <code>sudo su</code> ausführen. Man kann auch einzelne Befehle mit sudo davor ausführen, allerdings wird die Berechtigung bei Pipe Befehlen nicht durchgereicht. Einige dieser Kommandos funktionieren in der angegebenen Form nicht unter der Wheezy-Version [https://en.wikipedia.org/wiki/Raspberry_Pi_OS#Release_history] des RPi OS. Läuft der betreffende RPi noch unter Wheezy, ist ein Upgrade des RPi OS empfehlenswert.<br />
<br />
Alle Dateien müssen im Linux-Format (nur LF als Zeilenende) erzeugt/editiert werden! Unbedingt einen geeigneten Editor verwenden und auf das Format beim Speichern achten!<br />
<br />
====SD-Karte vorbereiten====<br />
Die heruntergeladene Datei muss entpackt und auf die Speicherkarte geschrieben werden. Es gibt dazu verschiedene Tools je nach Betriebssystem. Für Windows ist windisk32imager zu empfehlen, Projektseite [https://sourceforge.net/projects/win32diskimager/]. Für Mac OS gibt es den Pi Filler.<br />
<br />
Detaillierte Anleitungen zur Vorgehensweise finden sich für die Betriebssysteme Linux, Mac OS und Windows unter [https://www.raspberrypi.org/documentation/installation/installing-images/README.md Writing an image to the SD card]<br />
<br />
Die SD Card enthält nun zwei Partitionen/Laufwerke, wobei das erste Laufwerk unter alle Betriebssystemen lesbar ist. In diesem Laufwerk (/boot) müssen jetzt noch zwei Dateien erzeugt werden:<br />
* eine leere Datei mit dem Namen ssh, um den (headless) Zugriff per ssh zu ermöglichen (Pi Filler macht dies automatisch). Hinweis: Eine spätere Aktivierung von SSH ist mit <code>sudo raspi-config</code> (Punkt 5 "Interfacing Options", dann Punkt 2 SSH) möglich, erfordert dann aber Tastatur und Monitor am RPi.<br />
* eine Textdatei im Linux Format mit Namen wpa_supplicant.conf und folgendem Inhalt, wenn der Pi sofort mit WLAN starten soll.<br />
<br />
<pre>country=DE<br />
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev<br />
update_config=1<br />
network={<br />
ssid="FRITZ!Box 7490"<br />
psk="12345678901234567890" <br />
}<br />
</pre><br />
* SD Karte auswerfen.<br />
* SD Karte in Raspberry Pi stecken und booten.<br />
<br />
Alternativ kann auch Monitor und Tastatur verwendet werden.<br />
<br />
====Anmeldung und Grundkonfiguration====<br />
Default raspberrypi-os: Host raspberrypi, User pi, Passwort raspberry <br />
<br />
Default ubuntu: Host ubuntu, User ubuntu, Passwort ubuntu<br />
<br />
Anmeldung entweder lokal oder mit dem Befehl: ssh <user>@<hostname><br />
<br />
Das Passwort sollte geändert werden, dazu dem Sicherheitshinweis folgen und <code>passwd</code> eingeben.<br />
<br />
Alle unten genannten Befehle müssen mit erhöhten Rechten ausgeführt werden (z. B. sudo)!<br />
<br />
Als Erstes sollte: Zeitzone, Sprache und Hostname angepasst werden. <br />
Entweder Menügeführt mit <code>sudo raspi-config</code> <br />
oder per Script / Shell Befehle:<br />
<br />
<syntaxhighlight lang="bash"># Zeitzone einstellen & Zeitsynchronisierung über das Internet aktivieren<br />
timedatectl set-timezone Europe/Berlin<br />
timedatectl set-ntp true<br />
<br />
# Konfigurieren lokale Sprache deutsch<br />
sed -i -e 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/' /etc/locale.gen<br />
locale-gen<br />
localectl set-locale LANG=de_DE.UTF-8 LANGUAGE=de_DE<br />
<br />
# Hostname <br />
hostnamectl set-hostname mymachine<br />
<br />
# System aktualisieren <br />
apt-get update<br />
apt-get upgrade<br />
<br />
#Neustart<br />
reboot</syntaxhighlight><br />
<br />
Am Anfang sollte man Befehle nicht verketten, sondern immer auf die Ausgabe warten (es sei denn, man hat Erfahrung): also kein <code>apt-get update && apt-get upgrade </code>. Ebenso sollte man nicht mit automatischen Bestätigungen arbeiten, also kein upgrade mit "-y". Nach einer Installation ist ein aufräumen immer gut, also:<br />
<syntaxhighlight lang="bash"><br />
apt-get autoremove<br />
apt-get clean<br />
apt-get purge $(dpkg --get-selections | grep deinstall | cut -f1 | xargs)<br />
</syntaxhighlight><br />
<br />
====Verwendung UART für Zusatzmodule====<br />
Einige Aufsteckmodule (z.B. HM-MOD-RPI-PCB) für den GPIO Port verwenden die serielle Schnittstelle UART. Der Zugriff auf diese serielle Schnittstelle erfordert eine modellabhängige Konfiguration.<br />
<br />
Bei allen Modellen muss die Verwendung der seriellen Linux console an ttyAMA0 deaktiviert werden:<br />
<syntaxhighlight lang="bash"># seriell-getty Dienst für ttyAMA0 dauerhaft deaktivieren<br />
systemctl stop serial-getty@ttyAMA0.service<br />
systemctl disable serial-getty@ttyAMA0.service<br />
systemctl mask serial-getty@ttyAMA0.service<br />
</syntaxhighlight><br />
Bei den Modellen mit Bluetooth muss die UART aktiviert und umkonfiguriert werden. Hier ein bash Script, welches die Originaldatei entsprechend modifiziert:<br />
{{Randnotiz|RNTyp=Info|RNText=Im aktuellen Raspberry OS Bookworm Image ist die config.txt in den Pfad /boot/firmware gewandert. Es existiert aber ein Link, man kann arbeiten wie bisher.}}<syntaxhighlight lang="bash"><br />
# serielle Schnittstelle aktivieren und mit BT Schnittstelle tauschen<br />
# für Raspberry Pi OS<br />
config="/boot/config.txt"<br />
# für Ubuntu<br />
#config="/boot/firmware/usercfg.txt"<br />
<br />
bash -c "cat <<EOF >> $config<br />
enable_uart=1<br />
dtoverlay=miniuart-bt<br />
core_freq=250<br />
EOF"<br />
</syntaxhighlight><br />
Wer dem nicht traut, der editiert die Datei von Hand (Linux Editor!) und fügt am Ende die drei Zeilen aus dem Script ein, die vor EOF stehen.<br />
<br />
Die config Datei von ubuntu verwendet den Befehl include usercfg.txt. Mit Erscheinen des Pi 4 wurden die overlay Dateien umbenannt (Start mit Pi3- entfernt) die alten Namen funktionieren aber noch.<br />
<br />
Um die Konfiguration abzuschließen ist ein Neustart erforderlich<br />
<syntaxhighlight lang="bash">#Neustart erforderlich <br />
reboot</syntaxhighlight><br />
<br />
====Troubleshooting====<br />
{{Randnotiz|RNTyp=fehl|RNText=Das hat sich mit Bookworm geändert, aktuell wird hier diskutiert. https://forum.fhem.de/index.php?msg=1294588}}<br />
'''Kontrolle der seriellen Schnittstelle'''<br />
<br />
Der Befehl <code>ls -l /dev/ttyAMA0</code> muss folgende Ausgabe liefern.<br />
crw-rw---- 1 root dialout 204, 64 Jun 7 22:56 /dev/ttyAMA0<br />
Sollte dies nicht der Fall sein, muss der Dienst serial-getty@ttyAMA0.service deaktiviert werden!<br />
<br />
Kontrolle der Verlinkung von /dev/serial*<br />
<br />
Der Befehl <code>ls -l /dev/serial*</code> muss folgende Ausgabe liefern.<br />
* Bei Modellen mit BT und richtiger Konfiguration (funktioniert nur unter Raspberry Pi OS)<br />
lrwxrwxrwx 1 root root 7 Jun 7 22:55 /dev/serial0 -> ttyAMA0<br />
lrwxrwxrwx 1 root root 5 Jun 7 22:55 /dev/serial1 -> ttyS0<br />
* Bei den Modellen ohne BT und richtiger Konfiguration<br />
lrwxrwxrwx 1 root root 7 Jun 8 18:30 /dev/serial0 -> ttyAMA0<br />
Sollte das nicht der Fall sein, sind die Einträge in der /boot/config.txt fehlerhaft. <br />
<br />
Sollte die serielle Schnittstelle unerwartet nicht funktionieren, kann auch andere Software daran Schuld sein, weil diese einfach versucht, alle Schnittstellen abzufragen / zu initialisieren. Für die Fehlersuche ist es also wichtig zu wissen, welche Software so installiert wurde, speziell wenn diese serielle Schnitttstellen (USB) verwendet / verwenden will. Ein Beispiel (deconz/conbee) wird in {{Link2Forum|Topic=116428|Message=1107317|LinkText=diesem Forenbeitrag}} behandelt. <br />
<br />
Bei einem Raspberry 4 stört unter Umständen die Temperaturkontrolle des Lüfters, siehe auch Abschnitt bekannte Probleme: [[HM-MOD-RPI-PCB HomeMatic Funkmodul für Raspberry Pi]]. <br />
<br />
'''Kontrolle Bluetooth'''<br />
<br />
Die Funktion von Bluetooth kann mit dem hcitool überprüft werden. Mit <code>hcitool dev</code> wird das interne BT Gerät mit MAC Adresse angezeigt. Mit <code>hcitool scan</code> bzw. <code>hcitool lescan</code> kann nach sichtbaren Geräten gesucht werden.<br />
<br />
Weitergehende Informationen zur Anpassung der Konfiguration von Raspberry Pi OS sind nachzulesen auf https://www.raspberrypi.org/documentation/configuration/.<br />
<br />
Sollte die Bluetooth Schnittstelle nach der Installation von FHEM nicht funktionieren, hilft es den Dienst abhängig zu starten, siehe diesen Wiki Artikel [[Fhem.service (systemd unit file)]] <br />
<br />
=== FHEM ===<br />
Die Installation von FHEM kann nach der Raspberry Pi OS Installation sehr einfach über das Debian-Repository [http://debian.fhem.de] erfolgen. <br />
* Es wird unbedingt empfohlen zur Grundinstallation zunächst keine Module, USB Sticks oder ähnliche Zusatzbaugruppen an den IO Ports des Raspberry gesteckt zu haben. <br />
* Dieser Abschnitt beschreibt nur die Grundinstallation von FHEM auf einem Raspberry Pi mit Raspberry Pi OS! <br />
* Weitere Installationsschritte sind je nach verwendeten FHEM-Modulen notwendig. <br />
** Informationen hierzu liefert üblicherweise die {{Link2CmdRef}} zum jeweiligen Modul.<br />
** Den weiteren Einstieg in FHEM findet man im Artikel [[Quick-Start]]<br />
<br />
==== Der einfache Weg zum aktuellen System ====<br />
Der folgende Befehlsblock ist die praktische Umsetzung der Beschreibung auf http://debian.fhem.de. Bitte unbedingt vor Installation rückversichern, ob es dort (insbesondere unter ''The easy way: use apt-get'') Aktualisierungen gab. <br />
* Dieser Befehlsblock erfordert erhöhte Rechte, also bitte als Erstes <code>sudo su</code> ausführen!<br />
* Beim Kopieren aufpassen! Jede Zeile muss einzeln ausgeführt werden!<br />
Dieser Befehlsblock gilt ab der Version ''debian buster'' als veraltet (es gibt Sicherheitsbedenken), muss aber bis einschließlich ''debian stretch'' eingesetzt werden.<br />
<syntaxhighlight lang="bash"><br />
# von debian.fhem.de installieren - siehe aktuelle Anleitung dort https://debian.fhem.de/<br />
wget -qO - https://debian.fhem.de/archive.key | apt-key add -<br />
echo "deb http://debian.fhem.de/nightly/ /" >> /etc/apt/sources.list<br />
apt-get update<br />
apt-get install fhem<br />
</syntaxhighlight><br />
Dieser Befehlsblock funktioniert erst ab ''debian buster'' (erfordert erhöhte Rechte <code>sudo su</code>)<br />
<syntaxhighlight lang="bash"><br />
# Bei manchen debian Distributionen fehlt das Paket gpg -> nachinstallieren<br />
apt update<br />
apt install gpg<br />
# von debian.fhem.de installieren - siehe aktuelle Anleitung dort https://debian.fhem.de/<br />
wget -O- https://debian.fhem.de/archive.key | gpg --dearmor > /usr/share/keyrings/debianfhemde-archive-keyring.gpg<br />
echo "deb [signed-by=/usr/share/keyrings/debianfhemde-archive-keyring.gpg] https://debian.fhem.de/nightly/ /" >> /etc/apt/sources.list<br />
apt update<br />
apt install fhem<br />
</syntaxhighlight><br />
<br />
==== Das offizielle Release ====<br />
Man kann FHEM mit dem Debian-Paket von [https://fhem.de/#Installation fhem.de] installieren. Dieser Weg führt zu einem offiziellen Release, welches aber unter Umständen erheblich vom aktuellen Versions- und Diskussionsstand im Forum abweicht. <br />
<br />
Alternativ kann man auch den manuellen Weg von https://debian.fhem.de/ wählen.<br />
<br />
==== Empfohlener Patch ====<br />
Da gerade auf dem Raspberry die automatische Erkennung der USB Schnittstellen zu 100% CPU Last führt (FHEM träge und reagiert nicht), wird empfohlen sofort nach der Installation noch diesen "Patch" auszuführen: FHEM starten, wenn alle USB-Geräte ausgesteckt sind. Dann <code>attr initialUsbCheck disable 1</code> in der Kommandozeile in FHEMWEB eingeben, <code>save</code> ausführen und FHEM anschließen wieder mit eingesteckten USB-Geräten neu starten.<br />
<br />
==== Deinstallation ====<br />
Man kann FHEM auch wieder spurlos vom System entfernen und ganz von vorn beginnen. Allerdings sollte man sich im Klaren sein, damit ensteht kein jungfräuliches System!<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get purge fhem<br />
sudo apt-get autoremove<br />
</syntaxhighlight><br />
<br />
=== Zusatzpakete bei FHEM-Erst- und Zweitinstallation ===<br />
Nachdem der RPi eingerichtet ist, können weitere Pakete installiert werden. Keines davon ist zwingend erforderlich, um das Grundgerüst von FHEM betreiben zu können. Einige Pakete erhöhen aber den Bedienungskomfort, andere sind zur Nutzung bestimmter weiterer FHEM-Module (siehe {{Link2CmdRef}}) erforderlich. <br />
<br />
Hierzu wurden in letzter Zeit mehrere Hilfsmodule entwickelt, die insbesondere bei Wiederinstallation (etwa nach Absturz) wichtig sein können. So zeigt das Modul Installer die installierten Perl-Module an, siehe dazu {{Link2Forum|Topic=98381|LinkText=diesen Thread}}.<br />
<br />
Wenn man eine frühere Installation auf einer anderen SD-Karte installieren möchte und nicht mehr weiß, welche Zusatzpakete man auf der alten Karte installiert hatte, hilft (diese und nachfolgende Hinweise sind aus dem Blog [https://heinz-otto.blogspot.com/2019/07/infos-zur-installation-von-modulen-und.html])<br />
zcat $(ls -tr /var/log/apt/history.log.*.gz)|grep -A1 Start-Date<br />
weiter. Hier werden frühere Eingaben der Kommandozeile wiedergegeben. Es gibt einen analogen Befehl, um die mit CPAN installierten Pakete anzuzeigen. Dazu muss man das debian Paket perl-doc installiert haben und gibt dann ein<br />
for M in `perldoc -t perllocal|grep Module |sed -e 's/^.*" //'`; do V=`perldoc -t perllocal|awk "/$M/{y=1;next}y" |grep VERSION |head -n 1`; printf "%30s %s\n" "$M" "$V"; done |sort<br />
Ebenso kann man herausfinden, ob und durch welches debian-Paket das Perl-Paket installiert wurde. Die zweite Version sucht nur in Paketen die -perl im Namen tragen und läuft damit wesentlich schneller:<br />
s='Device::SerialPort' ## zu diesem Paket wird gesucht<br />
perl -M$s -e '' 2>/dev/null &&echo "Modul $s ist vorhanden"''<br />
for i in $(dpkg -l |grep ^ii| awk '{ print $2 }'|tr -d "\r"|tr "\n" " ");do if dpkg -L $i|grep $s &> /dev/null;then echo $i enthält $s;fi;done<br />
for i in $(dpkg -l |grep ^ii|grep '\-perl'| awk '{ print $2 }'|tr -d "\r"|tr "\n" " ");do if dpkg -L $i|grep $s &> /dev/null;then echo $i enthält $s;fi;done<br />
<br />
Es gibt gute Gründe, die Installation von Perl Modulen über debian-Pakete der Installation über cpan zu bevorzugen. Dazu zählt die Updatefähigkeit und die Geschwindigkeit. Man kann im Internet nach den Paketen suchen, man kann aber auch einfach die Verfügbarkeit für das lokale System testen. Dazu braucht man das Tool apt-file, welches man zuerst installieren muss. Der letzte Befehl lädt den Infocache lokal und dauert etwas:<br />
sudo apt-get update<br />
sudo apt-get install apt-file<br />
sudo apt-file update<br />
Die folgende Suche nutzt den Umstand, dass in der im Paket enthaltenen Liste der Dateien auch die Doku in der Form "/usr/share/man/man3/IO::File.3perl.gz" enthalten ist. Der search Befehl unten akzeptiert mehrere Modulnamen durch Zeilenumbruch getrennt. In dem Beispiel sind die Modulnamen in einem String durch Leerzeichen getrennt, die Trennung wird in Zeilenumbruch geändert, jede Zeile ergänzt und über stdin an den search Befehl von apt-file übergeben. Die Option -l bewirkt das nur die gefunden Pakete gelistet werden, werden mehrere der abgefragten Modulnamen in einem Paket gefunden, wird es nur einmal gelistet:<br />
s="IO::File Digest::MD5" ##Such-String<br />
echo $s|tr " " "\n"|sed 's/$/./;s/^/\//'|apt-file search -l -f -<br />
<br />
Zuletzt eine Übersicht diverser Zusatzpakete.<br />
{| class="wikitable"<br />
! style="width:10%" | Beschreibung<br />
! style="width:10%" | Paketname<br />
! style="width:50%" | Kontext<br />
! style="width:30%" | Installieren<br />
|-<br />
|Zeitserver<br />
|ntpdate<br />
|Setzt die Systemzeit bei Start des RPi. Wird für FHEM benötigt, da es sonst nicht startet.<br />
|<code>sudo apt-get install ntpdate<br />
sudo ntpdate -u de.pool.ntp.org</code><br />
|-<br />
|Perl JSON<br />
|JSON<br />
|Wird von einigen Modulen benötigt, z.B. harmony, iTunes<br />
|<code>sudo apt-get install libjson-perl</code><br />
|-<br />
|Samba-Server<br />
|samba<br />
|Mittels Samba kann man z.B. den Ordner /opt/fhem als Share freigeben. Dieser Share kann z.B. im Windows-Explorer als Laufwerk verbunden werden, so dass die Bearbeitung von config- und Programmdateien bequem möglich ist. Hier eine hilfreiche [https://www.elektronik-kompendium.de/sites/raspberry-pi/2007071.htm Kurzanleitung] aus der (wenn man auf einen speziellen user verzichtet) nur die Einträge für smb.conf gesetzt werden müssen.<br />
|<code>sudo apt-get install samba cifs-utils</code><br />
Danach muss der share definiert werden mittels<br />
<br />
<code>sudo nano /etc/samba/smb.conf</code><br />
|-<br />
|Mailversand<br />
|sendemail (alt: sendEmail)<br />
|Wird benötigt, um Mails versenden zu können, bspw. für Alarm-Benachrichtigungen.<br />
Nach Installation des Paketes benötigt man noch eine Routine in FHEM gemäß [[E-Mail senden#Raspberry Pi]]<br />
|<code>sudo apt-get install sendemail</code> bzw. <code>sudo apt-get install sendEmail</code><br />
|-<br />
|Wake-on-LAN<br />
|etherwake<br />
|Wird z.B. für das Modul WOL benötigt.<br />
|<code>sudo apt-get install etherwake</code><br />
|-<br />
|Perl Telnet<br />
|telnet<br />
|Wurde vor Fritz!OS 6.2x z.B. für das Modul [[FRITZBOX]] benötigt, da es eine im Netzwerk vorhandene Fritzbox über deren Telnet-Port ansprach. Mittlerweile wird TR-64 und SOAP verwendet.<br />
|<code>sudo apt-get install libnet-telnet-perl</code><br />
|-<br />
|Socat<br />
|socat<br />
|Kann verwendet werden, um auf anderen Rechnern im Netzwerk Linux-Befehle oder Skripts auszuführen. Auch können auf Slave-FHEM-Installationen Befehl ausgeführt werden, z.B. mit <br />
<br />
<code><nowiki>system("echo 'set lampe on' | /usr/bin/socat - TCP:1.2.3.4:7072");</nowiki></code><br />
<br />
1.2.3.4 muss natürlich durch die IP-Adresse des Zielrechners ersetzt werden.<br />
|<code>sudo apt-get install socat</code><br />
|-<br />
|Libcrypt<br />
|Libcrypt<br />
|Perl libcrypt, erforderlich falls Homematic-devices mit AES verwendet werden sollen.<br />
|<code>sudo apt-get install libcrypt-rijndael-perl</code><br />
|-<br />
|libdatetime<br />
|libdatetime<br />
|Perl libdatetime, erforderlich für das Weather-Modul.<br />
|<code>sudo apt-get install libdatetime-format-strptime-perl</code><br />
|-<br />
|EnOcean XML functions<br />
|libxml simple<br />
|Perl XML::SIMPLE, erforderlich für die XML Funktionen des ENOCEAN Moduls.<br />
|<code>sudo apt-get install libxml-simple-perl</code><br />
|-<br />
|EnOcean Cryptographic functions<br />
|libcrypt-random-source-perl<br />
|Perl Crypt::Random, erforderlich für die Cryptographic Funktionen des ENOCEAN Moduls.<br />
|<code>sudo /usr/bin/perl -MCPAN -e 'install Crypt::Random'</code><br />
|}<br />
<br />
== Bekannte Probleme ==<br />
=== Netzteil ===<br />
Der RPi verwendet ein USB Netzteil als Spannungsversorgung. Gemessen kann der RPi allein bereits um die 900mA Strom fordern. Das bringt kleine Netzteile, besonders wenn noch CULs oder WLAN Sticks an USB hängen schnell an die Grenze. Die Fehler die daraus resultieren sind Abstürze, Netzwerkprobleme uvm. Daher bitte ein ausreichend starkes Netzteil mit mind. 2000mA oder einen aktiven USB-HUB für die Periperie verwenden.<br />
<br />
=== Kabel (Micro-USB) ===<br />
Auch das verwendete Kabel kann einen (großen) Unterschied machen. Billige Kabel haben sehr dünne Kupferadern, die auf größeren Strecken (bereits ab 30cm!) einen Spannungsabfall verursachen können, der sonst nicht nachvollziehbare Probleme (Festplattenausfall, SD-Kartenausfall etc.) auslöst. Siehe beispielsweise diesen Thread mit einer Tabelle, die die Höhe des Spannungsabfalls explizit beschreibt: [https://forum.fhem.de/index.php/topic,127508.0.html Link zum Forum] <br />
<br />
=== Echtzeituhr ===<br />
Der RPi hat keine [http://de.wikipedia.org/wiki/Echtzeituhr Real-Time-Clock] (RTC), das heißt, dass er nach einem Neustart keine gültige (im Sinne von aktuell) Systemzeit hat, sondern ein Datum in der Vergangenheit. Dieses Problem wird sinnvollerweise mit einer [http://de.wikipedia.org/wiki/Network_Time_Protocol NTP-Konfiguration] oder durch [[Raspberry Pi: RTC Hat|Installation einer Echtzeituhr]] umgangen.<br />
<br />
Dabei muss Sorge getragen werden, dass der [http://wiki.debian.org/NTP ntpd] schon einen Datums-/Zeitabgleich gemacht hat, bevor FHEM gestartet wird. Geschieht der Abgleich nicht vorher, sondern erst nachdem FHEM schon läuft, stellt FHEM die Logs zwar auf das nun aktuelle Datum um (die "alten" Logs mit dem eigentlich ungültigen Datum werden natürlich behalten), aber irgendetwas scheint FHEM dabei so zu belasten, dass es eine Last von über 0.8 bis 0.9 erzeugt. Diese Last besteht auf Dauer und verschwindet erst, wenn man das Ganze sauber durchkonfiguriert und FHEM neu gestartet hat. Die hohe Systemauslastung zeigt sich auch in einem sehr trägen Laden der FHEM-Webseiten in einem beliebigen Browser. (siehe {{Link2Forum|Topic=70741}})<br />
<br />
=== Last durch Backup (während update) ===<br />
Bei einen [[Update]] von FHEM durch den Befehl <code>update</code> kann durch Setzen des Attributs "<code>attr global backup_before_update 1</code>" automatisch vorab ein [[Backup]] durchgeführt werden. Die (ggf. großen) Log-Dateien werden dabei ebenfalls archiviert. Während der Archivierung ist FHEM blockiert. Durch die beschränkte Leistungsfähigkeit des Raspberry Pi kann das Backup zudem lange dauern. Durch ein "<code>attr global updateInBackground 1</code>" wird ein Backup im Hintergrund ausgeführt (Quelle: {{Link2Forum|Topic=15729}}). <br />
<br />
Alternative Möglichkeiten: <br />
* Backup ausschalten und manuell durchführen <br />
* Backup-Befehl anpassen und so große Dateien bzw. Verzeichnisse (log/) nicht archivieren<br />
<br />
== Watchdog einrichten ==<br />
Man kann den RPi regelmäßig prüfen lassen, ob FHEM noch läuft und gegebenenfalls einen Neustart durchführen lassen. Eine mögliche Vorgehensweise ist in diesem {{Link2Forum|Topic=20553|LinkText=Forumsthema}} beschrieben.<br />
{{Hinweis|Statt des Einsatzes derartiger Methoden ist zu empfehlen, nach der eigentliche Fehlerursache zu forschen und diese abzustellen. Haben Sie dennoch einen solchen Watchdog eingerichtet, sollten Sie bei Fragen zu Ihnen seltsam erscheinenden Phänomänen im Forum darauf hinweisen, auch wenn die Symptome scheinbar nichts mit dem Watchdog zu tun haben sollten.}}<br />
<br />
== Interne Links ==<br />
* [[CUL am Raspberry Pi flashen]]<br />
* [[Raspberry Pi und 1-Wire]]<br />
<br />
== Externe Links ==<br />
* {{Link2Forum|Topic=33460|Message=264679}} zum Umzug von Raspberry B auf Raspberry Pi 2<br />
* [http://www.raspberrypi.org/ Offizielle Webseite der Raspberry Pi Foundation]<br />
* [http://www.raspberrypi.org/downloads Offizielle Downloads der Raspberry Pi Foundation]<br />
<br />
[[Kategorie:Raspberry Pi]]<br />
[[Kategorie:HOWTOS]]</div>Otto123http://wiki.fhem.de/w/index.php?title=Raspberry_Pi&diff=38730Raspberry Pi2023-11-25T12:27:35Z<p>Otto123: /* Verwendung UART für Zusatzmodule */ Notiz zu Bookworm eingefügt</p>
<hr />
<div>Beim [[Raspberry Pi]] handelt es sich um einen postkartengroßen Einplatinen-Computer, der von der Raspberry Pi Foundation entwickelt wird. Die Hardware basiert auf dem BCM 283x SoC (System-on-Chip) von Broadcom, einem ARM-Prozessor. Zu Hardwaredetails und den verschiedenen Modellen sowie Produktentwicklungen siehe [http://de.wikipedia.org/wiki/Raspberry_Pi#Hardware Wikipedia].<br />
Dank der kleinen Abmessungen, dem recht geringen Energieverbrauch (bis ca. 4 Watt) sowie der günstigen Anschaffungskosten (ca. 30€) ist der Raspberry Pi eine attraktive Hardware für die Heimautomatisierung mit FHEM. Er ist dank dem Linux-Betriebssystem vollständig kompatibel zur aktuell vorhandenen und von FHEM unterstützen Hardware. Das derzeit empfohlene Standard-Image zum Betrieb des Raspberry Pi ist die auf Debian basierende Raspberry Pi OS Distribution (ab Mitte 2019 ''Buster'').<br />
<br />
== Installation / Setup ==<br />
=== Betriebssystem ===<br />
====Vorbemerkung====<br />
Raspberry Pi OS ist direkt bei raspberrybi.org unter https://www.raspberrypi.org/downloads/raspberry-pi-os/ herunterladbar. Die folgende Anleitung gilt für die lite-Version ohne grafischen Desktop und für die Modelle für B, B+, B2, B3, B3+, Zero W. (Stand Juni 2018)<br />
<br />
Alle in diesem Abschnitt verwendeten Code Blöcke benötigen root Rechte. Deshalb bitte immer am Besten im Kontext <code>sudo su</code> ausführen. Man kann auch einzelne Befehle mit sudo davor ausführen, allerdings wird die Berechtigung bei Pipe Befehlen nicht durchgereicht. Einige dieser Kommandos funktionieren in der angegebenen Form nicht unter der Wheezy-Version [https://en.wikipedia.org/wiki/Raspberry_Pi_OS#Release_history] des RPi OS. Läuft der betreffende RPi noch unter Wheezy, ist ein Upgrade des RPi OS empfehlenswert.<br />
<br />
Alle Dateien müssen im Linux-Format (nur LF als Zeilenende) erzeugt/editiert werden! Unbedingt einen geeigneten Editor verwenden und auf das Format beim Speichern achten!<br />
<br />
====SD-Karte vorbereiten====<br />
Die heruntergeladene Datei muss entpackt und auf die Speicherkarte geschrieben werden. Es gibt dazu verschiedene Tools je nach Betriebssystem. Für Windows ist windisk32imager zu empfehlen, Projektseite [https://sourceforge.net/projects/win32diskimager/]. Für Mac OS gibt es den Pi Filler.<br />
<br />
Detaillierte Anleitungen zur Vorgehensweise finden sich für die Betriebssysteme Linux, Mac OS und Windows unter [https://www.raspberrypi.org/documentation/installation/installing-images/README.md Writing an image to the SD card]<br />
<br />
Die SD Card enthält nun zwei Partitionen/Laufwerke, wobei das erste Laufwerk unter alle Betriebssystemen lesbar ist. In diesem Laufwerk (/boot) müssen jetzt noch zwei Dateien erzeugt werden:<br />
* eine leere Datei mit dem Namen ssh, um den (headless) Zugriff per ssh zu ermöglichen (Pi Filler macht dies automatisch). Hinweis: Eine spätere Aktivierung von SSH ist mit <code>sudo raspi-config</code> (Punkt 5 "Interfacing Options", dann Punkt 2 SSH) möglich, erfordert dann aber Tastatur und Monitor am RPi.<br />
* eine Textdatei im Linux Format mit Namen wpa_supplicant.conf und folgendem Inhalt, wenn der Pi sofort mit WLAN starten soll.<br />
<br />
<pre>country=DE<br />
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev<br />
update_config=1<br />
network={<br />
ssid="FRITZ!Box 7490"<br />
psk="12345678901234567890" <br />
}<br />
</pre><br />
* SD Karte auswerfen.<br />
* SD Karte in Raspberry Pi stecken und booten.<br />
<br />
Alternativ kann auch Monitor und Tastatur verwendet werden.<br />
<br />
====Anmeldung und Grundkonfiguration====<br />
Default raspberrypi-os: Host raspberrypi, User pi, Passwort raspberry <br />
<br />
Default ubuntu: Host ubuntu, User ubuntu, Passwort ubuntu<br />
<br />
Anmeldung entweder lokal oder mit dem Befehl: ssh <user>@<hostname><br />
<br />
Das Passwort sollte geändert werden, dazu dem Sicherheitshinweis folgen und <code>passwd</code> eingeben.<br />
<br />
Alle unten genannten Befehle müssen mit erhöhten Rechten ausgeführt werden (z. B. sudo)!<br />
<br />
Als Erstes sollte: Zeitzone, Sprache und Hostname angepasst werden. <br />
Entweder Menügeführt mit <code>sudo raspi-config</code> <br />
oder per Script / Shell Befehle:<br />
<br />
<syntaxhighlight lang="bash"># Zeitzone einstellen & Zeitsynchronisierung über das Internet aktivieren<br />
timedatectl set-timezone Europe/Berlin<br />
timedatectl set-ntp true<br />
<br />
# Konfigurieren lokale Sprache deutsch<br />
sed -i -e 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/' /etc/locale.gen<br />
locale-gen<br />
localectl set-locale LANG=de_DE.UTF-8 LANGUAGE=de_DE<br />
<br />
# Hostname <br />
hostnamectl set-hostname mymachine<br />
<br />
# System aktualisieren <br />
apt-get update<br />
apt-get upgrade<br />
<br />
#Neustart<br />
reboot</syntaxhighlight><br />
<br />
Am Anfang sollte man Befehle nicht verketten, sondern immer auf die Ausgabe warten (es sei denn, man hat Erfahrung): also kein <code>apt-get update && apt-get upgrade </code>. Ebenso sollte man nicht mit automatischen Bestätigungen arbeiten, also kein upgrade mit "-y". Nach einer Installation ist ein aufräumen immer gut, also:<br />
<syntaxhighlight lang="bash"><br />
apt-get autoremove<br />
apt-get clean<br />
apt-get purge $(dpkg --get-selections | grep deinstall | cut -f1 | xargs)<br />
</syntaxhighlight><br />
<br />
====Verwendung UART für Zusatzmodule====<br />
Einige Aufsteckmodule (z.B. HM-MOD-RPI-PCB) für den GPIO Port verwenden die serielle Schnittstelle UART. Der Zugriff auf diese serielle Schnittstelle erfordert eine modellabhängige Konfiguration.<br />
<br />
Bei allen Modellen muss die Verwendung der seriellen Linux console an ttyAMA0 deaktiviert werden:<br />
<syntaxhighlight lang="bash"># seriell-getty Dienst für ttyAMA0 dauerhaft deaktivieren<br />
systemctl stop serial-getty@ttyAMA0.service<br />
systemctl disable serial-getty@ttyAMA0.service<br />
systemctl mask serial-getty@ttyAMA0.service<br />
</syntaxhighlight><br />
Bei den Modellen mit Bluetooth muss die UART aktiviert und umkonfiguriert werden. Hier ein bash Script, welches die Originaldatei entsprechend modifiziert:<br />
{{Randnotiz|RNTyp=Info|RNText=Im aktuellen Raspberry OS Bookworm Image ist die config.txt in den Pfad /boot/firmware gewandert. Es existiert aber ein Link, man kann arbeiten wie bisher.}}<syntaxhighlight lang="bash"><br />
# serielle Schnittstelle aktivieren und mit BT Schnittstelle tauschen<br />
# für Raspberry Pi OS<br />
config="/boot/config.txt"<br />
# für Ubuntu<br />
#config="/boot/firmware/usercfg.txt"<br />
<br />
bash -c "cat <<EOF >> $config<br />
enable_uart=1<br />
dtoverlay=miniuart-bt<br />
core_freq=250<br />
EOF"<br />
</syntaxhighlight><br />
Wer dem nicht traut, der editiert die Datei von Hand (Linux Editor!) und fügt am Ende die drei Zeilen aus dem Script ein, die vor EOF stehen.<br />
<br />
Die config Datei von ubuntu verwendet den Befehl include usercfg.txt. Mit Erscheinen des Pi 4 wurden die overlay Dateien umbenannt (Start mit Pi3- entfernt) die alten Namen funktionieren aber noch.<br />
<br />
Um die Konfiguration abzuschließen ist ein Neustart erforderlich<br />
<syntaxhighlight lang="bash">#Neustart erforderlich <br />
reboot</syntaxhighlight><br />
<br />
====Troubleshooting====<br />
'''Kontrolle der seriellen Schnittstelle'''<br />
<br />
Der Befehl <code>ls -l /dev/ttyAMA0</code> muss folgende Ausgabe liefern.<br />
crw-rw---- 1 root dialout 204, 64 Jun 7 22:56 /dev/ttyAMA0<br />
Sollte dies nicht der Fall sein, muss der Dienst serial-getty@ttyAMA0.service deaktiviert werden!<br />
<br />
Kontrolle der Verlinkung von /dev/serial*<br />
<br />
Der Befehl <code>ls -l /dev/serial*</code> muss folgende Ausgabe liefern.<br />
* Bei Modellen mit BT und richtiger Konfiguration (funktioniert nur unter Raspberry Pi OS)<br />
lrwxrwxrwx 1 root root 7 Jun 7 22:55 /dev/serial0 -> ttyAMA0<br />
lrwxrwxrwx 1 root root 5 Jun 7 22:55 /dev/serial1 -> ttyS0<br />
* Bei den Modellen ohne BT und richtiger Konfiguration<br />
lrwxrwxrwx 1 root root 7 Jun 8 18:30 /dev/serial0 -> ttyAMA0<br />
Sollte das nicht der Fall sein, sind die Einträge in der /boot/config.txt fehlerhaft. <br />
<br />
Sollte die serielle Schnittstelle unerwartet nicht funktionieren, kann auch andere Software daran Schuld sein, weil diese einfach versucht, alle Schnittstellen abzufragen / zu initialisieren. Für die Fehlersuche ist es also wichtig zu wissen, welche Software so installiert wurde, speziell wenn diese serielle Schnitttstellen (USB) verwendet / verwenden will. Ein Beispiel (deconz/conbee) wird in {{Link2Forum|Topic=116428|Message=1107317|LinkText=diesem Forenbeitrag}} behandelt. <br />
<br />
Bei einem Raspberry 4 stört unter Umständen die Temperaturkontrolle des Lüfters, siehe auch Abschnitt bekannte Probleme: [[HM-MOD-RPI-PCB HomeMatic Funkmodul für Raspberry Pi]]. <br />
<br />
'''Kontrolle Bluetooth'''<br />
<br />
Die Funktion von Bluetooth kann mit dem hcitool überprüft werden. Mit <code>hcitool dev</code> wird das interne BT Gerät mit MAC Adresse angezeigt. Mit <code>hcitool scan</code> bzw. <code>hcitool lescan</code> kann nach sichtbaren Geräten gesucht werden.<br />
<br />
Weitergehende Informationen zur Anpassung der Konfiguration von Raspberry Pi OS sind nachzulesen auf https://www.raspberrypi.org/documentation/configuration/.<br />
<br />
Sollte die Bluetooth Schnittstelle nach der Installation von FHEM nicht funktionieren, hilft es den Dienst abhängig zu starten, siehe diesen Wiki Artikel [[Fhem.service (systemd unit file)]] <br />
<br />
=== FHEM ===<br />
Die Installation von FHEM kann nach der Raspberry Pi OS Installation sehr einfach über das Debian-Repository [http://debian.fhem.de] erfolgen. <br />
* Es wird unbedingt empfohlen zur Grundinstallation zunächst keine Module, USB Sticks oder ähnliche Zusatzbaugruppen an den IO Ports des Raspberry gesteckt zu haben. <br />
* Dieser Abschnitt beschreibt nur die Grundinstallation von FHEM auf einem Raspberry Pi mit Raspberry Pi OS! <br />
* Weitere Installationsschritte sind je nach verwendeten FHEM-Modulen notwendig. <br />
** Informationen hierzu liefert üblicherweise die {{Link2CmdRef}} zum jeweiligen Modul.<br />
** Den weiteren Einstieg in FHEM findet man im Artikel [[Quick-Start]]<br />
<br />
==== Der einfache Weg zum aktuellen System ====<br />
Der folgende Befehlsblock ist die praktische Umsetzung der Beschreibung auf http://debian.fhem.de. Bitte unbedingt vor Installation rückversichern, ob es dort (insbesondere unter ''The easy way: use apt-get'') Aktualisierungen gab. <br />
* Dieser Befehlsblock erfordert erhöhte Rechte, also bitte als Erstes <code>sudo su</code> ausführen!<br />
* Beim Kopieren aufpassen! Jede Zeile muss einzeln ausgeführt werden!<br />
Dieser Befehlsblock gilt ab der Version ''debian buster'' als veraltet (es gibt Sicherheitsbedenken), muss aber bis einschließlich ''debian stretch'' eingesetzt werden.<br />
<syntaxhighlight lang="bash"><br />
# von debian.fhem.de installieren - siehe aktuelle Anleitung dort https://debian.fhem.de/<br />
wget -qO - https://debian.fhem.de/archive.key | apt-key add -<br />
echo "deb http://debian.fhem.de/nightly/ /" >> /etc/apt/sources.list<br />
apt-get update<br />
apt-get install fhem<br />
</syntaxhighlight><br />
Dieser Befehlsblock funktioniert erst ab ''debian buster'' (erfordert erhöhte Rechte <code>sudo su</code>)<br />
<syntaxhighlight lang="bash"><br />
# Bei manchen debian Distributionen fehlt das Paket gpg -> nachinstallieren<br />
apt update<br />
apt install gpg<br />
# von debian.fhem.de installieren - siehe aktuelle Anleitung dort https://debian.fhem.de/<br />
wget -O- https://debian.fhem.de/archive.key | gpg --dearmor > /usr/share/keyrings/debianfhemde-archive-keyring.gpg<br />
echo "deb [signed-by=/usr/share/keyrings/debianfhemde-archive-keyring.gpg] https://debian.fhem.de/nightly/ /" >> /etc/apt/sources.list<br />
apt update<br />
apt install fhem<br />
</syntaxhighlight><br />
<br />
==== Das offizielle Release ====<br />
Man kann FHEM mit dem Debian-Paket von [https://fhem.de/#Installation fhem.de] installieren. Dieser Weg führt zu einem offiziellen Release, welches aber unter Umständen erheblich vom aktuellen Versions- und Diskussionsstand im Forum abweicht. <br />
<br />
Alternativ kann man auch den manuellen Weg von https://debian.fhem.de/ wählen.<br />
<br />
==== Empfohlener Patch ====<br />
Da gerade auf dem Raspberry die automatische Erkennung der USB Schnittstellen zu 100% CPU Last führt (FHEM träge und reagiert nicht), wird empfohlen sofort nach der Installation noch diesen "Patch" auszuführen: FHEM starten, wenn alle USB-Geräte ausgesteckt sind. Dann <code>attr initialUsbCheck disable 1</code> in der Kommandozeile in FHEMWEB eingeben, <code>save</code> ausführen und FHEM anschließen wieder mit eingesteckten USB-Geräten neu starten.<br />
<br />
==== Deinstallation ====<br />
Man kann FHEM auch wieder spurlos vom System entfernen und ganz von vorn beginnen. Allerdings sollte man sich im Klaren sein, damit ensteht kein jungfräuliches System!<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get purge fhem<br />
sudo apt-get autoremove<br />
</syntaxhighlight><br />
<br />
=== Zusatzpakete bei FHEM-Erst- und Zweitinstallation ===<br />
Nachdem der RPi eingerichtet ist, können weitere Pakete installiert werden. Keines davon ist zwingend erforderlich, um das Grundgerüst von FHEM betreiben zu können. Einige Pakete erhöhen aber den Bedienungskomfort, andere sind zur Nutzung bestimmter weiterer FHEM-Module (siehe {{Link2CmdRef}}) erforderlich. <br />
<br />
Hierzu wurden in letzter Zeit mehrere Hilfsmodule entwickelt, die insbesondere bei Wiederinstallation (etwa nach Absturz) wichtig sein können. So zeigt das Modul Installer die installierten Perl-Module an, siehe dazu {{Link2Forum|Topic=98381|LinkText=diesen Thread}}.<br />
<br />
Wenn man eine frühere Installation auf einer anderen SD-Karte installieren möchte und nicht mehr weiß, welche Zusatzpakete man auf der alten Karte installiert hatte, hilft (diese und nachfolgende Hinweise sind aus dem Blog [https://heinz-otto.blogspot.com/2019/07/infos-zur-installation-von-modulen-und.html])<br />
zcat $(ls -tr /var/log/apt/history.log.*.gz)|grep -A1 Start-Date<br />
weiter. Hier werden frühere Eingaben der Kommandozeile wiedergegeben. Es gibt einen analogen Befehl, um die mit CPAN installierten Pakete anzuzeigen. Dazu muss man das debian Paket perl-doc installiert haben und gibt dann ein<br />
for M in `perldoc -t perllocal|grep Module |sed -e 's/^.*" //'`; do V=`perldoc -t perllocal|awk "/$M/{y=1;next}y" |grep VERSION |head -n 1`; printf "%30s %s\n" "$M" "$V"; done |sort<br />
Ebenso kann man herausfinden, ob und durch welches debian-Paket das Perl-Paket installiert wurde. Die zweite Version sucht nur in Paketen die -perl im Namen tragen und läuft damit wesentlich schneller:<br />
s='Device::SerialPort' ## zu diesem Paket wird gesucht<br />
perl -M$s -e '' 2>/dev/null &&echo "Modul $s ist vorhanden"''<br />
for i in $(dpkg -l |grep ^ii| awk '{ print $2 }'|tr -d "\r"|tr "\n" " ");do if dpkg -L $i|grep $s &> /dev/null;then echo $i enthält $s;fi;done<br />
for i in $(dpkg -l |grep ^ii|grep '\-perl'| awk '{ print $2 }'|tr -d "\r"|tr "\n" " ");do if dpkg -L $i|grep $s &> /dev/null;then echo $i enthält $s;fi;done<br />
<br />
Es gibt gute Gründe, die Installation von Perl Modulen über debian-Pakete der Installation über cpan zu bevorzugen. Dazu zählt die Updatefähigkeit und die Geschwindigkeit. Man kann im Internet nach den Paketen suchen, man kann aber auch einfach die Verfügbarkeit für das lokale System testen. Dazu braucht man das Tool apt-file, welches man zuerst installieren muss. Der letzte Befehl lädt den Infocache lokal und dauert etwas:<br />
sudo apt-get update<br />
sudo apt-get install apt-file<br />
sudo apt-file update<br />
Die folgende Suche nutzt den Umstand, dass in der im Paket enthaltenen Liste der Dateien auch die Doku in der Form "/usr/share/man/man3/IO::File.3perl.gz" enthalten ist. Der search Befehl unten akzeptiert mehrere Modulnamen durch Zeilenumbruch getrennt. In dem Beispiel sind die Modulnamen in einem String durch Leerzeichen getrennt, die Trennung wird in Zeilenumbruch geändert, jede Zeile ergänzt und über stdin an den search Befehl von apt-file übergeben. Die Option -l bewirkt das nur die gefunden Pakete gelistet werden, werden mehrere der abgefragten Modulnamen in einem Paket gefunden, wird es nur einmal gelistet:<br />
s="IO::File Digest::MD5" ##Such-String<br />
echo $s|tr " " "\n"|sed 's/$/./;s/^/\//'|apt-file search -l -f -<br />
<br />
Zuletzt eine Übersicht diverser Zusatzpakete.<br />
{| class="wikitable"<br />
! style="width:10%" | Beschreibung<br />
! style="width:10%" | Paketname<br />
! style="width:50%" | Kontext<br />
! style="width:30%" | Installieren<br />
|-<br />
|Zeitserver<br />
|ntpdate<br />
|Setzt die Systemzeit bei Start des RPi. Wird für FHEM benötigt, da es sonst nicht startet.<br />
|<code>sudo apt-get install ntpdate<br />
sudo ntpdate -u de.pool.ntp.org</code><br />
|-<br />
|Perl JSON<br />
|JSON<br />
|Wird von einigen Modulen benötigt, z.B. harmony, iTunes<br />
|<code>sudo apt-get install libjson-perl</code><br />
|-<br />
|Samba-Server<br />
|samba<br />
|Mittels Samba kann man z.B. den Ordner /opt/fhem als Share freigeben. Dieser Share kann z.B. im Windows-Explorer als Laufwerk verbunden werden, so dass die Bearbeitung von config- und Programmdateien bequem möglich ist. Hier eine hilfreiche [https://www.elektronik-kompendium.de/sites/raspberry-pi/2007071.htm Kurzanleitung] aus der (wenn man auf einen speziellen user verzichtet) nur die Einträge für smb.conf gesetzt werden müssen.<br />
|<code>sudo apt-get install samba cifs-utils</code><br />
Danach muss der share definiert werden mittels<br />
<br />
<code>sudo nano /etc/samba/smb.conf</code><br />
|-<br />
|Mailversand<br />
|sendemail (alt: sendEmail)<br />
|Wird benötigt, um Mails versenden zu können, bspw. für Alarm-Benachrichtigungen.<br />
Nach Installation des Paketes benötigt man noch eine Routine in FHEM gemäß [[E-Mail senden#Raspberry Pi]]<br />
|<code>sudo apt-get install sendemail</code> bzw. <code>sudo apt-get install sendEmail</code><br />
|-<br />
|Wake-on-LAN<br />
|etherwake<br />
|Wird z.B. für das Modul WOL benötigt.<br />
|<code>sudo apt-get install etherwake</code><br />
|-<br />
|Perl Telnet<br />
|telnet<br />
|Wurde vor Fritz!OS 6.2x z.B. für das Modul [[FRITZBOX]] benötigt, da es eine im Netzwerk vorhandene Fritzbox über deren Telnet-Port ansprach. Mittlerweile wird TR-64 und SOAP verwendet.<br />
|<code>sudo apt-get install libnet-telnet-perl</code><br />
|-<br />
|Socat<br />
|socat<br />
|Kann verwendet werden, um auf anderen Rechnern im Netzwerk Linux-Befehle oder Skripts auszuführen. Auch können auf Slave-FHEM-Installationen Befehl ausgeführt werden, z.B. mit <br />
<br />
<code><nowiki>system("echo 'set lampe on' | /usr/bin/socat - TCP:1.2.3.4:7072");</nowiki></code><br />
<br />
1.2.3.4 muss natürlich durch die IP-Adresse des Zielrechners ersetzt werden.<br />
|<code>sudo apt-get install socat</code><br />
|-<br />
|Libcrypt<br />
|Libcrypt<br />
|Perl libcrypt, erforderlich falls Homematic-devices mit AES verwendet werden sollen.<br />
|<code>sudo apt-get install libcrypt-rijndael-perl</code><br />
|-<br />
|libdatetime<br />
|libdatetime<br />
|Perl libdatetime, erforderlich für das Weather-Modul.<br />
|<code>sudo apt-get install libdatetime-format-strptime-perl</code><br />
|-<br />
|EnOcean XML functions<br />
|libxml simple<br />
|Perl XML::SIMPLE, erforderlich für die XML Funktionen des ENOCEAN Moduls.<br />
|<code>sudo apt-get install libxml-simple-perl</code><br />
|-<br />
|EnOcean Cryptographic functions<br />
|libcrypt-random-source-perl<br />
|Perl Crypt::Random, erforderlich für die Cryptographic Funktionen des ENOCEAN Moduls.<br />
|<code>sudo /usr/bin/perl -MCPAN -e 'install Crypt::Random'</code><br />
|}<br />
<br />
== Bekannte Probleme ==<br />
=== Netzteil ===<br />
Der RPi verwendet ein USB Netzteil als Spannungsversorgung. Gemessen kann der RPi allein bereits um die 900mA Strom fordern. Das bringt kleine Netzteile, besonders wenn noch CULs oder WLAN Sticks an USB hängen schnell an die Grenze. Die Fehler die daraus resultieren sind Abstürze, Netzwerkprobleme uvm. Daher bitte ein ausreichend starkes Netzteil mit mind. 2000mA oder einen aktiven USB-HUB für die Periperie verwenden.<br />
<br />
=== Kabel (Micro-USB) ===<br />
Auch das verwendete Kabel kann einen (großen) Unterschied machen. Billige Kabel haben sehr dünne Kupferadern, die auf größeren Strecken (bereits ab 30cm!) einen Spannungsabfall verursachen können, der sonst nicht nachvollziehbare Probleme (Festplattenausfall, SD-Kartenausfall etc.) auslöst. Siehe beispielsweise diesen Thread mit einer Tabelle, die die Höhe des Spannungsabfalls explizit beschreibt: [https://forum.fhem.de/index.php/topic,127508.0.html Link zum Forum] <br />
<br />
=== Echtzeituhr ===<br />
Der RPi hat keine [http://de.wikipedia.org/wiki/Echtzeituhr Real-Time-Clock] (RTC), das heißt, dass er nach einem Neustart keine gültige (im Sinne von aktuell) Systemzeit hat, sondern ein Datum in der Vergangenheit. Dieses Problem wird sinnvollerweise mit einer [http://de.wikipedia.org/wiki/Network_Time_Protocol NTP-Konfiguration] oder durch [[Raspberry Pi: RTC Hat|Installation einer Echtzeituhr]] umgangen.<br />
<br />
Dabei muss Sorge getragen werden, dass der [http://wiki.debian.org/NTP ntpd] schon einen Datums-/Zeitabgleich gemacht hat, bevor FHEM gestartet wird. Geschieht der Abgleich nicht vorher, sondern erst nachdem FHEM schon läuft, stellt FHEM die Logs zwar auf das nun aktuelle Datum um (die "alten" Logs mit dem eigentlich ungültigen Datum werden natürlich behalten), aber irgendetwas scheint FHEM dabei so zu belasten, dass es eine Last von über 0.8 bis 0.9 erzeugt. Diese Last besteht auf Dauer und verschwindet erst, wenn man das Ganze sauber durchkonfiguriert und FHEM neu gestartet hat. Die hohe Systemauslastung zeigt sich auch in einem sehr trägen Laden der FHEM-Webseiten in einem beliebigen Browser. (siehe {{Link2Forum|Topic=70741}})<br />
<br />
=== Last durch Backup (während update) ===<br />
Bei einen [[Update]] von FHEM durch den Befehl <code>update</code> kann durch Setzen des Attributs "<code>attr global backup_before_update 1</code>" automatisch vorab ein [[Backup]] durchgeführt werden. Die (ggf. großen) Log-Dateien werden dabei ebenfalls archiviert. Während der Archivierung ist FHEM blockiert. Durch die beschränkte Leistungsfähigkeit des Raspberry Pi kann das Backup zudem lange dauern. Durch ein "<code>attr global updateInBackground 1</code>" wird ein Backup im Hintergrund ausgeführt (Quelle: {{Link2Forum|Topic=15729}}). <br />
<br />
Alternative Möglichkeiten: <br />
* Backup ausschalten und manuell durchführen <br />
* Backup-Befehl anpassen und so große Dateien bzw. Verzeichnisse (log/) nicht archivieren<br />
<br />
== Watchdog einrichten ==<br />
Man kann den RPi regelmäßig prüfen lassen, ob FHEM noch läuft und gegebenenfalls einen Neustart durchführen lassen. Eine mögliche Vorgehensweise ist in diesem {{Link2Forum|Topic=20553|LinkText=Forumsthema}} beschrieben.<br />
{{Hinweis|Statt des Einsatzes derartiger Methoden ist zu empfehlen, nach der eigentliche Fehlerursache zu forschen und diese abzustellen. Haben Sie dennoch einen solchen Watchdog eingerichtet, sollten Sie bei Fragen zu Ihnen seltsam erscheinenden Phänomänen im Forum darauf hinweisen, auch wenn die Symptome scheinbar nichts mit dem Watchdog zu tun haben sollten.}}<br />
<br />
== Interne Links ==<br />
* [[CUL am Raspberry Pi flashen]]<br />
* [[Raspberry Pi und 1-Wire]]<br />
<br />
== Externe Links ==<br />
* {{Link2Forum|Topic=33460|Message=264679}} zum Umzug von Raspberry B auf Raspberry Pi 2<br />
* [http://www.raspberrypi.org/ Offizielle Webseite der Raspberry Pi Foundation]<br />
* [http://www.raspberrypi.org/downloads Offizielle Downloads der Raspberry Pi Foundation]<br />
<br />
[[Kategorie:Raspberry Pi]]<br />
[[Kategorie:HOWTOS]]</div>Otto123http://wiki.fhem.de/w/index.php?title=Fhem.service_(systemd_unit_file)&diff=38523Fhem.service (systemd unit file)2023-08-01T09:44:20Z<p>Otto123: Typo im Code beseitigt</p>
<hr />
<div>Die Datei fhem.service ist ein systemd unit file und wird bei der debian Installation von FHEM mit ausgeliefert. Änderungen an dieser Datei sind normalerweise nicht notwendig. Man sollte zumindest genau wissen was man tut! Der Artikel soll die Datei etwas beschreiben und ein paar Fälle behandeln die ein Anpassung notwendig machen.<br />
==Unit File - ein paar kurze Erklärung==<br />
Den aktuellen Inhalt kann man jederzeit anschauen:<syntaxhighlight lang="bash"><br />
systemctl cat fhem<br />
</syntaxhighlight>Stand Mai 2020 hat die Datei folgenden Inhalt:<br />
<br />
=== Inhalt /etc/systemd/system/fhem.service ===<br />
<syntaxhighlight lang="bash"><br />
# $Id: fhem.service 19235 2019-04-21 13:26:17Z betateilchen $<br />
<br />
[Unit]<br />
Description=FHEM Home Automation<br />
Wants=network.target<br />
After=network.target<br />
#Requires=postgresql.service<br />
#After=postgresql.service<br />
#Requires=mysql.service<br />
#After=mysql.service<br />
<br />
[Service]<br />
Type=forking<br />
User=fhem<br />
Group=dialout<br />
WorkingDirectory=/opt/fhem<br />
ExecStart=/usr/bin/perl fhem.pl fhem.cfg<br />
#ExecStart=/usr/bin/perl fhem.pl configDB<br />
Restart=always<br />
<br />
[Install]<br />
WantedBy=multi-user.target<br />
</syntaxhighlight><br />
<br />
=== Erklärung ausgewählter Parameter ===<br />
'''Wants=''' die angegebene Services werden benötigt, fhem startet aber trotzdem falls die Services nicht gestartet werden können.<br />
<br />
'''Requires=''' wenn der Service nicht gestartet werden kann, wird fhem nicht gestartet.<br />
<br />
'''After=''' bewirkt, dass fhem nach dem Service (der Gruppe) gestartet wird.<br />
<br />
Das ist wichtig damit Services die für fhem notwendig sind schon gestartet sind. Benötig fhem z.B. Datenbanken sind die entsprechenden Zeilen einzubauen oder durch entfernen des Kommentarzeichens (#) zu aktivieren.<br />
<br />
'''User=fhem''' bewirkt das der Services mit user fhem gestartet wird. Falls fhem mit dem user root gestartet wird, startet fhem.pl einen neuen Prozess unter dem User fhem.<br />
<br />
'''Group=dialout''' Es wird die Gruppe dialout zum Start benutzt.<br />
<br />
Beide Zeilen können für den normalen Start von FHEM auch auskommentiert werden.<br />
<br />
=== Zusätzlicher Parameter ===<br />
'''ExecStartPre=''' Hier kann ein Shell Befehl stehen, der vor dem Start des eigentlichen Service (ExecStart=) ausgeführt wird.<br />
<br />
=== unit file bearbeiten ===<br />
Dieser Befehl editiert die (fhem.service) unit Datei mit dem Standard Editor (z.B. nano) und führt zum Abschluss auch ein daemon-reload durch.<syntaxhighlight lang="bash"><br />
sudo systemctl edit --full fhem<br />
</syntaxhighlight>Tipp: Datei speichern '''ctrl+s''' und Editor verlassen '''ctrl+x'''<br />
<br />
== Prozesse vor dem FHEM Start ausführen ==<br />
Ziel ist es sicherzustellen, dass für den Start von FHEM alle Voraussetzungen erfüllt sind, z.B.<br />
* Hardware aktiviert ([[COC]], [[FHEM_auf_Raspberry_PI_mit_COC_betreiben]], {{Link2Forum|Topic=106060|Message=1003767|LinkText=SCC Busware}}, [[HM-CFG-USB USB Konfigurations-Adapter|HM-CFG-USB]])<br />
* Datenbank gestartet<br />
* Systemprozess läuft (z.B. {{Link2Forum|Topic=110716|LinkText=Bluetooth gestartet}} <br />
* eigenen Prozessen ist gestartet <br />
* [[DWD OpenData|Sprache einstellen]]<br />
Dazu gibt es mehrere Lösungswege:<br />
* die Datei fhem.service modifizieren<br />
* einen separaten Service implementieren<br />
* Abhängigkeiten definieren<br />
<br />
=== Ein Script mit separater service unit starten ===<br />
Wir erstellen quasi einen eigenen Service - Vorteil: Die fhem.service braucht man nicht verändern.<br />
<br />
'''1. Script bereitstellen'''<br />
<br />
Das Beispiel hier in einem allgemeinerem Pfad:<syntaxhighlight lang="bash"><br />
sudo nano /usr/local/bin/EnableXX.sh<br />
</syntaxhighlight>Den Code (Beispiele am Ende) hier einfügen und die Datei speichern und Editor verlassen (ctrl+s ctrl+x).<br />
<br />
Hier kann meist der Original Scriptcode verwendet werden, der früher in das init.d Script eingefügt werden sollte.<br />
<br />
'''2. unit file erzeugen'''<br />
<br />
Man erstellt eine neues unit file.<syntaxhighlight lang="bash"><br />
sudo systemctl edit --full --force enablexx.service<br />
</syntaxhighlight>Mit folgendem Inhalt<syntaxhighlight lang="bash"><br />
[Unit]<br />
Description=EnableXX<br />
Before=fhem.service<br />
#After=network.target<br />
<br />
[Service]<br />
Type=oneshot<br />
ExecStart=bash /usr/local/bin/EnableXX.sh<br />
StandardOutput=journal<br />
<br />
[Install]<br />
WantedBy=multi-user.target<br />
</syntaxhighlight>Die Zeile Before=fhem.service stellt sicher, dass der Start vor FHEM erfolgt.<br />
<br />
'''3. Service aktivieren'''<syntaxhighlight lang="bash"><br />
#sudo systemctl daemon-reload # nur notwendig wenn nicht systemctl edit verwendet wurde<br />
sudo systemctl enable enablexx<br />
sudo systemctl start enablexx<br />
</syntaxhighlight>Den Erfolg auch nach einem komplette Neustart testen!<br />
<br />
=== Ein Script zusammen mit FHEM starten ===<br />
'''1. Script bereitstellen'''<br />
<br />
Dazu wird eine Scriptdatei erzeugt, Beispiel:<syntaxhighlight lang="bash"><br />
sudo nano /opt/fhem/ExecStartPre.sh<br />
</syntaxhighlight>Den Code (Beispiele am Ende) hier einfügen und die Datei speichern und Editor verlassen (ctrl+s ctrl+x). <br />
<br />
'''2. ExecStartPre aktivieren'''<br />
<br />
Um ein Script mit root Rechten in der fhem.service unit auszuführen, müssen drei Zeilen in der Datei geändert werden ([[Fhem.service (systemd unit file)#unit file bearbeiten|siehe oben]]).<br />
<br />
Vor der Zeile ExecStart= wir diese Zeile eingefügt:<syntaxhighlight lang="bash"><br />
[Service]<br />
...<br />
ExecStartPre= bash /opt/fhem/ExecStartPre.sh<br />
ExecStart=...<br />
</syntaxhighlight><br />
Die beiden Zeilen User und Group muss man auskommentieren, da die Unit sonst mit dem User fhem ausgeführt wird.<br />
{{Randnotiz|RNTyp=Fehl|RNText=Achtung: Die Gruppenmitgliedschaft des Users fhem (z.B. gpio) ist beim Systemstart an der Stelle noch nicht wirksam.}}<br />
#User=fhem <br />
#Group=dialout<br />
<br />
<br />
'''3. Änderungen aktivieren'''<br />
<br />
Die Änderungen werden erst nach einem daemon-reload aktiv und nach einem restart wirksam.<syntaxhighlight lang="bash"><br />
#sudo systemctl daemon-reload # nur notwendig wenn nicht systemctl edit verwendet wurde<br />
sudo systemctl restart fhem<br />
</syntaxhighlight>Den Erfolg auch nach einem komplette Neustart testen!<br />
<br />
=== Start von anderen Services abhängig machen ===<br />
In der fhem.service unit kann man sicherstellen, dass ein Service fertig gestartet wurde bevor fhem startet. Dazu kann man im unit Abschnitt zwei Zeilen einfügen (bzw. Kommentar entfernen):<syntaxhighlight lang="bash"><br />
Wants=xxx.service <br />
After=xxx.service<br />
</syntaxhighlight>Man kann auch erzwingen, dass FHEM nicht startet falls die Voraussetzungen nicht erfüllt sind. Dafür muss anstatt Wants= Requires= verwendet werden.<br />
<br />
== Einstellungen dies und das ==<br />
<br />
=== Start verzögern ===<br />
Es ist immer besser eine direkte Abhängigkeit zu definieren. In unklaren Situationen oder als erste Abhilfe kann es notwendig sein, einfach den FHEM Start zu verzögern.<br />
<br />
Der default Wert für ''TimeoutStartSec='' liegt bei 90 sec. Anzeige mit <code>systemctl show fhem.service -p TimeoutStartUSec</code><br />
<br />
Soll die Startverzögerung länger sein, muss dieser Wert zusätzlich gesetzt werden. Ansonsten wird der Start mit einer Fehlermeldung abgebrochen.<br />
<syntaxhighlight lang="text"><br />
[Service]<br />
...<br />
ExecStartPre=/bin/sleep 10<br />
#TimeoutStartSec= # default 90, set for larger sleep time<br />
</syntaxhighlight><br />
<br />
=== Restart verzögern ===<br />
Sollte man z.B. bei einem Neustart über die FHEM Oberfläche (shutdown restart) zwei Starts innerhalb von 1 Sekunde im Logfile beobachten, kann man den Neustart im unit file mit einem Parameter um 2 - 10 Sekunden ({{Link2Forum|Topic=93870|Message=924833|LinkText=siehe auch diesen Forenbeitrag}}) verzögern:<br />
<syntaxhighlight lang="text"><br />
[Service]<br />
...<br />
Restart=...<br />
RestartSec=2<br />
...<br />
</syntaxhighlight><br />
<br />
== Hinweise und Tipps ==<br />
=== Startreihenfolge beeinflussen ===<br />
Wie man erzwingen kann, dass FHEM '''nach''' hciuart (Bluetooth Service) startet, ist in {{Link2Forum|Topic=110716|LinkText=diesem Forenbeitrag}} beschrieben.<br />
<br />
=== Ausgaben im Script ===<br />
Ausgaben mit echo landen im /var/log/syslog. Das Log kann man mit diesem Befehl anzeigen. Ist das Logfile zu unübersichtlich kann man sich auch z.B. nur 15 Zeilen nach systemd Ausgabe des unit files anzeigen lassen.<br />
<syntaxhighlight lang="bash"><br />
cat /var/log/syslog<br />
cat /var/log/syslog|grep -A 15 "FHEM Home"<br />
</syntaxhighlight><br />
<br />
=== Beispielcode ===<br />
Diese Codebeispiel ist auf dem Raspberry Pi ausführbar und lässt vor dem Start von FHEM die grüne LED (ACT) blinken.<br />
<br />
'''Beispiel 1: 3 mal kurz und 3 mal lang'''<syntaxhighlight lang="bash"><br />
# Lass die ACT LED (grün) am Pi 3 mal kurz und 3 mal lang blinken<br />
ANZAHL=3<br />
#Status (Standard [mmc0] )sichern<br />
trigger=$(cat /sys/class/leds/led0/trigger|grep -o "\[.*\]"|tr -d [+])<br />
#umschalten auf manuell<br />
echo "none" >/sys/class/leds/led0/trigger<br />
#blinken<br />
for ((i=1 ; i<=$(( $ANZAHL * 2 )) ; i++ )); do<br />
echo $(( $i % 2 )) >/sys/class/leds/led0/brightness<br />
sleep 0.3<br />
done<br />
for ((i=1 ; i<=$(( $ANZAHL * 2 )) ; i++ )); do<br />
echo $(( $i % 2 )) >/sys/class/leds/led0/brightness<br />
sleep 1<br />
done<br />
#Status wieder herstellen<br />
echo $trigger >/sys/class/leds/led0/trigger<br />
</syntaxhighlight></div>Otto123http://wiki.fhem.de/w/index.php?title=Vorlage:FHEMWiki_News&diff=38282Vorlage:FHEMWiki News2023-04-09T14:16:01Z<p>Otto123: Umzug neuer Server</p>
<hr />
<div>{|<br />
{{News|06.04.2023|FHEM Wiki ist auf einen neuen Server umgezogen und läuft jetzt auf aktueller Software. Es gibt neue Skins für Mobilgeräte Unterstützung. }}<br />
{{News|25.01.2023|Neue Module - [[AutomowerConnect|74_AutomowerConnect.pm]] und [[AutomowerConnectDevice|75_AutomowerConnectDevice.pm]] zur Bedienung von Husqvarnas Mähroboter über Husqvarnas Open API {{Link2Forum|Topic=131661|LinkText=Forenbeitrag}}.}}<br />
{{News|14.01.2023|FHEM Version 6.2 wurde freigegeben. Updatehinweise in {{Link2Forum|Topic=131618|LinkText=diesem Forenbeitrag}}.}}<br />
{{News|08.11.2021|FHEM Version 6.1 wurde freigegeben. Updatehinweise in {{Link2Forum|Topic=123972|LinkText=diesem Forenbeitrag}}.}}<br />
{{News|25.05.2021|Ein weiteres Modul zur Integration von Diensten der Synology Diskstation wird per Update verteilt: [[SSFile - Integration der Synology File Station|SSFile]].}}<br />
{{News|28.02.2020|Das neue Modul [[SSCal - Integration des Synology Calendar Servers| SSCal]] ermöglicht die Integration des Synology Calendar Servers.}}<br />
{{News|28.01.2020|Neues Modul für die IP-Türsprechanlage [[DoorBird]] per Update verteilt.}}}}<br />
{{News|26.01.2020|FHEM Version 6.0 wurde freigegeben. Updatehinweise: {{Link2Forum|Topic=107782}}}}<br />
{{News|17.12.2019|Mit dem Modul [[SSChatBot - Integration des Synology Chat Servers|SSChatBot]] kann der Synology Chat Server in FHEM integriert werden. Es können Mitteilungen zwischen FHEM und Chat ausgetauscht sowie Befehle in FHEM ausgeführt werden. }}<br />
{{News|23.09.2019|Das Modul [[CanOverEthernet]] ermöglicht das Empfangen von Can-Over-Ethernet Paketen von Steuerungen der Firma Technische Alternative}}<br />
{{News|05.04.2019|Das [[SamsungAV]] Modul ermöglicht die Steuerung von Samsung Fernsehern und Bluray-Playern.}}<br />
{{News|06.03.2019|Mit dem Modul [[Arlo]] ist die Einbindung von Arlo Kameras über die Arlo Cloud möglich}}<br />
{{News|26.01.2019|Das [[TRÅDFRI|tradfri]] Modul erweitert die Palette der [[ZigBee]] Module.}}<br />
{{News|14.01.2019|Der [[FHEM Connector für Amazon Alexa|FHEM Connector]] Skill für Amazon Alexa ist verfügbar.}}<br />
{{News|02.11.2018|Das Modul [[TA_CMI_UVR16x2_UVR1611|TA_CMI_JSON]] kann Werte des C.M.I. der Firma Technische Alternative auslesen und eignet sich so optimal zum Loggen von Daten zB der UVR16x2 oder UVR1611.}}<br />
{{News|11.09.2018|Mit dem Modul [[AutoShuttersControl|AutoShuttersControl]] oder kurz ASC können typische Aufgabenstellungen im Zusammenhang mit Rollläden u.ä. automatisiert werden, wie zum Beispiel das Öffnen bei Sonnenaufgang, Schließen bei Sonnenuntergang oder das Anfahren von Lüftungspositionen beim Öffnen des zugehörigen Fensters. }}<br />
{{News|12.02.2018|Die Module [[Modul Babble|Babble]] und [[Talk2Fhem|Talk2Fhem]] erweitern die Sprachsteuerungsmöglichkeiten von FHEM}}<br />
{{News|02.10.2017|[[FTUI eigene Widgets|Eigene Widgets für FHEM Tablet UI erstellen]]}}<br />
{{News|30.08.2017|[[WINCONNECT]] - Windows PC steuern und Informationen abfragen/anzeigen. }}<br />
{{News|24.08.2017|[[FHEMWEB/Widgets]] - Widgets (Frontendelemente) von FHEMWEB }}<br />
{{News|24.08.2017|Neues Modul [[Modul_YAAHM|YAAHM]] wird per update verteilt. Es stellt eine Oberfläche bereit, um per Webinterface die zyklische Ausführung von Kommandos - mit Tages- und Wochenprofil - zu konfigurieren}}<br />
{{News|24.07.2017|[[Telnet|Verbindung mit dem FHEM-Server per Telnet]]}}<br />
{{News|20.07.2017|[[FHEM startet nicht - Tipps zur Fehlersuche]]}}<br />
{{News|06.06.2017|[[Relaisplatine-Homebrew-MySensors|MySensors-Relaisplatine im Selbstbau]]}}<br />
{{News|31.05.2017|[[Datenbankgestützte_Erstellung_der_Energiebilanz_einer_SMA_PV-Anlage_mit_Überschußeinspeisung|Datenbankgestützte Erstellung der Energiebilanz einer PV-Anlage mit Überschußeinspeisung]]}}<br />
{{News|30.04.2017|[[DoorPiBoard]]: Eine Platine zur Umsetzung des [[DoorPi_und FHEM|DoorPi-Projektes]]}}<br />
{{News|21.03.2017|Artikel zum alternativen Frontend [[:Kategorie:FHEM_Tablet_UI|Tablet UI]] aktualisiert und deutlich erweitert}}<br />
{{News|02.03.2017|Neues Modul zur Ansteuerung von [[LGTV_WebOS|LG-TVs mit dem Betriebssystem WebOS]] wird per update verteilt}}<br />
{{News|20.02.2017|Neues Modul [[SIP-Client|SIP]], ein SIP-Client für FHEM, wird per update verteilt}}<br />
{{News|19.02.2017|FHEM Version 5.8 wurde freigegeben. Updatehinweise beachten: {{Link2Forum|Topic=67419}}}}<br />
{{News|18.01.2017|Neues Modul [[DOIFtools]] mit Funktionen zur Unterstützung des Benutzers im Umgang mit [[DOIF]] wird per update verteilt}}<br />
{{News|12.01.2017|Neues Modul zur Ansteuerung des Bluetooth 4.1 BLE Pflanzensensors [[XiaomiFlowerSens|Xiaomi Flower Care Smart Monitor]] wird per update ausgeliefert}}<br />
{{News|01.01.2017|Diverse neue Wiki-Artikel mit Informationen und Hilfen zu [[DOIF#Links|DOIF]] }}<br />
{{News|10.12.2016|FHEM Wiki ist auf einen neuen Server umgezogen und hat eine neue Standard-Internetadresse: https://wiki.fhem.de}}<br />
{{News|21.11.2016|Neues Modul [[Modul_PostMe|PostMe]] stellt eine komfortable Oberfläche zur Listenverwaltung bereit}}<br />
{{News|11.10.2016|Neue Module [[NUKI|NUKIbridge und NUKIDevice]] zur Ansteuerung des Nuki Smartlock werden per update verteilt}}<br />
{{News|07.10.2016|Neues Modul [[TRAFFIC]] zur Erfassung der Fahrzeiten bei aktueller Verkehrslage mittels Google Maps Directions API wird per update verteilt}}<br />
{{News|19.07.2016|Neues Modul zur Unterstützung der HomeMatic-Interfaces [[HM-MOD-RPI-PCB_HomeMatic_Funkmodul_für_Raspberry_Pi|Funkmodul für Raspberry Pi]] und [[HM-LGW-O-TW-W-EU_Funk-LAN_Gateway|Funk-LAN Gateway]] wird per update verteilt }}<br />
{{News|12.07.2016|Neues Modul [[DbRep - Reporting und Management von DbLog-Datenbankinhalten]] wird per update verteilt }}<br />
{{News|08.02.2016|Neues Modul [[Mediaportal|MEDIAPORTAL]] (Steuerung einer Mediaportal-Installation über Wifiremote) wird per update verteilt}}<br />
{{News|16.11.2015|Neues Modul [[HP1000]] (Einbindung einer HP1000 Wetterstation) wird per update verteilt}}<br />
{{News|16.11.2015|Neuer FHEM Befehl [[msg]] (Intelligentes Versenden/Routing von Nachrichten der Typen Audio,Text,Mail,Push,Light,Screen) wird per update verteilt}}<br />
{{News|15.11.2015|FHEM Version 5.7 wurde veröffentlicht. Unbedingt Updatehinweise beachten: {{Link2Forum|Topic=44094}}}}<br />
{{News|30.10.2015|FHEM Wiki unterstützt nun [[Syntax Highlighting]]}}<br />
{{News|18.10.2015|Neues Modul [[TechemHKV]] (Empfang von Daten eines Techem Heizkostenverteilers) wird per update verteilt}}<br />
{{News|02.10.2015|Kleiner FHEM-Einsteiger-Kurs als Wiki Artikel unter [[Erste_Schritte_in_fhem|Erste Schritte in FHEM]]}}<br />
{{News|24.09.2015|Umfangreiche Überarbeitung der Wiki Artikel über [[:Kategorie:panStamp|panStamp Hardware und Software]]}}<br />
{{News|11.09.2015|Neues Modul [[AMAD]] (Steuern und Informationsanzeige von Android-Geräten) wird per update verteilt}}<br />
{{News|15.06.2015|Neues Modul [[yowsup]] (WhatsApp Unterstützung) wird per update verteilt}}<br />
{{News|03.04.2015|Neues Geräte-Modul [[JawboneUp]] wird per update verteilt}}<br />
{{News|23.03.2015|Neue Geräte-Module [[Modbus]], [[ModbusAttr]] und [[Modbus#Writing_modules_for_devices_using_this_module_as_a_library|ModbusSET]] werden per update verteilt}}<br />
{{News|10.02.2015|FHEM Wiki ist auf einen neuen Server umgezogen und [[FHEMWiki:Interna#Offene_Probleme|Aktualisierung der MediaWiki-Software]]}}<br />
{{News|31.01.2015|Neues Geräte-Modul [[Pushbullet]] wird per update verteilt}}<br />
{{News|14.01.2015|Neues Hilfs-Modul [[CALVIEW]] wird per update verteilt}}<br />
{{News|08.01.2015|Neues Geräte-Modul [[Buderus_Web_Gateway|km200]] zur Anbindung eines Buderus Web-Gateways wird per update verteilt}}<br />
{{News|18.12.2014|Neues Geräte-Modul [[SONOS]] wird per update verteilt}}<br />
{{News|15.12.2014|Überarbeitetes und erweitertes Geräte-Modul [[HTTPMOD]] wird per update verteilt}}<br />
{{News|10.12.2014|Neues Geräte-Modul [[Vitotronic_200_(Viessmann_Heizungssteuerung)|VCONTROL]] zur Anbindung einer Viessmann Heizung wird per update verteilt}}<br />
{{News|17.11.2014|Neues Hilfs-Modul [[logProxy]] wird per update verteilt}}<br />
{{News|09.11.2014|FHEM Version 5.6 wurde veröffentlicht}}<br />
{{News|27.10.2014|Neues Geräte-Modul [[harmony]] zur FHEM-Anbindung Logitech Harmony Hub basierter Fernbedienungen wird per update verteilt}}<br />
{{News|25.10.2014|Neues Geräte-Modul [[KostalPiko|KOSTALPIKO]] wird per update verteilt}}<br />
{{News|24.10.2014|Neues Hilfs-Modul [[HourCounter]] wird per update verteilt}}<br />
{{News|06.09.2014|Neues Hilfs-Modul [[CustomReadings]] per update verteilt}}<br />
{{News|19.08.2014|Neues Hilfs-Modul [[DOIF]] wird per update verteilt}}<br />
{{News|19.08.2014|Der Befehl [[update]] wurde überarbeitet: {{Link2Forum|Topic=26311}} }}<br />
{{News|13.08.2014|Zusätzliche Domäne fhem.org aktiviert: {{Link2Forum|Topic=26113}} }}<br />
{{News|29.09.2013|FHEM Version 5.5 wurde veröffentlicht}}<br />
{{News|11.05.2013|Die meisten Daten aus dem FhemWiki sind wieder hergestellt.}}<br />
{{News|04.05.2013|FHEM Wiki wird neu aufgebaut.}}<br />
{{News|04.05.2013|FHEM Wiki Update zu [[Special:Version|MediaWiki 1.20.5]].}}<br />
|}<br />
<noinclude>[[Kategorie:Vorlage]]</noinclude></div>Otto123http://wiki.fhem.de/w/index.php?title=Hauptseite&diff=38281Hauptseite2023-04-09T07:15:57Z<p>Otto123: </p>
<hr />
<div><!-- Banner für aktuelle Mitteilungen --------- --> <br />
<!-- Banner für aktuelle Mitteilungen ---------<br />
<div style="background-color: green; border: 1px solid maroon; border-radius: 8px; padding: 0 1em 1em 1em; font-size: bigger; text-align: center; color: white;"><br />
'''Das Wiki begrüßt Dich auf neuem Server.</div><br />
Ende von Banner für aktuelle Mitteilungen -------- --><br />
<!-- Ende von Banner für aktuelle Mitteilungen -------- --><br />
<!-- Banner für wichtige Mitteilungen --------- <br />
<div style="background-color: red; border: 1px solid maroon; border-radius: 8px; padding: 0 1em 1em 1em; font-size: bigger; text-align: center; color: white;"><br />
'''Es finden aktuell Wartungsarbeiten an der FHEM-Infrastruktur statt. Es kann daher zu kurzzeitigen Ausfällen und Beeinträchtigungen beim Zugriff auf FHEM-Dienste (Forum, SVN, Wiki, fhem.de, Alexa FHEM Connector) kommen'''<br />
<br />
'''Wir bitten um etwas Geduld. Sämtliche FHEM-Dienste werden im Laufe des Tages wieder wie gewohnt zur Verfügung stehen.'''<br />
</div><br />
Ende von Banner für wichtige Mitteilungen -------- --><br />
<!-- Ende von Banner für wichtige Mitteilungen -------- --><br />
<div><h1 style="font-family:sans-serif; font-size: 1.8em; border: none; text-align: center;">'''FHEM Wiki - Informationsportal zum FHEM SmartHome-Server'''</h1></div><br />
<br />
<div class="flexbox"> <!-- Beginn der Inhaltsboxen --><br />
<div class="mainpagebox" style="order: 1; flex: 1 1 80%; background-color:#cce5ff;"><br />
<div class="mw-collapsible mw-collapsed"><br />
'''Was ist FHEM?'''<br />
<div class="mw-collapsible-content"><br />
'''FHEM''' ([https://register.dpma.de/DPMAregister/marke/register/3020152110040/DE R]) ist ein in Perl geschriebener, GPL v2 lizensierter Server für die Heimautomatisierung. Man kann mit FHEM häufig auftretende Aufgaben automatisieren, wie z.B. Lampen / Rollladen / Heizung / usw. schalten, oder Ereignisse wie Temperatur / Feuchtigkeit / Stromverbrauch protokollieren und visualisieren.<br />
<br />
Das Programm läuft als Server, man kann es über WEB, dedizierte Smartphone Apps oder telnet bedienen, TCP Schnittstellen für JSON und XML existieren ebenfalls.<br />
<br />
Um es zu verwenden, benötigt man einen 24/7 Rechner (NAS, RPi, PC, MacMini, etc) mit einem Perl Interpreter und angeschlossene Interfaces wie CUL-, EnOcean-, Z-Wave-USB-Stick etc. für einen Zugang zu den Aktoren und Sensoren.<br />
</div></div></div><br />
<br />
<div class="mainpagebox" style="order: 4; background-color:#efefef;"><br />
'''Wie fange ich an?'''<br />
* [[Datei:Info_green.png|20px]][https://fhem.de/Heimautomatisierung-mit-fhem.pdf Heimautomatisierung mit FHEM][[Datei:Info_green.png|20px]]<br />DAS Einsteiger-PDF. '''Pflichtlektüre!'''<br /><br />
* [[Quick-Start]], english version: [[Quick-Start/en|Quick-Start]] <br />
* kleiner FHEM-Kurs, benötigt keine Hardware: [[Erste Schritte in FHEM]] / [[First steps in FHEM]]<br />
* [[Systemübersicht]]<br />
* Phasen eines FHEM-Projekts:<br />
** [[Planung]]<br />
** [[Umsetzung]] (Implementierung)<br />
** [[Betrieb]] ("Produktion")<br />
* [[:Kategorie:Glossary|Glossar]] (Erklärung für bestimmte Begriffe)<br /><br />
* [[:Kategorie:HOWTOS|Verschiedene HowTos]]<br /><br />
* [[:Kategorie:FAQ|Frequently asked Questions - Häufig gestellte Fragen mit Antworten]]<br /><br />
<!-- Verlinkte Wiki-Seite für Anfänger ist leer, darum auskommentiert<br />
<div align="right"><small>'''[[Help:Reading|How to read FHEMWiki]]'''</small></div>--><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 6; background-color:#fff0e0;"><br />
'''Unterstützte Hardware (Auszug)'''<br />
<br />
* [[:Kategorie:Hardware Typen|Hardware Typen]] - Funktionsbezogene Übersicht (z.B. [[:Kategorie:Unterhaltungselektronik|Unterhaltungselektronik / Multimedia]], [[:Kategorie:Heizungssteuerung|Heizungssteuerung]], [[:Kategorie:Energieverbrauchsmessung|Energieverbrauchsmessung]], etc.)<br />
* [[:Kategorie:Server Hardware|Server Hardware]] - Hardware, auf der FHEM installiert werden kann<br />
* [[:Kategorie:EMS Components|EMS]], [[:Kategorie:FHT Components|FHT]], [[:Kategorie:HMS Components|HMS]] Komponenten<br />
* [[:Kategorie:1-Wire|1-Wire System]]<br />
* [[:Kategorie:EIB/KNX|EIB/KNX Komponenten]]<br />
* [[:Kategorie:FS20 Components|FS20 Komponenten]]<br />
* [[:Kategorie:EnOcean Components|EnOcean Komponenten]]<br />
* [[:Kategorie:HomeMatic Components|HomeMatic Komponenten]]<br />
* [[:Kategorie:MAX|MAX! Komponenten]]<br />
* [[:Kategorie:panStamp|panStamp Komponenten]]<br />
* [[:Kategorie:Z-Wave Components|Z-Wave Komponenten]]<br />
* [[:Kategorie:ZigBee|Zigbee Komponenten]]<br />
* [[:Kategorie:IP Components|Geräte mit Webinterface ("IP")]]<br />
* [[:Kategorie:Other Components|Andere Komponenten / Sonstige Systeme]]<br />
<br />
<div align="right"><small>'''[[:Kategorie:Hardware|Alle Hardware-Kategorien]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 5; background-color:#F8F8FF;"><br />
'''Ideen und Lösungen'''<br />
<br />
* [[:Kategorie:Code_Snippets|Verschiedene kommentierte Lösungen und Code-Schnippsel]]<br />
* [[:Kategorie:Examples|Beispielanwendungen - Hardwarelösungen - Fremdsystemanbindungen]]<br />
* [[Anwendungsszenarien]]<br />
* [[Trick der Woche|Tipp der Woche]]<br />
* [[Wie kann ich...]]?<br />
<br />
<div align="right"><small>'''[[:Kategorie:FHEM|FHEM-Haupt-Kategorien]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 7; background-color:#FFFFE7;"><br />
'''Developers Corner'''<br />
<br />
* Informationen zur Modul-Entwicklung:<br />
** [[DevelopmentModuleIntro|Development Module Introduction]]<br />
** [[Meta|Development Module and Package Meta Data]]<br />
** [[DevelopmentModuleAPI|Development Module API]]<br />
** [[DevelopmentFHEMWEB-API|Development FHEMWEB API]]<br />
** [[Blocking Call]]<br />
** [[CoProcess]]<br />
** [[HttpUtils]]<br />
** [[DevIo]]<br />
** [[Guidelines zur Dokumentation]]<br />
** [[DevelopmentGuidelinesAV|Development Guidelines AV-Module]]<br />
<br />
<br />
* Organisatorisches:<br />
** [[How to write a patch]]<br />
** [[SVN Nutzungsregeln]]<br />
<br />
<div align="right"><small>'''[[:Kategorie:Development|Alle Artikel zu Development]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 3; background-color:#d7ffff;"><br />
'''FHEM Wiki News'''<br />
<div style="height:20em;overflow:scroll;overflow-x:hidden;">{{FHEMWiki_News}}</div><br />
<div align="right"><small>'''Mehr [[FHEMWiki:News|News]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 2; background-color:#e7f8ff;"><br />
'''Was ist FHEM Wiki?'''<br />
<br />
Das '''FHEM Wiki''' ergänzt die stets tagesaktuelle, von den zuständigen Entwicklern gepflegte {{Link2CmdRef}} (Befehls-Referenz) um weitergehende Informationen rund um FHEM. Im Wiki arbeiten Nutzer und Entwickler gemeinsam an zusätzlicher Dokumentation von FHEM und damit zusammenhängenden Themen.<br />
<br />
Das FHEMWiki stellt neben der {{Link2CmdRef}}, dem [http://forum.fhem.de/ Forum] und der [http://www.fhem.de FHEM] Seite die zentrale Informationsquelle rund um FHEM dar. Bedeutung und Zusammenspiel dieser Elemente [[Dokumentationsstruktur|ist hier]] erläutert. <br />
<br />
<!-- {{NUMBEROFUSERS}} [[Special:Listusers|Benutzer]] haben sich seit Mai 2013 registriert und {{NUMBEROFARTICLES}} Artikel geschrieben. ({{NUMBEROFEDITS}} Seitenänderungen bislang).--><br />
Bitte [[FHEMWiki:Support | unterstütze uns]] und hilf, [[:Kategorie:NeedsEditing| das Wiki zu erweitern]]. Vielen Dank!<br />
<br />
<div align="right"><small>'''Mehr [[FHEMWiki:Über_FHEMWiki|über FHEMWiki]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 8; background-color:#F8F8FF;"><br />
'''Letzte Änderungen'''<br />
<div style="font-size:small;color:black;"><small>{{Special:Recentchanges/8}}</small></div><br />
<div align="right"><small>'''Mehr [[Special:Recentchanges|Änderungen]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 9; flex: 1 1 80%; background-color:#FFFFAA;"><br />
'''Die letzten fünf neuen Seiten'''<br />
<small>{{Special:NewPages/5}}</small><br />
<div align="right"><small>'''Mehr [[Special:NewPages|Neue Seiten]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 10; background-color:#DDD68F;"><br />
'''Administratives zum Wiki'''<br />
<br />
''Allgemeine Aktivitäten:''<br />
* Registrierung zur Mitarbeit: wende Dich bitte an einen [[FHEMWiki:Administratoren|Administrator]]<br />
* Basiswissen über die Mitarbeit an einem Wiki erarbeiten ([http://de.wikipedia.org/wiki/Wikipedia:Beteiligen z.B. Wikipedia])<br />
* Erweiterung und Korrektur von Artikeln, wo immer nötig<br />
* Ein(ig)e der [[Spezial:Gewünschte Seiten|gewünschten Seiten]] erstellen <br />
* Ideen aus dem [http://forum.fhem.de Forum] in bestehende oder neue Artikel einarbeiten<br />
* [[Spezial:Verwaiste Seiten|verwaiste Seiten]] in sinnvoller Weise verlinken<br />
* [[Spezial:Sackgassenseiten|Sackgassenseiten]] wikifizieren (Links auf andere Seiten einfügen)<br />
* [[Datei:Info_red.png|20px]] '''Tips / Regeln / Hinweise auf "[[FHEMWiki:Über FHEMWiki|Über FHEMWiki]]" beachten!''' [[Datei:Info_red.png|20px]]<br />
<br />
''Sonstiges:''<br />
* Zum Ausprobieren bitte die [[FHEMWiki:Sandbox]] benutzen<br />
* [//meta.wikimedia.org/wiki/Help:Contents Wiki Benutzerhandbuch].<br />
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Wiki-Konfigurationsvariablen]<br />
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]<br />
* [[FHEMWiki:Interna|Internes zu diesem Wiki]]<br />
</div><br />
<br />
</div><!-- Ende der Flexbox --><br />
[[Kategorie:FHEM]]</div>Otto123http://wiki.fhem.de/w/index.php?title=Hauptseite&diff=38246Hauptseite2023-04-06T08:51:09Z<p>Otto123: </p>
<hr />
<div><!-- Banner für wichtige Mitteilungen --------- --> <br />
<div style="background-color: green; border: 1px solid maroon; border-radius: 8px; padding: 0 1em 1em 1em; font-size: bigger; text-align: center; color: white;"><br />
'''Das Wiki begrüßt Dich auf neuem Server.</div><br />
<!-- Banner für wichtige Mitteilungen --------- <br />
<div style="background-color: red; border: 1px solid maroon; border-radius: 8px; padding: 0 1em 1em 1em; font-size: bigger; text-align: center; color: white;"><br />
'''Es finden aktuell Wartungsarbeiten an der FHEM-Infrastruktur statt. Es kann daher zu kurzzeitigen Ausfällen und Beeinträchtigungen beim Zugriff auf FHEM-Dienste (Forum, SVN, Wiki, fhem.de, Alexa FHEM Connector) kommen'''<br />
<br />
'''Wir bitten um etwas Geduld. Sämtliche FHEM-Dienste werden im Laufe des Tages wieder wie gewohnt zur Verfügung stehen.'''<br />
</div><br />
Ende von Banner für wichtige Mitteilungen -------- --><br />
<!-- Ende von Banner für wichtige Mitteilungen -------- --><br />
<div><h1 style="font-family:sans-serif; font-size: 1.8em; border: none; text-align: center;">'''FHEM Wiki - Informationsportal zum FHEM SmartHome-Server'''</h1></div><br />
<br />
<div class="flexbox"> <!-- Beginn der Inhaltsboxen --><br />
<div class="mainpagebox" style="order: 1; flex: 1 1 80%; background-color:#cce5ff;"><br />
<div class="mw-collapsible mw-collapsed"><br />
'''Was ist FHEM?'''<br />
<div class="mw-collapsible-content"><br />
'''FHEM''' ([https://register.dpma.de/DPMAregister/marke/register/3020152110040/DE R]) ist ein in Perl geschriebener, GPL v2 lizensierter Server für die Heimautomatisierung. Man kann mit FHEM häufig auftretende Aufgaben automatisieren, wie z.B. Lampen / Rollladen / Heizung / usw. schalten, oder Ereignisse wie Temperatur / Feuchtigkeit / Stromverbrauch protokollieren und visualisieren.<br />
<br />
Das Programm läuft als Server, man kann es über WEB, dedizierte Smartphone Apps oder telnet bedienen, TCP Schnittstellen für JSON und XML existieren ebenfalls.<br />
<br />
Um es zu verwenden, benötigt man einen 24/7 Rechner (NAS, RPi, PC, MacMini, etc) mit einem Perl Interpreter und angeschlossene Interfaces wie CUL-, EnOcean-, Z-Wave-USB-Stick etc. für einen Zugang zu den Aktoren und Sensoren.<br />
</div></div></div><br />
<br />
<div class="mainpagebox" style="order: 4; background-color:#efefef;"><br />
'''Wie fange ich an?'''<br />
* [[Datei:Info_green.png|20px]][https://fhem.de/Heimautomatisierung-mit-fhem.pdf Heimautomatisierung mit FHEM][[Datei:Info_green.png|20px]]<br />DAS Einsteiger-PDF. '''Pflichtlektüre!'''<br /><br />
* [[Quick-Start]], english version: [[Quick-Start/en|Quick-Start]] <br />
* kleiner FHEM-Kurs, benötigt keine Hardware: [[Erste Schritte in FHEM]] / [[First steps in FHEM]]<br />
* [[Systemübersicht]]<br />
* Phasen eines FHEM-Projekts:<br />
** [[Planung]]<br />
** [[Umsetzung]] (Implementierung)<br />
** [[Betrieb]] ("Produktion")<br />
* [[:Kategorie:Glossary|Glossar]] (Erklärung für bestimmte Begriffe)<br /><br />
* [[:Kategorie:HOWTOS|Verschiedene HowTos]]<br /><br />
* [[:Kategorie:FAQ|Frequently asked Questions - Häufig gestellte Fragen mit Antworten]]<br /><br />
<!-- Verlinkte Wiki-Seite für Anfänger ist leer, darum auskommentiert<br />
<div align="right"><small>'''[[Help:Reading|How to read FHEMWiki]]'''</small></div>--><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 6; background-color:#fff0e0;"><br />
'''Unterstützte Hardware (Auszug)'''<br />
<br />
* [[:Kategorie:Hardware Typen|Hardware Typen]] - Funktionsbezogene Übersicht (z.B. [[:Kategorie:Unterhaltungselektronik|Unterhaltungselektronik / Multimedia]], [[:Kategorie:Heizungssteuerung|Heizungssteuerung]], [[:Kategorie:Energieverbrauchsmessung|Energieverbrauchsmessung]], etc.)<br />
* [[:Kategorie:Server Hardware|Server Hardware]] - Hardware, auf der FHEM installiert werden kann<br />
* [[:Kategorie:EMS Components|EMS]], [[:Kategorie:FHT Components|FHT]], [[:Kategorie:HMS Components|HMS]] Komponenten<br />
* [[:Kategorie:1-Wire|1-Wire System]]<br />
* [[:Kategorie:EIB/KNX|EIB/KNX Komponenten]]<br />
* [[:Kategorie:FS20 Components|FS20 Komponenten]]<br />
* [[:Kategorie:EnOcean Components|EnOcean Komponenten]]<br />
* [[:Kategorie:HomeMatic Components|HomeMatic Komponenten]]<br />
* [[:Kategorie:MAX|MAX! Komponenten]]<br />
* [[:Kategorie:panStamp|panStamp Komponenten]]<br />
* [[:Kategorie:Z-Wave Components|Z-Wave Komponenten]]<br />
* [[:Kategorie:ZigBee|Zigbee Komponenten]]<br />
* [[:Kategorie:IP Components|Geräte mit Webinterface ("IP")]]<br />
* [[:Kategorie:Other Components|Andere Komponenten / Sonstige Systeme]]<br />
<br />
<div align="right"><small>'''[[:Kategorie:Hardware|Alle Hardware-Kategorien]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 5; background-color:#F8F8FF;"><br />
'''Ideen und Lösungen'''<br />
<br />
* [[:Kategorie:Code_Snippets|Verschiedene kommentierte Lösungen und Code-Schnippsel]]<br />
* [[:Kategorie:Examples|Beispielanwendungen - Hardwarelösungen - Fremdsystemanbindungen]]<br />
* [[Anwendungsszenarien]]<br />
* [[Trick der Woche|Tipp der Woche]]<br />
* [[Wie kann ich...]]?<br />
<br />
<div align="right"><small>'''[[:Kategorie:FHEM|FHEM-Haupt-Kategorien]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 7; background-color:#FFFFE7;"><br />
'''Developers Corner'''<br />
<br />
* Informationen zur Modul-Entwicklung:<br />
** [[DevelopmentModuleIntro|Development Module Introduction]]<br />
** [[Meta|Development Module and Package Meta Data]]<br />
** [[DevelopmentModuleAPI|Development Module API]]<br />
** [[DevelopmentFHEMWEB-API|Development FHEMWEB API]]<br />
** [[Blocking Call]]<br />
** [[CoProcess]]<br />
** [[HttpUtils]]<br />
** [[DevIo]]<br />
** [[Guidelines zur Dokumentation]]<br />
** [[DevelopmentGuidelinesAV|Development Guidelines AV-Module]]<br />
<br />
<br />
* Organisatorisches:<br />
** [[How to write a patch]]<br />
** [[SVN Nutzungsregeln]]<br />
<br />
<div align="right"><small>'''[[:Kategorie:Development|Alle Artikel zu Development]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 3; background-color:#d7ffff;"><br />
'''FHEM Wiki News'''<br />
<div style="height:20em;overflow:scroll;overflow-x:hidden;">{{FHEMWiki_News}}</div><br />
<div align="right"><small>'''Mehr [[FHEMWiki:News|News]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 2; background-color:#e7f8ff;"><br />
'''Was ist FHEM Wiki?'''<br />
<br />
Das '''FHEM Wiki''' ergänzt die stets tagesaktuelle, von den zuständigen Entwicklern gepflegte {{Link2CmdRef}} (Befehls-Referenz) um weitergehende Informationen rund um FHEM. Im Wiki arbeiten Nutzer und Entwickler gemeinsam an zusätzlicher Dokumentation von FHEM und damit zusammenhängenden Themen.<br />
<br />
Das FHEMWiki stellt neben der {{Link2CmdRef}}, dem [http://forum.fhem.de/ Forum] und der [http://www.fhem.de FHEM] Seite die zentrale Informationsquelle rund um FHEM dar. Bedeutung und Zusammenspiel dieser Elemente [[Dokumentationsstruktur|ist hier]] erläutert. <br />
<br />
<!-- {{NUMBEROFUSERS}} [[Special:Listusers|Benutzer]] haben sich seit Mai 2013 registriert und {{NUMBEROFARTICLES}} Artikel geschrieben. ({{NUMBEROFEDITS}} Seitenänderungen bislang).--><br />
Bitte [[FHEMWiki:Support | unterstütze uns]] und hilf, [[:Kategorie:NeedsEditing| das Wiki zu erweitern]]. Vielen Dank!<br />
<br />
<div align="right"><small>'''Mehr [[FHEMWiki:Über_FHEMWiki|über FHEMWiki]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 8; background-color:#F8F8FF;"><br />
'''Letzte Änderungen'''<br />
<div style="font-size:small;color:black;"><small>{{Special:Recentchanges/8}}</small></div><br />
<div align="right"><small>'''Mehr [[Special:Recentchanges|Änderungen]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 9; flex: 1 1 80%; background-color:#FFFFAA;"><br />
'''Die letzten fünf neuen Seiten'''<br />
<small>{{Special:NewPages/5}}</small><br />
<div align="right"><small>'''Mehr [[Special:NewPages|Neue Seiten]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 10; background-color:#DDD68F;"><br />
'''Administratives zum Wiki'''<br />
<br />
''Allgemeine Aktivitäten:''<br />
* Registrierung zur Mitarbeit: wende Dich bitte an einen [[FHEMWiki:Administratoren|Administrator]]<br />
* Basiswissen über die Mitarbeit an einem Wiki erarbeiten ([http://de.wikipedia.org/wiki/Wikipedia:Beteiligen z.B. Wikipedia])<br />
* Erweiterung und Korrektur von Artikeln, wo immer nötig<br />
* Ein(ig)e der [[Spezial:Gewünschte Seiten|gewünschten Seiten]] erstellen <br />
* Ideen aus dem [http://forum.fhem.de Forum] in bestehende oder neue Artikel einarbeiten<br />
* [[Spezial:Verwaiste Seiten|verwaiste Seiten]] in sinnvoller Weise verlinken<br />
* [[Spezial:Sackgassenseiten|Sackgassenseiten]] wikifizieren (Links auf andere Seiten einfügen)<br />
* [[Datei:Info_red.png|20px]] '''Tips / Regeln / Hinweise auf "[[FHEMWiki:Über FHEMWiki|Über FHEMWiki]]" beachten!''' [[Datei:Info_red.png|20px]]<br />
<br />
''Sonstiges:''<br />
* Zum Ausprobieren bitte die [[FHEMWiki:Sandbox]] benutzen<br />
* [//meta.wikimedia.org/wiki/Help:Contents Wiki Benutzerhandbuch].<br />
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Wiki-Konfigurationsvariablen]<br />
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]<br />
* [[FHEMWiki:Interna|Internes zu diesem Wiki]]<br />
</div><br />
<br />
</div><!-- Ende der Flexbox --><br />
[[Kategorie:FHEM]]</div>Otto123http://wiki.fhem.de/w/index.php?title=Hauptseite&diff=38245Hauptseite2023-04-06T08:50:22Z<p>Otto123: </p>
<hr />
<div><!-- Banner für wichtige Mitteilungen --------- --> <br />
<div style="background-color: green; border: 1px solid maroon; border-radius: 8px; padding: 0 1em 1em 1em; font-size: bigger; text-align: center; color: white;"><br />
'''Das Wiki begrüßt Dich auf neuem Server.<br />
</div><br />
<!-- Banner für wichtige Mitteilungen --------- <br />
<div style="background-color: red; border: 1px solid maroon; border-radius: 8px; padding: 0 1em 1em 1em; font-size: bigger; text-align: center; color: white;"><br />
'''Es finden aktuell Wartungsarbeiten an der FHEM-Infrastruktur statt. Es kann daher zu kurzzeitigen Ausfällen und Beeinträchtigungen beim Zugriff auf FHEM-Dienste (Forum, SVN, Wiki, fhem.de, Alexa FHEM Connector) kommen'''<br />
<br />
'''Wir bitten um etwas Geduld. Sämtliche FHEM-Dienste werden im Laufe des Tages wieder wie gewohnt zur Verfügung stehen.'''<br />
</div><br />
Ende von Banner für wichtige Mitteilungen -------- --><br />
<!-- Ende von Banner für wichtige Mitteilungen -------- --><br />
<div><h1 style="font-family:sans-serif; font-size: 1.8em; border: none; text-align: center;">'''FHEM Wiki - Informationsportal zum FHEM SmartHome-Server'''</h1></div><br />
<br />
<div class="flexbox"> <!-- Beginn der Inhaltsboxen --><br />
<div class="mainpagebox" style="order: 1; flex: 1 1 80%; background-color:#cce5ff;"><br />
<div class="mw-collapsible mw-collapsed"><br />
'''Was ist FHEM?'''<br />
<div class="mw-collapsible-content"><br />
'''FHEM''' ([https://register.dpma.de/DPMAregister/marke/register/3020152110040/DE R]) ist ein in Perl geschriebener, GPL v2 lizensierter Server für die Heimautomatisierung. Man kann mit FHEM häufig auftretende Aufgaben automatisieren, wie z.B. Lampen / Rollladen / Heizung / usw. schalten, oder Ereignisse wie Temperatur / Feuchtigkeit / Stromverbrauch protokollieren und visualisieren.<br />
<br />
Das Programm läuft als Server, man kann es über WEB, dedizierte Smartphone Apps oder telnet bedienen, TCP Schnittstellen für JSON und XML existieren ebenfalls.<br />
<br />
Um es zu verwenden, benötigt man einen 24/7 Rechner (NAS, RPi, PC, MacMini, etc) mit einem Perl Interpreter und angeschlossene Interfaces wie CUL-, EnOcean-, Z-Wave-USB-Stick etc. für einen Zugang zu den Aktoren und Sensoren.<br />
</div></div></div><br />
<br />
<div class="mainpagebox" style="order: 4; background-color:#efefef;"><br />
'''Wie fange ich an?'''<br />
* [[Datei:Info_green.png|20px]][https://fhem.de/Heimautomatisierung-mit-fhem.pdf Heimautomatisierung mit FHEM][[Datei:Info_green.png|20px]]<br />DAS Einsteiger-PDF. '''Pflichtlektüre!'''<br /><br />
* [[Quick-Start]], english version: [[Quick-Start/en|Quick-Start]] <br />
* kleiner FHEM-Kurs, benötigt keine Hardware: [[Erste Schritte in FHEM]] / [[First steps in FHEM]]<br />
* [[Systemübersicht]]<br />
* Phasen eines FHEM-Projekts:<br />
** [[Planung]]<br />
** [[Umsetzung]] (Implementierung)<br />
** [[Betrieb]] ("Produktion")<br />
* [[:Kategorie:Glossary|Glossar]] (Erklärung für bestimmte Begriffe)<br /><br />
* [[:Kategorie:HOWTOS|Verschiedene HowTos]]<br /><br />
* [[:Kategorie:FAQ|Frequently asked Questions - Häufig gestellte Fragen mit Antworten]]<br /><br />
<!-- Verlinkte Wiki-Seite für Anfänger ist leer, darum auskommentiert<br />
<div align="right"><small>'''[[Help:Reading|How to read FHEMWiki]]'''</small></div>--><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 6; background-color:#fff0e0;"><br />
'''Unterstützte Hardware (Auszug)'''<br />
<br />
* [[:Kategorie:Hardware Typen|Hardware Typen]] - Funktionsbezogene Übersicht (z.B. [[:Kategorie:Unterhaltungselektronik|Unterhaltungselektronik / Multimedia]], [[:Kategorie:Heizungssteuerung|Heizungssteuerung]], [[:Kategorie:Energieverbrauchsmessung|Energieverbrauchsmessung]], etc.)<br />
* [[:Kategorie:Server Hardware|Server Hardware]] - Hardware, auf der FHEM installiert werden kann<br />
* [[:Kategorie:EMS Components|EMS]], [[:Kategorie:FHT Components|FHT]], [[:Kategorie:HMS Components|HMS]] Komponenten<br />
* [[:Kategorie:1-Wire|1-Wire System]]<br />
* [[:Kategorie:EIB/KNX|EIB/KNX Komponenten]]<br />
* [[:Kategorie:FS20 Components|FS20 Komponenten]]<br />
* [[:Kategorie:EnOcean Components|EnOcean Komponenten]]<br />
* [[:Kategorie:HomeMatic Components|HomeMatic Komponenten]]<br />
* [[:Kategorie:MAX|MAX! Komponenten]]<br />
* [[:Kategorie:panStamp|panStamp Komponenten]]<br />
* [[:Kategorie:Z-Wave Components|Z-Wave Komponenten]]<br />
* [[:Kategorie:ZigBee|Zigbee Komponenten]]<br />
* [[:Kategorie:IP Components|Geräte mit Webinterface ("IP")]]<br />
* [[:Kategorie:Other Components|Andere Komponenten / Sonstige Systeme]]<br />
<br />
<div align="right"><small>'''[[:Kategorie:Hardware|Alle Hardware-Kategorien]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 5; background-color:#F8F8FF;"><br />
'''Ideen und Lösungen'''<br />
<br />
* [[:Kategorie:Code_Snippets|Verschiedene kommentierte Lösungen und Code-Schnippsel]]<br />
* [[:Kategorie:Examples|Beispielanwendungen - Hardwarelösungen - Fremdsystemanbindungen]]<br />
* [[Anwendungsszenarien]]<br />
* [[Trick der Woche|Tipp der Woche]]<br />
* [[Wie kann ich...]]?<br />
<br />
<div align="right"><small>'''[[:Kategorie:FHEM|FHEM-Haupt-Kategorien]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 7; background-color:#FFFFE7;"><br />
'''Developers Corner'''<br />
<br />
* Informationen zur Modul-Entwicklung:<br />
** [[DevelopmentModuleIntro|Development Module Introduction]]<br />
** [[Meta|Development Module and Package Meta Data]]<br />
** [[DevelopmentModuleAPI|Development Module API]]<br />
** [[DevelopmentFHEMWEB-API|Development FHEMWEB API]]<br />
** [[Blocking Call]]<br />
** [[CoProcess]]<br />
** [[HttpUtils]]<br />
** [[DevIo]]<br />
** [[Guidelines zur Dokumentation]]<br />
** [[DevelopmentGuidelinesAV|Development Guidelines AV-Module]]<br />
<br />
<br />
* Organisatorisches:<br />
** [[How to write a patch]]<br />
** [[SVN Nutzungsregeln]]<br />
<br />
<div align="right"><small>'''[[:Kategorie:Development|Alle Artikel zu Development]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 3; background-color:#d7ffff;"><br />
'''FHEM Wiki News'''<br />
<div style="height:20em;overflow:scroll;overflow-x:hidden;">{{FHEMWiki_News}}</div><br />
<div align="right"><small>'''Mehr [[FHEMWiki:News|News]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 2; background-color:#e7f8ff;"><br />
'''Was ist FHEM Wiki?'''<br />
<br />
Das '''FHEM Wiki''' ergänzt die stets tagesaktuelle, von den zuständigen Entwicklern gepflegte {{Link2CmdRef}} (Befehls-Referenz) um weitergehende Informationen rund um FHEM. Im Wiki arbeiten Nutzer und Entwickler gemeinsam an zusätzlicher Dokumentation von FHEM und damit zusammenhängenden Themen.<br />
<br />
Das FHEMWiki stellt neben der {{Link2CmdRef}}, dem [http://forum.fhem.de/ Forum] und der [http://www.fhem.de FHEM] Seite die zentrale Informationsquelle rund um FHEM dar. Bedeutung und Zusammenspiel dieser Elemente [[Dokumentationsstruktur|ist hier]] erläutert. <br />
<br />
<!-- {{NUMBEROFUSERS}} [[Special:Listusers|Benutzer]] haben sich seit Mai 2013 registriert und {{NUMBEROFARTICLES}} Artikel geschrieben. ({{NUMBEROFEDITS}} Seitenänderungen bislang).--><br />
Bitte [[FHEMWiki:Support | unterstütze uns]] und hilf, [[:Kategorie:NeedsEditing| das Wiki zu erweitern]]. Vielen Dank!<br />
<br />
<div align="right"><small>'''Mehr [[FHEMWiki:Über_FHEMWiki|über FHEMWiki]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 8; background-color:#F8F8FF;"><br />
'''Letzte Änderungen'''<br />
<div style="font-size:small;color:black;"><small>{{Special:Recentchanges/8}}</small></div><br />
<div align="right"><small>'''Mehr [[Special:Recentchanges|Änderungen]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 9; flex: 1 1 80%; background-color:#FFFFAA;"><br />
'''Die letzten fünf neuen Seiten'''<br />
<small>{{Special:NewPages/5}}</small><br />
<div align="right"><small>'''Mehr [[Special:NewPages|Neue Seiten]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 10; background-color:#DDD68F;"><br />
'''Administratives zum Wiki'''<br />
<br />
''Allgemeine Aktivitäten:''<br />
* Registrierung zur Mitarbeit: wende Dich bitte an einen [[FHEMWiki:Administratoren|Administrator]]<br />
* Basiswissen über die Mitarbeit an einem Wiki erarbeiten ([http://de.wikipedia.org/wiki/Wikipedia:Beteiligen z.B. Wikipedia])<br />
* Erweiterung und Korrektur von Artikeln, wo immer nötig<br />
* Ein(ig)e der [[Spezial:Gewünschte Seiten|gewünschten Seiten]] erstellen <br />
* Ideen aus dem [http://forum.fhem.de Forum] in bestehende oder neue Artikel einarbeiten<br />
* [[Spezial:Verwaiste Seiten|verwaiste Seiten]] in sinnvoller Weise verlinken<br />
* [[Spezial:Sackgassenseiten|Sackgassenseiten]] wikifizieren (Links auf andere Seiten einfügen)<br />
* [[Datei:Info_red.png|20px]] '''Tips / Regeln / Hinweise auf "[[FHEMWiki:Über FHEMWiki|Über FHEMWiki]]" beachten!''' [[Datei:Info_red.png|20px]]<br />
<br />
''Sonstiges:''<br />
* Zum Ausprobieren bitte die [[FHEMWiki:Sandbox]] benutzen<br />
* [//meta.wikimedia.org/wiki/Help:Contents Wiki Benutzerhandbuch].<br />
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Wiki-Konfigurationsvariablen]<br />
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]<br />
* [[FHEMWiki:Interna|Internes zu diesem Wiki]]<br />
</div><br />
<br />
</div><!-- Ende der Flexbox --><br />
[[Kategorie:FHEM]]</div>Otto123http://wiki.fhem.de/w/index.php?title=Hauptseite&diff=38243Hauptseite2023-04-03T21:04:37Z<p>Otto123: </p>
<hr />
<div><!-- Banner für wichtige Mitteilungen --------- --> <br />
<div style="background-color: green; border: 1px solid maroon; border-radius: 8px; padding: 0 1em 1em 1em; font-size: bigger; text-align: center; color: white;"><br />
'''Am Donnerstag 6.4.2023 ab 9:00 Uhr wird dieses Wiki wegen Wartungsarbeiten nur lesbar sein.<br />
<br />
'''Das Wiki kann zeitweise nicht erreichbar sein.<br />
<br />
'''Wir bitten um Verständnis.'''</div><br />
<!-- Banner für wichtige Mitteilungen --------- <br />
<div style="background-color: red; border: 1px solid maroon; border-radius: 8px; padding: 0 1em 1em 1em; font-size: bigger; text-align: center; color: white;"><br />
'''Es finden aktuell Wartungsarbeiten an der FHEM-Infrastruktur statt. Es kann daher zu kurzzeitigen Ausfällen und Beeinträchtigungen beim Zugriff auf FHEM-Dienste (Forum, SVN, Wiki, fhem.de, Alexa FHEM Connector) kommen'''<br />
<br />
'''Wir bitten um etwas Geduld. Sämtliche FHEM-Dienste werden im Laufe des Tages wieder wie gewohnt zur Verfügung stehen.'''<br />
</div><br />
Ende von Banner für wichtige Mitteilungen -------- --><br />
<!-- Ende von Banner für wichtige Mitteilungen -------- --><br />
<div><h1 style="font-family:sans-serif; font-size: 1.8em; border: none; text-align: center;">'''FHEM Wiki - Informationsportal zum FHEM SmartHome-Server'''</h1></div><br />
<br />
<div class="flexbox"> <!-- Beginn der Inhaltsboxen --><br />
<div class="mainpagebox" style="order: 1; flex: 1 1 80%; background-color:#cce5ff;"><br />
<div class="mw-collapsible mw-collapsed"><br />
'''Was ist FHEM?'''<br />
<div class="mw-collapsible-content"><br />
'''FHEM''' ([https://register.dpma.de/DPMAregister/marke/register/3020152110040/DE R]) ist ein in Perl geschriebener, GPL v2 lizensierter Server für die Heimautomatisierung. Man kann mit FHEM häufig auftretende Aufgaben automatisieren, wie z.B. Lampen / Rollladen / Heizung / usw. schalten, oder Ereignisse wie Temperatur / Feuchtigkeit / Stromverbrauch protokollieren und visualisieren.<br />
<br />
Das Programm läuft als Server, man kann es über WEB, dedizierte Smartphone Apps oder telnet bedienen, TCP Schnittstellen für JSON und XML existieren ebenfalls.<br />
<br />
Um es zu verwenden, benötigt man einen 24/7 Rechner (NAS, RPi, PC, MacMini, etc) mit einem Perl Interpreter und angeschlossene Interfaces wie CUL-, EnOcean-, Z-Wave-USB-Stick etc. für einen Zugang zu den Aktoren und Sensoren.<br />
</div></div></div><br />
<br />
<div class="mainpagebox" style="order: 4; background-color:#efefef;"><br />
'''Wie fange ich an?'''<br />
* [[Datei:Info_green.png|20px]][https://fhem.de/Heimautomatisierung-mit-fhem.pdf Heimautomatisierung mit FHEM][[Datei:Info_green.png|20px]]<br />DAS Einsteiger-PDF. '''Pflichtlektüre!'''<br /><br />
* [[Quick-Start]], english version: [[Quick-Start/en|Quick-Start]] <br />
* kleiner FHEM-Kurs, benötigt keine Hardware: [[Erste Schritte in FHEM]] / [[First steps in FHEM]]<br />
* [[Systemübersicht]]<br />
* Phasen eines FHEM-Projekts:<br />
** [[Planung]]<br />
** [[Umsetzung]] (Implementierung)<br />
** [[Betrieb]] ("Produktion")<br />
* [[:Kategorie:Glossary|Glossar]] (Erklärung für bestimmte Begriffe)<br /><br />
* [[:Kategorie:HOWTOS|Verschiedene HowTos]]<br /><br />
* [[:Kategorie:FAQ|Frequently asked Questions - Häufig gestellte Fragen mit Antworten]]<br /><br />
<!-- Verlinkte Wiki-Seite für Anfänger ist leer, darum auskommentiert<br />
<div align="right"><small>'''[[Help:Reading|How to read FHEMWiki]]'''</small></div>--><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 6; background-color:#fff0e0;"><br />
'''Unterstützte Hardware (Auszug)'''<br />
<br />
* [[:Kategorie:Hardware Typen|Hardware Typen]] - Funktionsbezogene Übersicht (z.B. [[:Kategorie:Unterhaltungselektronik|Unterhaltungselektronik / Multimedia]], [[:Kategorie:Heizungssteuerung|Heizungssteuerung]], [[:Kategorie:Energieverbrauchsmessung|Energieverbrauchsmessung]], etc.)<br />
* [[:Kategorie:Server Hardware|Server Hardware]] - Hardware, auf der FHEM installiert werden kann<br />
* [[:Kategorie:EMS Components|EMS]], [[:Kategorie:FHT Components|FHT]], [[:Kategorie:HMS Components|HMS]] Komponenten<br />
* [[:Kategorie:1-Wire|1-Wire System]]<br />
* [[:Kategorie:EIB/KNX|EIB/KNX Komponenten]]<br />
* [[:Kategorie:FS20 Components|FS20 Komponenten]]<br />
* [[:Kategorie:EnOcean Components|EnOcean Komponenten]]<br />
* [[:Kategorie:HomeMatic Components|HomeMatic Komponenten]]<br />
* [[:Kategorie:MAX|MAX! Komponenten]]<br />
* [[:Kategorie:panStamp|panStamp Komponenten]]<br />
* [[:Kategorie:Z-Wave Components|Z-Wave Komponenten]]<br />
* [[:Kategorie:ZigBee|Zigbee Komponenten]]<br />
* [[:Kategorie:IP Components|Geräte mit Webinterface ("IP")]]<br />
* [[:Kategorie:Other Components|Andere Komponenten / Sonstige Systeme]]<br />
<br />
<div align="right"><small>'''[[:Kategorie:Hardware|Alle Hardware-Kategorien]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 5; background-color:#F8F8FF;"><br />
'''Ideen und Lösungen'''<br />
<br />
* [[:Kategorie:Code_Snippets|Verschiedene kommentierte Lösungen und Code-Schnippsel]]<br />
* [[:Kategorie:Examples|Beispielanwendungen - Hardwarelösungen - Fremdsystemanbindungen]]<br />
* [[Anwendungsszenarien]]<br />
* [[Trick der Woche|Tipp der Woche]]<br />
* [[Wie kann ich...]]?<br />
<br />
<div align="right"><small>'''[[:Kategorie:FHEM|FHEM-Haupt-Kategorien]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 7; background-color:#FFFFE7;"><br />
'''Developers Corner'''<br />
<br />
* Informationen zur Modul-Entwicklung:<br />
** [[DevelopmentModuleIntro|Development Module Introduction]]<br />
** [[Meta|Development Module and Package Meta Data]]<br />
** [[DevelopmentModuleAPI|Development Module API]]<br />
** [[DevelopmentFHEMWEB-API|Development FHEMWEB API]]<br />
** [[Blocking Call]]<br />
** [[CoProcess]]<br />
** [[HttpUtils]]<br />
** [[DevIo]]<br />
** [[Guidelines zur Dokumentation]]<br />
** [[DevelopmentGuidelinesAV|Development Guidelines AV-Module]]<br />
<br />
<br />
* Organisatorisches:<br />
** [[How to write a patch]]<br />
** [[SVN Nutzungsregeln]]<br />
<br />
<div align="right"><small>'''[[:Kategorie:Development|Alle Artikel zu Development]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 3; background-color:#d7ffff;"><br />
'''FHEM Wiki News'''<br />
<div style="height:20em;overflow:scroll;overflow-x:hidden;">{{FHEMWiki_News}}</div><br />
<div align="right"><small>'''Mehr [[FHEMWiki:News|News]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 2; background-color:#e7f8ff;"><br />
'''Was ist FHEM Wiki?'''<br />
<br />
Das '''FHEM Wiki''' ergänzt die stets tagesaktuelle, von den zuständigen Entwicklern gepflegte {{Link2CmdRef}} (Befehls-Referenz) um weitergehende Informationen rund um FHEM. Im Wiki arbeiten Nutzer und Entwickler gemeinsam an zusätzlicher Dokumentation von FHEM und damit zusammenhängenden Themen.<br />
<br />
Das FHEMWiki stellt neben der {{Link2CmdRef}}, dem [http://forum.fhem.de/ Forum] und der [http://www.fhem.de FHEM] Seite die zentrale Informationsquelle rund um FHEM dar. Bedeutung und Zusammenspiel dieser Elemente [[Dokumentationsstruktur|ist hier]] erläutert. <br />
<br />
<!-- {{NUMBEROFUSERS}} [[Special:Listusers|Benutzer]] haben sich seit Mai 2013 registriert und {{NUMBEROFARTICLES}} Artikel geschrieben. ({{NUMBEROFEDITS}} Seitenänderungen bislang).--><br />
Bitte [[FHEMWiki:Support | unterstütze uns]] und hilf, [[:Kategorie:NeedsEditing| das Wiki zu erweitern]]. Vielen Dank!<br />
<br />
<div align="right"><small>'''Mehr [[FHEMWiki:Über_FHEMWiki|über FHEMWiki]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 8; background-color:#F8F8FF;"><br />
'''Letzte Änderungen'''<br />
<div style="font-size:small;color:black;"><small>{{Special:Recentchanges/8}}</small></div><br />
<div align="right"><small>'''Mehr [[Special:Recentchanges|Änderungen]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 9; flex: 1 1 80%; background-color:#FFFFAA;"><br />
'''Die letzten fünf neuen Seiten'''<br />
<small>{{Special:NewPages/5}}</small><br />
<div align="right"><small>'''Mehr [[Special:NewPages|Neue Seiten]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 10; background-color:#DDD68F;"><br />
'''Administratives zum Wiki'''<br />
<br />
''Allgemeine Aktivitäten:''<br />
* Registrierung zur Mitarbeit: wende Dich bitte an einen [[FHEMWiki:Administratoren|Administrator]]<br />
* Basiswissen über die Mitarbeit an einem Wiki erarbeiten ([http://de.wikipedia.org/wiki/Wikipedia:Beteiligen z.B. Wikipedia])<br />
* Erweiterung und Korrektur von Artikeln, wo immer nötig<br />
* Ein(ig)e der [[Spezial:Gewünschte Seiten|gewünschten Seiten]] erstellen <br />
* Ideen aus dem [http://forum.fhem.de Forum] in bestehende oder neue Artikel einarbeiten<br />
* [[Spezial:Verwaiste Seiten|verwaiste Seiten]] in sinnvoller Weise verlinken<br />
* [[Spezial:Sackgassenseiten|Sackgassenseiten]] wikifizieren (Links auf andere Seiten einfügen)<br />
* [[Datei:Info_red.png|20px]] '''Tips / Regeln / Hinweise auf "[[FHEMWiki:Über FHEMWiki|Über FHEMWiki]]" beachten!''' [[Datei:Info_red.png|20px]]<br />
<br />
''Sonstiges:''<br />
* Zum Ausprobieren bitte die [[FHEMWiki:Sandbox]] benutzen<br />
* [//meta.wikimedia.org/wiki/Help:Contents Wiki Benutzerhandbuch].<br />
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Wiki-Konfigurationsvariablen]<br />
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]<br />
* [[FHEMWiki:Interna|Internes zu diesem Wiki]]<br />
</div><br />
<br />
</div><!-- Ende der Flexbox --><br />
[[Kategorie:FHEM]]</div>Otto123http://wiki.fhem.de/w/index.php?title=Virtueller_Controller_VCCU&diff=37831Virtueller Controller VCCU2022-12-20T11:55:19Z<p>Otto123: /* Einrichten */ Ergänzung im Abschnitt VCCU</p>
<hr />
<div>{{Randnotiz|RNTyp=r|RNText=Bitte beachten Sie: Eine VCCU innerhalb FHEM ist nicht zu verwechseln mit einer virtualisierten CCU3! Für letztere gibt es eine eigene Modulfalmilie [[HMCCU]], hier geht es ausschließlich um Geräte des TYPE CUL_HM.}}Eine '''Virtuelle CCU''', auch '''VCCU''' genannt, ist eine Zentrale für [[HomeMatic]]-Geräte. Die VCCU tritt beim [[Pairing (HomeMatic)|Pairing]] an die Stelle des ''I/O-Devices'' (auch "Schnittstelle" genannt, zum Beispiel [[CUL]] und [[HM-CFG-LAN]]).<br />
<br />
HomeMatic-Geräte werden üblicherweise mit einer Zentrale gepaired, um sie zentral verwalten zu können. Der Pairing-Partner ist im einfachsten Fall das I/O-Device ([[CUL]], [[HM-CFG-LAN]], …) selbst. Nachteilig dabei ist, dass der Ausfall der Schnittstelle bewirkt, dass alle gepairten Geräte nicht mehr bedient werden können. Dies lässt sich im Gegensatz zu ungepairten Protokollen (z.b. FS20) auch nicht durch doppelte Definition mit abweichenden IO-Devices lösen, da das Pairing nur mit einer ''hmId'' erfolgen kann. Daher kann auch durch mehrere Schnittstellen / IOs keine Redundanz erreicht werden. Ähnliches gilt für eine Vergrößerung der Funkabdeckung durch mehrere Schnittstellen. <br />
<br />
Dieses Problem kann durch eine VCCU gelöst werden. Die VCCU ist eine virtuelle Zentrale; sie tritt beim Pairing an die Stelle der Schnittstelle. Sie erhält eine eigene ''hmId'', mit der die HM Sensoren und Geräte gepaired werden. Die Funkschnittstelle(n) werden dann von der VCCU als reine "dumme" IOs verwaltet. Dieses bietet vielfältige Möglichkeiten, z.B. die Verwendung mehrerer IOs, aus denen die VCCU die "beste" nach diversen Kriterien (z.B. RSSI) auswählt. Dadurch kann sowohl die Redundanz als auch die Funkabdeckung erhöht werden.<br />
<br />
Durch das Pairen der Geräte mit einer virtuellen CCU ergeben sich folgende Vorteile:<br />
<br />
* Die Verwendung mehrerer I/O-Devices wird möglich. Das sorgt für Redundanz (Ausfallsicherheit) und/oder Reichweiten-Vergrößerung.<br />
* Der Tausch eines I/O-Devices ist transparent für gepairte Geräte.<br />
* Die VCCU stellt virtuelle Kanäle zur Verfügung, mit denen HomeMatic-Geräte [[HomeMatic Peering Beispiele|gepeert]] werden können.<br />
* "Geordnete" Termination von Nachrichten (da die üblichen Funkschnittstellen (wie CUL im HM-Mode oder HM-LAN-Konfigurator) relativ "dumm" sind, führen viele Zustände zu den bekannten "Help me" Einträgen im Log)<br />
<br />
Der einzige Nachteil einer VCCU gegenüber dem direkten Pairing mit dem I/O-Device ist ein Mehraufwand bei der initialen Konfiguration vom FHEM.<br />
<br />
== Kurzbeschreibung ==<br />
Ein virtueller Controller '''VCCU''' ist der Protokoll-Endpunkt der Zentrale und ersetzt dabei logisch (jedoch nicht physikalisch) z.b. den [[HM-CFG-LAN LAN Konfigurations-Adapter]] einer "klassischen" FHEM Konfiguration<br />
<br />
Es können einer VCCU einzelne oder mehrere IO Devices zugeordnet werden. Man bündelt dadurch mehrere I/O Devices (z.B. CULs und HM-CFG-LANs) zu einem ''Pool''. Den HM-Devices in FHEM (Aktoren, Sensoren) kann dann als I/O Device die ''VCCU'' zugeordnet werden, dies geschieht durch das Attribut ''IOgrp.''<br />
<br />
Durch diese Gruppierung der I/O Devices und dem Zuordnen der VCCU zu einem Device entstehen verschieden Vorteile, abhängig des Einsatzes der VCCU. So kann ein beliebiges I/O Device im Device Pool der VCCU ausfallen und das oder die verbliebenden I/O Devices übernehmen diese Funktion (abhängig von der Funkreichweite/Erreichbarkeit). Die VCCU wird das nächst verfügbare I/O Device zum Senden/Empfangen verwenden.<br />
<br />
Ein weiterer Vorteil ist, dass durch die VCCU auch das I/O Device genutzt werden kann, welches die beste Funkqualität aufweist. Dies kann z.B. bei beweglichen Sensoren/Aktoren (Fernbedienungen) sinnvoll sein, oder wenn die Funkqualität durch andere Faktoren beeinflusst wird (z.B. Tür/Tor oder andere "bewegliche" Störfaktoren)<br />
<br />
== Mehrere VCCUs in einer Installation==<br />
Theoretisch erlaubt FHEM die parallele Nutzung mehrerer VCCUs, praktisch ergeben sich dadurch jedoch keine Vorteile gegenüber einer einzigen VCCU. Insbesondere kann bereits eine VCCU verschiedene I/O-Devices bedienen, zum Beispiel einen [[CUL]] ''und'' ein [[HM-CFG-LAN]].<br />
<br />
Jede VCCUs muss eine eindeutige ''HomeMatic-ID'' haben, mit der HomeMatic-Geräte gepaired werden. Folglich kann jedes HomeMatic-Gerät nur mit ''einer'' VCCU gepaired werden.<br />
<br />
Die VCCU überschreibt die hmid eines I/O Device mit seiner eignen, daher können nicht mehrere VCCUs dasselbe I/O Device verwenden.<br />
<br />
== Definition der VCCU==<br />
=== hmId wählen ===<br />
Eine VCCU benötigt wie alle HM Devices eine Adresse, mit der sie angesprochen wird. Bei Schnittstellen und Zentralen ist dies eine ''hmId''. Da die VCCU eine (virtuelle) Zentrale ist, muss sie auch mit einer ''hmId'' versehen werden. Dies geschieht per define analog zur Anlage einer physischen Schnittstelle (siehe weiter unten)<br />
<br />
Eine VCCU gibt die ''hmId'' an die ihr zugewiesenen IOs (Funkschnittstellen) weiter. Damit haben alle von einer VCCU genutzten I/Os nach der Zuweisung dieselbe ''hmId''.<br />
<br />
* Definiert man eine VCCU nachdem IOs für HomeMatic angelegt und in Verwendung sind, sollte man die ''hmId'' der bereits vorhandenen Funkschnittstelle verwenden, hierdurch kann man sich das Neupairen der HM Devices ersparen. <br />
* Hat man bereits mehrere Funkschnittstellen im Einsatz, werden diese unterschiedliche ''hmIds'' haben, zumindest eine Schnittstelle wird nach der Zuweisung zur VCCU seine ''hmId'' also ändern. <br />
* Für mit dieser Schnittstelle schon gepairte Devices ist ein Neupairen unumgänglich.<br />
<br />
Außerdem muss in jedem Fall das attr IOgrp eines vor Anlage der VCCU gepairten Gerätes auf die VCCU angelegt/geändert werden., z.B. so<br />
attr <device> IOgrp <Name der vccu><br />
(Siehe weiter unten ein Tipp, wie dies leicht nachträglich erledigt werden kann)<br />
<br />
Mit der Anlage einer VCCU hat der Inhalt des vorhandenen Attributes IODev eines HM_Devices keine Wirkung mehr. Statt dessen setzt die VCCU ein Internal IODev automatisch je nach Verfügbarkeit und Funklage. Das Attribut IODev ist dann nicht mehr notwendig und kann auch nicht mehr gesetzt werden, wenn IOgrp gesetzt ist. <br />
<br />
=== Einrichten ===<br />
{{Randnotiz|RNTyp=g|RNText=Achtung, die Reihenfolge der Befehle muss exakt eingehalten werden.}}<br />
Diese Befehlsfolge erzeugt eine VCCU, bitte die Reihenfolge genau so abarbeiten!<br />
{{Randnotiz|RNTyp=r|RNText=CUL_HM ist leider nicht Raw Definition fähig!}}<br />
Die Werte in <> durch die echten Werte ersetzen und die <> weglassen! Beispiel: <code>attr VCCU IOgrp VCCU</code><br />
<br />
Das Attribut ''IOList'' dient dazu festzulegen, welche physikalischen Schnittstellen ("IO") von der VCCU genutzt werden, dies sind in der Regel '''alle''' HM-fähigen Schnittstellen einer Installation.<br />
<br />
''IOList'' beinhaltet die Komma-getrennte Liste der IOs ('''keine Leerzeichen'''!), so wie sie in FHEM angelegt sind.<pre><br />
define <Name der vccu> CUL_HM <hmId><br />
attr <Name der vccu> model CCU-FHEM<br />
attr <Name der vccu> IOList <Name des io1>[,<Name des io2>,...]<br />
attr <Name der vccu> IOgrp <Name der vccu><br />
</pre><br />
Die folgende Darstellung mit zwei IOs im Raw Definition Format dient nur als Beispiel. '''Diese Abfolge ist nicht zum Anlegen der VCCU geeignet!'''<br />
<br />
Es seien z.B. in FHEM bereits die beiden Schnittstellen HMLAN0 und CUL0 angelegt:<br />
<br />
define HMLAN0 HMLAN 192.168.168.2:1000<br />
attr HMLAN0 hmId 123456<br />
attr HMLAN0 hmLanQlen 1_min<br />
attr HMLAN0 icon hm_lan<br />
<br />
define CUL0 CUL /dev/ttyACM0@9600 0000<br />
attr CUL0 hmId 123456<br />
attr CUL0 icon cul_cul<br />
attr CUL0 rfmode HomeMatic<br />
<br />
Dann kann zusätzlich die VCCU mit derselben hmId angelegt werden und die beiden physikalischen Schnittstellen ihr zugewiesen:<br />
<br />
define VCCU CUL_HM 123456<br />
attr VCCU IOList CUL0,HMLAN0<br />
attr VCCU IOgrp VCCU<br />
attr VCCU model CCU-FHEM<br />
attr VCCU subType virtual<br />
attr VCCU webCmd virtual:update<br />
<br />
Wird die VCCU mit einer von vorhandenen Schnittstellen abweichenden ''hmId'' angelegt, so wird die ''hmId'' der ihr zugewiesenen Schnittstelle(n) automatisch angepasst. Dies hat in der Regel zur Folge, dass HM Devices neu gepairt werden müssen.<br />
<br />
Dies trifft auch zu, wenn bereits vorhandene Schnittstellen unterschiedliche hmIDs haben, dann wird sich die hmID mindestens einer Schnittstelle ändern. (Der Einfachheit halber war im obigen Beispiel angenommen, dass auch vorher die beiden Schnittstellen bereits die gleiche ID hatten.)<br />
<br />
=== Auswirkungen auf IOs / Funkschnittstellen===<br />
Sind IOs durch das Attribut IOList einer VCCU zugewiesen und werden die notwendigen Attribute im IO gesetzt, so wird die hmId durch die VCCU kontrolliert. Ein HMLAN/USB ist etwas enger verbunden als CUL IOs. Beim HMLAN kann die HMId nicht mehr geändert werden. Die kontrollierende VCCU wird in den Internals ''owner'' und ''owner_CCU'' des IO automatisch eingetragen. <br><br />
<br />
=== Was passiert beim Austausch/Wegfall von IOs ===<br />
Häufig wird das Thema VCCU erst angefasst, wenn das System schon eine Weile besteht und ein zweiter IO eingebaut, oder der alte IO ausgetauscht werden soll. Dabei entsteht folgende ungünstige Struktur in der fhem.cfg<br />
...<br />
define erster IO<br />
...<br />
define alle möglichen HM Geräte<br />
...<br />
define VCCU<br />
define neuer IO<br />
Beim Start von FHEM wird die cfg Zeilenweise abgearbeitet und für jedes HM Gerät geprüft ob ein IO vorhanden ist, gegebenenfalls erfolgt ein Fehlereintrag im Log (unknown IODev specified). Wenn der neue IO erst am Ende der cfg definiert ist, ist er für alle davor liegenden HM Geräte nicht vorhanden. Das ist nur ein Schönheitsfehler beim Start von FHEM, im laufenden Betrieb spielt das keine Rolle.<br />
<br />
Folgende Struktur wäre erstrebenswert<br />
...<br />
define Homematic IO 1<br />
define Homematic IO 2<br />
define VCCU<br />
define HM Geräte <br />
...<br />
Solange kein Modul die Einträge in der fhem.cfg entsprechend einsortiert, muss diese Korrektur von Hand erfolgen. Dies ist einer der wenigen Fälle, wo direktes Editieren der fhem.cfg z.B. mit dem eingebautem Editor unumgänglich ist. Soll der im Standard-WEBinterface von FHEM eingebaute Editor verwendet werden, muss zuerst das Attribut<br />
attr WEB editConfig 1<br />
in FHEM gesetzt werden.<br />
Anschließend die kompletten define Blöcke mit allem was dazu gehört entsprechend in die empfohlene Struktur bringen. <br />
Datei sichern und rereadcfg eingeben.<br />
<br />
=== Pairen von HM Devices===<br />
Ein erneutes Pairen nach dem Anlegen einer VCCU in bestehenden Installationen ist nicht notwendig!<br />
<br />
Neue HM Devices sollten vorzugsweise direkt mit der VCCU gepairt werden, hierzu werden die normalen Befehle<br />
hmPairForSec<br />
also z.b. <br />
set VCCU hmPairForSec 600<br />
oder<br />
hmPairSerial<br />
verwendet. <br />
<br />
Es ist alternativ weiter möglich - auch nach Anlage einer VCCU - HM Devices mit diesen Kommandos direkt an ein IO zu pairen, d.h. diese Kommandos haben auch nach Anlage einer VCCU noch eine Funktion an der physikalischen Schnittstelle (im Gegensatz z.b. zum attr IODev).<br />
<br />
Da die VCCU und alle IOs die selbe ''hmId'' teilen, hat diese '''nicht''' die Wirkung, dass das Geräte etwa nicht mit der VCCU, sondern nur mit dem gepairten IO angesprochen werden kann.<br />
<br />
Ist der Pairvorgang nicht sofort (oder nur teilweise) erfolgreich, kann/muss er ohne Weiteres 2 bis 3 mal wiederholt werden. Dann sollte das Gerät erfolgreich gepairt sein. Mit hmInfo configCheck kann das einfach überprüft werden. Mitunter kann es auch sinnvoll sein, das Gerät in den Auslieferungszustand zu bringen (siehe Handbuch, oft Knopf mindestens 5 Sekunden drücken, bis es blinkt, dann loslassen und nochmals 5 Sekunden drücken, bis es schneller blinkt) und danach erneut zu pairen.<br />
<br />
==== Autocreate ====<br />
Sofern Autocreate eingeschaltet ist und das Pairing wie oben beschrieben an die VCCU erfolgt, wird unter anderem für das Device folgendes Attribut angelegt:<br />
<br />
attr <device> IOgrp VCCU:<PhysischesIO><br />
<br />
z.B.<br />
<br />
attr Thermostat_Bad IOgrp VCCU:HMLAN1<br />
<br />
Das attr <device> IOgrp:... zeigt an, welches physikalische IO zum Zeitpunkt des Autocreates verwendet wurde, vermutlich ist das das IO mit der besseren Funklage (wenn mehrere existieren). Dasselbe IO wird mit<br />
IOgrp VCCU:HMLAN1<br />
auch als prefered eingetragen. D.h. die VCCU wird später zuerst prüfen ob HMLAN1 verfügbar ist (condition=ok) und es dann verwenden, andere IOs werden nur verwendet, wenn HMLAN1 nicht verfügbar ist.<br />
Dieser Eintrag kann manuell geändert werden, Details im folgenden Abschnitt.<br />
<br />
== Dynamisches IO ==<br />
Ohne VCCU sendet das System Befehle an ein HM Device in der Regel immer über das gleiche IO-Device. Fällt es aus, wird nicht mehr gesendet, selbst wenn ein zweites IO verfügbar wäre. Außerdem kann eine ''bewegliche'' Fernbedienung ihre Verbindung zu einem IO verlieren, obwohl sie über ein anderes IO gut kommunizieren könnten.<br />
<br />
Die VCCU adressiert beide Probleme:<br />
<br />
Durch das Attibut IOgrp <br />
attr <device> IOgrp <vccu>:<preferredIO><br />
kann bestimmt werden, wie die VCCU die IO Devices genau nutzt. Insbesondere ist optional ein Preferd IO Device definierbar: bei stationären Devices - der häufigste Fall - sollte man das beste IO auswählen und als Default nutzen. Ein weiteres IO wird bei Ausfall des Ersten genutzt.<br />
<br />
Das preferredIO ist jedoch optional und kann insbesondere bei beweglichen HM Devices (Fernbedienungen) weggelassen werden.<br />
<br />
Es können auch mehrere preferredIO definiert werden, diese werden in der definierten Reihenfolge genutzt<br />
attr <device> IOgrp <vccu>:<prefIO1>,<prefIO2>,<prefIO3><br />
<br />
Beispiele:<br />
<br />
Durch<br />
attr <device> IOgrp VCCU:HMLAN1<br />
wird die VCCU zuerst versuchen Befehle an <device> mit HMLAN1 zu senden, falls seine condition=ok. <br />
Falls nicht wird (einer) der verbleibende(n) IOs verwendet, hier der mit dem besten RSSI.<br />
<br />
Durch<br />
attr <device> IOgrp VCCU<br />
wird durch die VCCU der IO mit dem besten RSSI zum Device gewählt, falls seine condition=ok ist. <br />
<br />
Da dies für jedes angelegte HM Device einzeln definiert werden kann/muss, kann so auch eine Verteilung des Funkverkehrs vorgenommen werden, z.b. um die 1%-Regel (HighLoad) zu berücksichtigen, dennoch bleibt die Redundanz bei Ausfall einer Schnittstelle erhalten.<br />
<br />
=== Bemerkungen ===<br />
Die besprochene Steuerung betrifft das '''Senden'''. Empfangen und verarbeitet werden Nachrichten immer von allen verfügbaren Quellen. Kanäle senden nicht selbständig und haben daher auch kein Attribut IOgrp.<br />
<br />
=== IOgrp bei nachträglicher Einrichtung einer VCCU ===<br />
Wie erwähnt wird beim Verwenden von Autocreate das Attribut IOgrp mit angelegt.<br />
Bei HM Devices die vor der Einrichtung einer VCCU angelegt wurden, fehlt das Attribut aber.<br />
Es wird empfohlen, das Attribut IOgrp in solchen Devices zu nachträglich setzen. Kanäle senden nicht selbständig, haben daher kein Attribut IOgrp.<br><br />
Das Attribut '''IODev''' wird dann automatisch gelöscht, wenn es gesetzt war, Usereinträge haben keine Funktion.<br><br />
<br />
==== Setzen der IOgrp auf (fast) allen Devices mit einem einzigen Befehl ====<br />
In einer bestehenden FHEM-Installation mit mehreren/vielen Devices, kann das Setzen der ''IOgrp'' aufwendig sein. <br />
<br />
Mit folgendem Befehl werden alle Geräte mit einer 6 stelligen DEF (HEX Zahl) um das notwendige Attribut erweitert. Die DEF 000000 (ActionDetector) wird ausgespart.<br />
<br />
Zunächst kann man den Filter testen und damit die Auswirkung auf Geräte prüfen.<br />
:<code>list TYPE=CUL_HM:FILTER=DEF=[0-9a-fA-F]{6}:FILTER=DEF!=[0]{6}</code><br />
<br />
Bitte nur '''VCCU''' durch den echten Namen der VCCU ersetzen!<br />
:<code>attr TYPE=CUL_HM:FILTER=DEF=[0-9a-fA-F]{6}:FILTER=DEF!=[0]{6} IOgrp VCCU</code><br />
Anschließend nicht vergessen, die Konfiguration mit '''save''' zu speichern.<br />
<br />
== Virtuelle Kanäle der VCCU==<br />
{{Randnotiz|RNTyp=r|RNText= Die virtuellen Kanäle der VCCU funktionieren nicht als:<br />
# virtueller Fensterkontakt<br />
# virtueller Temperaturfühler<br />
# virtueller HM-CC-TC<br />
# virtueller TeamLead für Rauchmelder<br />
Siehe Beispiel in [[HM-CC-RT-DN]] im Abschnitt externe Sensoren}}<br />
: ''→ Siehe auch: [[HomeMatic#IO_Entities]]''<br />
<br />
Eine VCCU kann bis zu 50 virtuelle Kanäle, sogenannte '''IO-Entities''', bedienen. Diese können als Sender/Sensoren oder Empfänger genutzt werden. Man kann diese Kanäle mit einem realen Kanal peeren und Aktionen triggern. <br />
<br />
Man peert beispielsweise einen Dimmer mit einer IO-Entity um "Tastendrücke" in der Zentrale auslösen zu können. Sowohl kurze (short) als auch lange (long) Tastendrücke können so an den Dimmer gesendet werden.<br />
Auch mehrere Aktoren können mit einer IO-Entity gepeert werden, beispielsweise um alle Lichter der Gruppe mit einem "press" gleichzeitig zu schalten. <br />
<br />
=== Anlegen ===<br />
set VCCU virtual <Anzahl Button><br />
z.B.<br />
set VCCU virtual 10<br />
legt 10 Kanäle für die VCCU an, die Kanäle 1-10. Evtl. vorhandene Kanäle größer 10 werden gelöscht.<br />
<br />
=== Kommandos ===<br />
: ''→ Siehe auch: {{Link2CmdRef|Anker=CUL_HM-set-virtual}}''<br />
<br />
Verfügbare Kommandos auflisten:<br />
<br />
get vccu_Btn1 cmdList<br />
<br />
Insbesondere gibt es:<br />
set vccu_Btn1 press short<br />
set vccu_Btn1 press long<br />
set vccu_Btn1 postEvent <condition><br />
<br />
[[Kategorie:HomeMatic supportDevice]]<br />
<br />
[[Kategorie:HOWTOS]]</div>Otto123http://wiki.fhem.de/w/index.php?title=FHEM_startet_nicht_-_Tipps_zur_Fehlersuche&diff=37665FHEM startet nicht - Tipps zur Fehlersuche2022-11-14T11:46:32Z<p>Otto123: /* Minimal Config starten */</p>
<hr />
<div>Es gibt einen weiteren Artikel zur Fehlersuche. [[Hilfe! Mein FHEM funktioniert nicht!]]<br />
<br />
'''Kein Zugriff auf FHEMWEB/FHEM startet nicht - Was kann ich tun?'''<br />
<br />
Deine [[FHEMWEB]]-Seite ist nicht erreichbar? Ist FHEM tot, oder ist das Netzwerk kaputt? Was kann ich machen, um zu prüfen, woran es genau liegt?<br />
<br />
In diesem Wiki-Artikel soll es darum gehen, wie Du für Dich prüfen kannst, ob ein Fehler bei FHEM, im Netzwerk oder ein anderes Problem vorliegt.<br />
== Prüfen: Läuft überhaupt ein FHEM-Prozess? ==<br />
Man kann sich unter einem Linuxsystem sämtliche laufende Prozesse auflisten lassen<br />
<br />
<code>ps ax</code><br />
<br />
Der Befehl ''ps'' listet je nach Argument alle laufende Prozesse auf. Die Liste kann man nun noch nach einem bestimmten Prozess filtern. Aufruf und Ausgabe einer Prozessliste mit einem Filter nach perl sieht z. B. so aus:<br />
<br />
<code>ps ax | grep perl</code><br />
<br />
<code>cooltux@fhem01-cluster:~> ps ax | grep perl</code><br />
<br />
<code>11320 pts/0 S+ 0:00 grep --color=auto perl</code><br />
<br />
Wie wir sehen, wird hier lediglich der gerade ausgeführte Befehl ''ps'' gefunden (weil das Wort ''perl'' in der Aufrufzeile stand. Es wird hier überhaupt kein Perl-Prozess gelistet. Aktuell läuft also definitiv kein FHEM, das ja ein Perl-Programm/Prozess ist.<br />
<br />
Eine Prozessliste mit einem laufenden FHEM-Prozess könnte so aussehen:<br />
<br />
<code>[11:31 root@fhem01-cluster cooltux] > ps ax | grep perl</code><br />
<br />
<code>15852 ? R 2119:09 /usr/bin/perl fhem.pl configDB</code><br />
<br />
<code>21447 pts/0 S+ 0:00 grep perl</code><br />
<br />
FHEM (''perl fhem.pl ...'') ist in diesem Fall also aktiv.<br />
<br />
=== systemd ===<br />
<br />
Nutzt das Linux-System den systemd, kann mit folgendem Befehl der Status des FHEM-Prozesses geprüft werden:<br />
<br />
<code>service fhem status</code><br />
<br />
Eine Ausgabe könnte z.B. so aussehen:<br />
<pre><br />
● fhem.service - FHEM Home Automation<br />
Loaded: loaded (/etc/systemd/system/fhem.service; enabled; vendor preset: enabled)<br />
Active: active (running) since Thu 2018-08-09 14:32:16 CEST; 20h ago<br />
Process: 27641 ExecStart=/usr/bin/perl fhem.pl fhem.cfg (code=exited, status=0/SUCCESS)<br />
Main PID: 27643 (perl)<br />
Tasks: 1 (limit: 4915)<br />
CGroup: /system.slice/fhem.service<br />
└─27643 /usr/bin/perl fhem.pl fhem.cfg<br />
<br />
Aug 09 14:32:16 fhem-host systemd[1]: Starting FHEM Home Automation...<br />
Aug 09 14:32:16 fhem-host systemd[1]: Started FHEM Home Automation.<br />
</pre><br />
<br />
== Prüfen: Ist der laufende FHEM-Prozess überlastet? ==<br />
Ich sollte mir anschauen, ob der FHEM-Prozess vielleicht zu sehr ausgelastet ist, der Prozess also 100 Prozent CPU Auslastung produziert?<br />
<br />
Ein weiterer Linuxbefehl ''top'' wird uns hierbei behilflich sein:<br />
<pre style="white-space: pre;"><br />
[11:38 root@fhem01-cluster cooltux] > top<br />
top - 11:38:18 up 11 days, 18:58, 1 user, load average: 1,07, 1,03, 1,00<br />
Tasks: 125 total, 2 running, 123 sleeping, 0 stopped, 0 zombie<br />
%Cpu(s): 24,9 us, 0,9 sy, 0,0 ni, 74,1 id, 0,0 wa, 0,0 hi, 0,1 si, 0,0 st<br />
KiB Mem: 945524 total, 833532 used, 111992 free, 41552 buffers<br />
KiB Swap: 102396 total, 46564 used, 55832 free. 496240 cached Mem<br />
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND<br />
15852 fhem 20 0 103652 82160 5068 R 100,0 8,7 2125:41 perl <br />
21683 root 20 0 5740 2560 2092 R 1,0 0,3 0:00.37 top <br />
19129 cooltux 20 0 86204 22348 3668 S 0,3 2,4 64:16.90 insync-portable <br />
21350 cooltux 20 0 11436 2848 2248 S 0,3 0,3 0:00.10 sshd <br />
1 root 20 0 23292 2368 1380 S 0,0 0,3 0:54.23 systemd <br />
2 root 20 0 0 0 0 S 0,0 0,0 0:01.09 kthreadd <br />
3 root 20 0 0 0 0 S 0,0 0,0 3:37.20 ksoftirqd/0 <br />
5 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kworker/0:0H <br />
7 root 20 0 0 0 0 S 0,0 0,0 8:20.71 rcu_sched <br />
8 root 20 0 0 0 0 S 0,0 0,0 0:00.00 rcu_bh <br />
9 root rt 0 0 0 0 S 0,0 0,0 0:05.45 migration/0<br />
</pre><br />
Hier können wir nun eindeutig erkennen, dass unser FHEM die CPU mit 100 Prozent auslastet. FHEM hat also ein Problem!<br />
<br />
Zum Vergleich ein FHEM/Perl-Prozess ohne Probleme:<br />
<pre style="white-space: pre;"><br />
[11:50 root@fhem01-cluster cooltux] > top<br />
top - 11:50:33 up 11 days, 19:10, 1 user, load average: 0,84, 1,03, 1,00<br />
Tasks: 133 total, 1 running, 132 sleeping, 0 stopped, 0 zombie<br />
%Cpu(s): 0,6 us, 0,8 sy, 0,0 ni, 98,6 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st<br />
KiB Mem: 945524 total, 818344 used, 127180 free, 43748 buffers<br />
KiB Swap: 102396 total, 46820 used, 55576 free. 489652 cached Mem<br />
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND<br />
22074 fhem 20 0 86424 68516 7200 S 1,3 7,2 0:47.64 perl<br />
22294 root 20 0 5740 2564 2092 R 1,3 0,3 0:00.19 top<br />
22296 fhem 20 0 86424 63556 2240 S 1,3 6,7 0:00.04 perl<br />
22297 fhem 20 0 2088 408 328 S 0,7 0,0 0:00.02 ping<br />
7 root 20 0 0 0 0 S 0,3 0,0 8:21.23 rcu_sched<br />
1366 mysql 20 0 620608 157132 5736 S 0,3 16,6 70:12.59 mysqld<br />
19481 root 20 0 0 0 0 S 0,3 0,0 0:02.35 kworker/3:0<br />
1 root 20 0 23292 2408 1420 S 0,0 0,3 0:54.27 systemd<br />
2 root 20 0 0 0 0 S 0,0 0,0 0:01.09 kthreadd<br />
3 root 20 0 0 0 0 S 0,0 0,0 3:37.42 ksoftirqd/0<br />
5 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kworker/0:0H<br />
</pre><br />
== Prüfen: Stimmen die Dateiberechtigungen? ==<br />
Alle Dateien im Verzeichnis /opt/fhem/ und allen Unterverzeichnissen gehören nach der Installation dem Benutzer fhem und der Gruppe dialout. Man kann es leicht prüfen:<br />
<code>ls -la /opt/fhem/</code><br />
<br />
Häufig wird der Eigentümer durch Manipulation der Dateien falsch gesetzt, mit diesem Befehl kann man alle Dateien auf den Eigentümer fhem und dessen primäre Gruppe setzen.<br />
<br />
<code>sudo chown -R fhem: /opt/fhem/</code><br />
<br />
Die Setup Routine setzt den Besitz auf fhem:dialout <code>sudo chown -R fhem:dialout /opt/fhem/</code><br />
<br />
== Und wenn sich gar nichts mehr tut? ==<br />
=== Die letzen Zeilen im existierenden FHEM Log anzeigen ===<br />
So lässt man sich auf Systemebene die letzen 20 Zeilen im Log anzeigen<syntaxhighlight lang="bash"><br />
tail -n 20 /opt/fhem/log/fhem-$(date '+%Y-%m').log<br />
</syntaxhighlight><br />
<br />
=== Fehlernachrichten von FHEM bei dessen Start analysieren ===<br />
In der Regel werden die Ausgaben von FHEM, auch die beim Start, gemeinsam mit vielen anderen Nachrichten in ein Logfile geschrieben. Dort kann natürlich nach Ursachen geforscht werden.<br />
<br />
Eine einfachere Auswertung wird möglich, wenn man diese Meldungen zeitweilig in einem Terminalfenster (das Ding, um Kommandozeilenbefehle einzugeben) angezeigt bekommt.<br />
<br />
Seit dem 01.08.2017 gibt es die Möglichkeit beim manuellen Starten von FHEM im Terminal den Schalter -d zu verwenden ({{Link2Forum|Topic=74774|Message=666766}}). Dieser startet FHEM mit den beiden gesetzten Attributen <code>attr global logfile -</code> und <code>attr global verbose 5</code> und gibt somit alle Meldungen im Terminalfenster aus. Zuerst mit ins FHEM Verzeichnis wechseln. Root oder sudo ist nicht erforderlich!<br />
<br />
Allerdings muss ein (mit 100 %) laufendes FHEM zunächst beendet werden! z.B.: <code>sudo systemctl stop fhem</code><br />
<br />
ins FHEM Verzeichnis wechseln: <code>cd /opt/fhem</code><br />
<br />
Je nach Konfiguration FHEM im debug Modus starten:<br />
<br />
fhem.cfg - Nutzer: <code>perl fhem.pl -d fhem.cfg</code><br />
<br />
configDB - Nutzer: <code>perl fhem.pl -d configDB</code><br />
<br />
Wenn man genug analysiert hat, FHEM mit Ctrl-C/Strg-C stoppen<br />
<br />
== Es ist nach dem letzten Update passiert? ==<br />
Beispielhaft für das Vorgehen wird das in diesem {{Link2Forum|Topic=118533|LinkText=Forumthread}} beschrieben. FHEM speichert vor dem Update die Dateien ins Verzeichnis restoreDir die aktualisiert werden. Es handelt sich dabei nicht um eine komplette Sicherung des Systems!<br />
<br />
Man kann sich über die gesicherten Versionen/Dateien einen Überblick verschaffen (Datum anpassen!):<br />
:<code>ls -lha /opt/fhem/restoreDir/update</code><br />
:<code>ls -lhaR /opt/fhem/restoreDir/update/2020-02-28</code><br />
<br />
Hat man die verursachende Datei ermittelt, kann man gezielt diese Datei wieder herstellen:<br />
:<code>sudo -su fhem cp /opt/fhem/restoreDir/update/2021-02-06/FHEM/NameDerDatei /opt/fhem/FHEM/</code><br />
Es gibt bei einigen Modulen Abhängigkeiten von anderen Dateien, es ist dringend angeraten, dann den kompletten zusammengehörigen Satz wieder herzustellen!<br />
<br />
Will man einen kompletten Schritt zurück vor dem Update gehen, weil man den Fehler nicht einkreisen kann, stellt man so alles vor dem Update wieder her. <br />
:<code>sudo -su fhem cp -R /opt/fhem/restoreDir/update/2021-02-05/* /opt/fhem/</code><br />
<br />
== Die config Datei ist das Problem? ==<br />
Bei jedem save wird in /opt/fhem/restoreDirs eine Sicherung der fhem.cfg und das Statefile fhem.save durchgeführt. <br />
<br />
Auf der Kommandozeile vom System kann man sich einen Überblick verschaffen:<br />
<br />
<code>ls -lha /opt/fhem/restoreDir/save</code><br />
<br />
Dort sollten Pfade mit Datums Angaben sein.<br />
<br />
Den exakten Zeitpunkt der gesicherten Dateien kann man sich so anzeigen lassen (Beispiel).<br />
<br />
<code>ls -lhaR /opt/fhem/restoreDir/save/2020-02-28</code><br />
<br />
Die "lastKnownGood" Konfiguration kann man so wiederherstellen und anschließend FHEM wieder starten:<br />
<br />
<code>sudo -su fhem cp -R /opt/fhem/restoreDir/save/2020-02-28/* /opt/fhem/</code><br />
<br />
Die Berechtigungen werden durch verwenden von User fhem eigentlich erhalten. <br />
<br />
Falls die Berechtigungen nicht stimmen:<br />
<br />
<code>sudo chown fhem: /opt/fhem/fhem.cfg</code><br />
<br />
<code>sudo chown fhem: /opt/fhem/log/fhem.save</code><br />
<br />
== Minimal Config starten ==<br />
Wenn gar nichts mehr geht, ist es manchmal ratsam eine minimal Konfiguration zu starten um die Hardware oder Netzwerkanbindung an sich zu testen.<br />
<br />
Wichtig ist zunächst sicher zu stellen, dass kein FHEM Prozess läuft (siehe oben)<br />
<br />
Die fhem.cfg.demo (Bestandteil von FHEM) ist extra für den interaktiven Start gedacht, die Logausgaben landen in der Konsole. <br />
<br />
Die Demo kann interaktiv mit Ctrl+C beendet werden. <syntaxhighlight lang="bash"><br />
cd /opt/fhem<br />
sudo perl fhem.pl fhem.cfg.demo<br />
<br />
</syntaxhighlight>Oder man holt sich die Original minimal fhem.cfg<syntaxhighlight lang="bash"><br />
cd /opt/fhem<br />
sudo -su fhem wget -qO minimal.cfg https://svn.fhem.de/fhem/trunk/fhem/fhem.cfg<br />
sudo perl fhem.pl minimal.cfg<br />
</syntaxhighlight><br />
<br />
Damit wäre es auch möglich ein [[Update]] zu machen oder Dateien wie im Update Wiki Artikel beschrieben direkt aus dem SVN zu holen.<br />
<br />
'''Hinweis:''' Es ist wichtig fhem.pl mit erhöhten Rechten zu starten, da sonst fhem.pl nicht auf den user fhem umschalten kann - das würde zu Rechte Problemen führen!<br />
<br />
Für configDB User gibt es den {{Link2Forum|Topic=86225|LinkText= rescue Modus}}.<br />
[[Kategorie:HOWTOS]]</div>Otto123http://wiki.fhem.de/w/index.php?title=Cmdalias&diff=37634Cmdalias2022-11-04T09:34:24Z<p>Otto123: /* grep */ Ergänzung zu grep eingefügt</p>
<hr />
<div>{{SEITENTITEL:cmdalias}}<br />
{{Infobox Modul<br />
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM<br />
|ModType=cmd<br />
|ModCmdRef=cmdalias<br />
|ModForumArea=FHEM<br />
|ModTechName=98_cmdalias.pm<br />
|ModOwner={{Link2FU|8|Rudolf König}}<br />
}}<br />
<br />
Der FHEM-Befehl [[cmdalias]] dient zur Erstellung von benutzerdefinierten Befehlen. <br />
<br />
== Zielsetzung ==<br />
Die jeweiligen Befehlsketten können mit ''cmdalias'' verkürzt oder sogar verändert werden.<br />
Ein schönes Beispiel dafür ist, dass sogar [[:Kategorie:FHEM Befehl|interne Befehle]] wie "shutdown restart" ersetzt werden können durch einen alias der genau so heißt aber zusätzlich vorher noch z.B. ein "save" ausführt.<br />
<br />
== Einbindung in FHEM ==<br />
{{Randnotiz|RNTyp=y|RNText=Die folgenden Codebeispiele sind, sofern nicht anders erwähnt, als Einzeiler '''ohne''' Zeilenumbrüche einzugeben.}}<br />
<syntaxhighlight lang="perl">define <name> cmdalias <cmd> [parameter] AS newcommand..."</syntaxhighlight><br />
<br />
'''Beispieldefinition'''<br />
<syntaxhighlight lang="perl">define s1 cmdalias shutdown update AS save;;shutdown</syntaxhighlight><br />
<syntaxhighlight lang="perl">define s2 cmdalias set lamp .* AS { Log 1, "$EVENT";; fhem("set $EVENT") }</syntaxhighlight><br />
<br />
== Aufruf in FHEM ==<br />
Die aliase können entweder in der FHEM Befehlzeile oder direkt im Telnet eingegeben werden.<br />
[[Datei:cmdalias_eingabe_telnet.png|mini|left|x200px|Ausgabe Telnet]]<br />
<div class="tleft" style="clear:none">[[Datei:cmdalias_eingabe_fhemweb.png|mini|right|x200px|Ausgabe in FHEMWEB]]</div><br />
<onlyinclude><br />
<div style="clear:both;"></div><br />
</onlyinclude><br />
<br />
== Beispiele ==<br />
=== setex ===<br />
Schaltet ein Device nur dann, wenn Status ungleich des aktuellen Status ist<br />
<syntaxhighlight lang="perl">define c_setex cmdalias setex .* AS set $EVTPART0:FILTER=STATE!=$EVTPART1 $EVTPART1</syntaxhighlight><br />
<br />
=== ls ===<br />
Verkürzter Aufruf von list mit Wildcard Suche<br />
<syntaxhighlight lang="perl">define c_ls cmdalias ls .* AS list .*$EVENT.*</syntaxhighlight><br />
<br />
<br />
=== grep ===<br />
Durchsuchen der FHEM Dateien nach einem Schlüsselwort<br />
<syntaxhighlight lang="perl">define c_grep cmdalias grep .* AS {qx(grep -i \'$EVENT\' *.cfg FHEM/99*.pm)}</syntaxhighlight>Mit Anzeige des zugehörigen define<syntaxhighlight lang="perl"><br />
defmod c_grep cmdalias grep .* AS {qx(grep -inE \'$EVENT|define\' *.cfg FHEM/99*.pm|grep -i -B 1 \'$EVENT\')}<br />
</syntaxhighlight><br />
<br />
=== hostname ===<br />
Hostname des FHEM Rechners anzeigen<br />
<syntaxhighlight lang="perl">define c_hostname cmdalias hostname AS {(split('\.', qx(hostname)))[0]}</syntaxhighlight><br />
<br />
=== svnupdate ===<br />
{{Randnotiz|RNTyp=Warn|RNText='''Warnhinweis zu svnupdate'''<br>Für das Update einer FHEM-Installation sollte grundsätzlich der dafür vorgesehene FHEM-Befehl [[update]] verwendet werden. Bei Nutzung des hier vorgeschlagenen "svn update" werden die Funktionen des FHEM-Befehls update nicht aufgerufen (Anzeige CHANGE.txt, Backup, Generierung aktuelle commandref, Aufräum- und Verschiebeaktionen bei der FHEM-Installation,..). Funktioneinschränkungen und -störungen von FHEM könnten die Folge sein. Bitte svn-update nur bei genauer Kenntnis der Folgewirkungen nutzen. Bei Anfragen im Forum ist auf die Nutzung von svn-update hinzuweisen. }}<br />
Direktes FHEM Update mit Hilfe der aktuellen SVN Version <br />
Hinweis: Subversion Client muss installiert sein! Installation unter Debian/Ubuntu durch <syntaxhighlight lang="perl">sudo apt-get install subversion</syntaxhighlight><br />
Danach einmal die FHEM Version auschecken mit <syntaxhighlight lang="perl">cd /opt<br />
svn checkout https://svn.fhem.de/fhem/trunk/fhem fhem</syntaxhighlight><br />
<syntaxhighlight lang="perl">define c_svnupdate cmdalias svnupdate AS { `svn update /opt/fhem/` }</syntaxhighlight><br />
<br />
=== atexec ===<br />
Triggert einen AT Timer<br />
Aufruf mit <syntaxhighlight lang="perl">atexec <at-device-name></syntaxhighlight><br />
<syntaxhighlight lang="perl">define c_atexec cmdalias atexec .* AS { if($defs{$EVENT}) { if($defs{$EVENT}->{TYPE} eq "at") { at_Exec($defs{$EVENT});; 0;; } else { return "$EVENT is not of TYPE at!";; }} else { return "Device $EVENT does not exist!";; }}</syntaxhighlight><br />
<br />
=== dellog ===<br />
Leert das aktuelle FHEM Logfile<br />
<syntaxhighlight lang="perl">define c_dellog cmdalias dellog AS {qx(truncate $currlogfile --size 0);;Log 1, "Logfile gelöscht";;}</syntaxhighlight><br />
<br />
=== lastloglines ===<br />
Zeigt die letzten Zeilen aus dem FHEM Logfile an. Mit dem Aufruf <syntaxhighlight lang="perl">lastloglines 10</syntaxhighlight> werden die letzten 10 Einträge angezeigt. Der Alias wird mit der folgenden Definition angelegt:<br />
<syntaxhighlight lang="perl">define c_lastloglines cmdalias lastloglines .* AS {qx(tail -n $EVENT $currlogfile)}</syntaxhighlight><br />
<br />
=== showignoreddevices ===<br />
Auflisten von Geräten, die in FHEM das Attribut "ignore" gesetzt haben:<br />
<syntaxhighlight lang="perl">define c_showignoreddevices cmdalias showignoreddevices AS { join("\n", grep { $attr{$_}{ignore} } sort keys %attr ) }</syntaxhighlight><br />
<br />
=== shownotypedevices ===<br />
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):<br />
<syntaxhighlight lang="perl">define c_shownotypedevices cmdalias shownotypedevices AS { join("\n", grep { !defined($defs{$_}{TYPE}) } keys %defs) }</syntaxhighlight><br />
<br />
=== hmdead ===<br />
Auflisten von Geräten die als "dead" von HMInfo markiert wurden<br />
<syntaxhighlight lang="perl">defmod c_hmdead cmdalias hmdead AS list Activity=dead</syntaxhighlight><br />
<br />
=== v5 ===<br />
Setzen des "Verbose Level" in FHEM auf 5<br />
<syntaxhighlight lang="perl">define c_v5 cmdalias v5 .* AS {fhem ("attr ".($EVENT||="global")." verbose 5")}</syntaxhighlight><br />
<br />
=== v3 ===<br />
Setzen des "Verbose Level" in FHEM auf 3<br />
<syntaxhighlight lang="perl">define c_v3 cmdalias v3 .* AS {fhem ("attr ".($EVENT||="global")." verbose 3")}</syntaxhighlight><br />
<br />
=== Änderung von Geräte Aktionen ===<br />
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden<br />
<syntaxhighlight lang="perl">define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off</syntaxhighlight><br />
<br />
=== say ===<br />
Verkürzter Befehlsaufruf des TTS Moduls<br />
<syntaxhighlight lang="perl">define c_say cmdalias say .* AS set MyTTS tts '$EVENT'</syntaxhighlight><br />
<br />
=== mqttmsg ===<br />
Schickt eine Nachricht an einen Mosquitto Message Broker<br />
<syntaxhighlight lang="perl">define c_mqttmsg cmdalias mqttmsg .* AS {qx(/usr/bin/mosquitto_pub -h 192.168.1.101 -t \'$EVTPART0\' -m \'$EVTPART1\')}</syntaxhighlight><br />
<br />
Aufruf mit: <br />
<syntaxhighlight lang="perl">mqttmsg <TOPIC> <MESSAGE></syntaxhighlight><br />
<br />
'''Hinweis: IP des Brokers muss angepasst werden!'''<br />
<br />
<br />
<br />
=== roomadd ===<br />
{{Randnotiz|RNText=Beachte auch die seit Updatestand 28.01.2018 vorhandene Option -a beim Befehl {{Link2CmdRef|Anker=attr|Label=attr}} (siehe {{Link2Forum|Topic=83414}}) }}<br />
Erstellt einen neuen Raum und füllt diesen mit Geräten entsprechend der angegeben Device-Spezifikation.<br />
Aufruf: <syntaxhighlight lang="perl">roomadd <devspec> <new_room></syntaxhighlight><br />
<syntaxhighlight lang="perl">define c_roomadd cmdalias roomadd .* AS { for my $name (devspec2array("$EVTPART0")){ my $old_room = AttrVal($name,'room','');; if (index($old_room, $EVTPART1) == -1) {my $new_room = AttrVal($name,'room','') . ",$EVTPART1";; fhem("attr $name room $new_room")} } }</syntaxhighlight><br />
<br />
=== roomrename ===<br />
Umbenennen eines FHEM Raumes '''Aufruf roomrename <oldroom> <newroom>'''<br />
<syntaxhighlight lang="perl">define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array("room=$EVTPART0")){ map {s/$EVTPART0/$EVTPART1/;; fhem("attr $name room $_")} AttrVal($name,'room','') } }</syntaxhighlight><br />
<br />
=== roomdelete ===<br />
{{Randnotiz|RNText=Beachte auch die seit Updatestand 28.01.2018 vorhandene Option -r beim Befehl {{Link2CmdRef|Anker=attr|Label=attr}} (siehe {{Link2Forum|Topic=83414}}) }}<br />
Löschen eines FHEM Raumes '''Aufruf: roomdelete <roomName>'''<br />
<syntaxhighlight lang="perl">define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array("room=$EVENT")){ map { /^$EVENT$/ ? fhem("deleteattr $name room") : do{s/,$EVENT|$EVENT,//;; fhem("attr $name room $_")} } AttrVal($name,'room','') } }</syntaxhighlight><br />
<br />
=== regroup ===<br />
Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen<br />
<br />
<syntaxhighlight lang="perl">define c_regroup cmdalias regroup .* AS { my @EVTPART=split(' ',$EVENT);; $EVTPART[2] =~ s/\|/:FILTER=/g if($EVTPART[2]);; for my $name (devspec2array("group=".($EVTPART[0] ? $EVTPART[0] : '.*').($EVTPART[2] ? ":FILTER=$EVTPART[2]" : ''))){ map { ($_ && /^$EVTPART[0]$/ && !$EVTPART[1]) ? fhem("deleteattr $name group") : do{ if(!$EVTPART[1]){$EVTPART[0]=",$EVTPART[0]|$EVTPART[0],";; $EVTPART[1]='';;} s/$EVTPART[0]/$EVTPART[1]/;; fhem("attr $name group $_")} } AttrVal($name,'group',0) } }</syntaxhighlight><br />
<br />
Die zusätzlichen Gruppen, in welchen sich die devices sonst noch befinden, bleiben unberührt. Als FILTER kann alles was der normale FHEM-devspec Filter verarbeiten kann angegeben werden. Es sollte nur aufgepasst werden, wenn ein "Device" mehrere ähnliche Gruppenbennungen wie "attr name group test2,test" hat. Wenn man hier ein 'regroup test test3' macht, könnte es passieren, dass man dadurch bei diesem device die Gruppe 'test2' nach 'test32' umbenennt. In dem Beispiel müsste man den Befehl z.B. mit 'regroup test$ test3' angeben, damit das nicht passiert.<br />
<br />
Beispiele:<br />
<pre>regroup <oldGroup> [<newGroup> [<FILTER>][|<FILTER2>]...]<br />
<br />
# Allen devices ohne group die Gruppe 'myGroup' setzen:<br />
regroup 0 myGroup<br />
<br />
# Nur den devices im Raum 'myRoom' welche keine group haben die Gruppe 'myGroup' setzen:<br />
regroup 0 myGroup room=myRoom<br />
<br />
# Alle devices aus 'oldGroup' in 'newGroup' verschieben<br />
regroup oldGroup newGroup<br />
<br />
# Nur die devices im Raum 'myRoom' aus 'oldGroup' in 'newGroup' verschieben<br />
regroup oldGroup newGroup room=myRoom<br />
<br />
# Gruppe 'myGroup' löschen<br />
regroup myGroup<br />
<br />
# Nur die devices im Raum 'myRoom' aus der Gruppe 'myGroup' löschen.<br />
regroup myGroup 0 room=myRoom<br />
<br />
# Devices aus allen Gruppen welche mit 'licht' beginnen aus Raum 'Obergeschoss' entfernen.<br />
regroup licht.* 0 room=Obergeschoss<br />
<br />
# Devices aus dem Raum 'myRoom' aus allen Gruppen entfernen und in die Gruppe 'myGroup' verschieben.<br />
regroup .* myGroup room=myRoom<br />
<br />
# Devices ohne Gruppe aus dem Raum 'myRoom' mit dem TYPE 'CUL_HM' und welche ebenfalls 'Licht' im Namen enthalten die Gruppe 'myGroup' hinzufügen<br />
regroup 0 myGroup room=myRoom|TYPE=CUL_HM|NAME=.*Licht.*</pre><br />
<br />
=== autocreate ===<br />
Schnelles (de)aktivieren der [[autocreate]] Funktion:<br />
<syntaxhighlight lang="perl"><br />
define c_autocreate_off cmdalias set autocreate off AS attr autocreate disable 1<br />
define c_autocreate_on cmdalias set autocreate on AS attr autocreate disable 0<br />
</syntaxhighlight><br />
<br />
Optional kann noch das autocreate Icon definiert werden:<br />
<syntaxhighlight lang="perl">attr autocreate devStateIcon disabled:ios-off:on active:ios-on-blue:off</syntaxhighlight><br />
<br />
=== renamehm ===<br />
{{Randnotiz|RNText=Dieser Alias ist mittlerweile nicht mehr erforderlich, da [[HomeMatic]] Devices den Befehl (''set'') [[rename|deviceRename]] anbieten}}<br />
Sehr viele HomeMatic Devices haben zusätzlichen Kanäle (z.B: HM-ES-PMSw1-PI legt die Kanäle HM_12345B, HM_12345B_Pwr, HM_12345B_SenF, HM_12345B_SenI, HM_12345B_SenPwr, HM_12345B_SenU, HM_12345B_Sw als separate Devices an). Um diese umzubenennen kann man mit der folgenden Funktion den Prefix von HM_12345B auf einen beliebigen Ändern. Diese wird nach Definition via "<code>renamehm HM_12345B NEW_DEVICE_PREFIX</code>" ausgeführt:<br />
<syntaxhighlight lang="perl">define c_renamehm cmdalias renamehm .* AS { for my $name (devspec2array("$EVTPART0.*")){ my $newname=$name;;$newname =~ s/$EVTPART0/$EVTPART1/gi;; fhem("rename $name $newname");;} }</syntaxhighlight><br />
<br />
=== alias2siriname ===<br />
Mit dem folgenden Alias wird das Attribut siriName aller sich im Raum Homekit befindlichen Geräte auf den selben Wert des Attributes alias gesetzt.<br />
<syntaxhighlight lang="perl">define c_alias2siriname cmdalias alias2siriname .* AS { for (devspec2array("room=Homekit*")) { my $a = AttrVal($_,"alias",undef);; fhem "attr $_ siriName $a" if (defined $a) }}</syntaxhighlight><br />
<br />
== Links ==<br />
* Thread über das Modul im {{Link2Forum|Topic=15648|LinkText=FHEM Forum}}<br />
* Thread mit {{Link2Forum|Topic=42211|LinkText=weiteren Informationen}}<br />
<br />
[[Kategorie:Code Snippets]]</div>Otto123http://wiki.fhem.de/w/index.php?title=FHEM_startet_nicht_-_Tipps_zur_Fehlersuche&diff=37578FHEM startet nicht - Tipps zur Fehlersuche2022-10-18T15:54:24Z<p>Otto123: /* Minimal Config starten */</p>
<hr />
<div>Es gibt einen weiteren Artikel zur Fehlersuche. [[Hilfe! Mein FHEM funktioniert nicht!]]<br />
<br />
'''Kein Zugriff auf FHEMWEB/FHEM startet nicht - Was kann ich tun?'''<br />
<br />
Deine [[FHEMWEB]]-Seite ist nicht erreichbar? Ist FHEM tot, oder ist das Netzwerk kaputt? Was kann ich machen, um zu prüfen, woran es genau liegt?<br />
<br />
In diesem Wiki-Artikel soll es darum gehen, wie Du für Dich prüfen kannst, ob ein Fehler bei FHEM, im Netzwerk oder ein anderes Problem vorliegt.<br />
== Prüfen: Läuft überhaupt ein FHEM-Prozess? ==<br />
Man kann sich unter einem Linuxsystem sämtliche laufende Prozesse auflisten lassen<br />
<br />
<code>ps ax</code><br />
<br />
Der Befehl ''ps'' listet je nach Argument alle laufende Prozesse auf. Die Liste kann man nun noch nach einem bestimmten Prozess filtern. Aufruf und Ausgabe einer Prozessliste mit einem Filter nach perl sieht z. B. so aus:<br />
<br />
<code>ps ax | grep perl</code><br />
<br />
<code>cooltux@fhem01-cluster:~> ps ax | grep perl</code><br />
<br />
<code>11320 pts/0 S+ 0:00 grep --color=auto perl</code><br />
<br />
Wie wir sehen, wird hier lediglich der gerade ausgeführte Befehl ''ps'' gefunden (weil das Wort ''perl'' in der Aufrufzeile stand. Es wird hier überhaupt kein Perl-Prozess gelistet. Aktuell läuft also definitiv kein FHEM, das ja ein Perl-Programm/Prozess ist.<br />
<br />
Eine Prozessliste mit einem laufenden FHEM-Prozess könnte so aussehen:<br />
<br />
<code>[11:31 root@fhem01-cluster cooltux] > ps ax | grep perl</code><br />
<br />
<code>15852 ? R 2119:09 /usr/bin/perl fhem.pl configDB</code><br />
<br />
<code>21447 pts/0 S+ 0:00 grep perl</code><br />
<br />
FHEM (''perl fhem.pl ...'') ist in diesem Fall also aktiv.<br />
<br />
=== systemd ===<br />
<br />
Nutzt das Linux-System den systemd, kann mit folgendem Befehl der Status des FHEM-Prozesses geprüft werden:<br />
<br />
<code>service fhem status</code><br />
<br />
Eine Ausgabe könnte z.B. so aussehen:<br />
<pre><br />
● fhem.service - FHEM Home Automation<br />
Loaded: loaded (/etc/systemd/system/fhem.service; enabled; vendor preset: enabled)<br />
Active: active (running) since Thu 2018-08-09 14:32:16 CEST; 20h ago<br />
Process: 27641 ExecStart=/usr/bin/perl fhem.pl fhem.cfg (code=exited, status=0/SUCCESS)<br />
Main PID: 27643 (perl)<br />
Tasks: 1 (limit: 4915)<br />
CGroup: /system.slice/fhem.service<br />
└─27643 /usr/bin/perl fhem.pl fhem.cfg<br />
<br />
Aug 09 14:32:16 fhem-host systemd[1]: Starting FHEM Home Automation...<br />
Aug 09 14:32:16 fhem-host systemd[1]: Started FHEM Home Automation.<br />
</pre><br />
<br />
== Prüfen: Ist der laufende FHEM-Prozess überlastet? ==<br />
Ich sollte mir anschauen, ob der FHEM-Prozess vielleicht zu sehr ausgelastet ist, der Prozess also 100 Prozent CPU Auslastung produziert?<br />
<br />
Ein weiterer Linuxbefehl ''top'' wird uns hierbei behilflich sein:<br />
<pre style="white-space: pre;"><br />
[11:38 root@fhem01-cluster cooltux] > top<br />
top - 11:38:18 up 11 days, 18:58, 1 user, load average: 1,07, 1,03, 1,00<br />
Tasks: 125 total, 2 running, 123 sleeping, 0 stopped, 0 zombie<br />
%Cpu(s): 24,9 us, 0,9 sy, 0,0 ni, 74,1 id, 0,0 wa, 0,0 hi, 0,1 si, 0,0 st<br />
KiB Mem: 945524 total, 833532 used, 111992 free, 41552 buffers<br />
KiB Swap: 102396 total, 46564 used, 55832 free. 496240 cached Mem<br />
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND<br />
15852 fhem 20 0 103652 82160 5068 R 100,0 8,7 2125:41 perl <br />
21683 root 20 0 5740 2560 2092 R 1,0 0,3 0:00.37 top <br />
19129 cooltux 20 0 86204 22348 3668 S 0,3 2,4 64:16.90 insync-portable <br />
21350 cooltux 20 0 11436 2848 2248 S 0,3 0,3 0:00.10 sshd <br />
1 root 20 0 23292 2368 1380 S 0,0 0,3 0:54.23 systemd <br />
2 root 20 0 0 0 0 S 0,0 0,0 0:01.09 kthreadd <br />
3 root 20 0 0 0 0 S 0,0 0,0 3:37.20 ksoftirqd/0 <br />
5 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kworker/0:0H <br />
7 root 20 0 0 0 0 S 0,0 0,0 8:20.71 rcu_sched <br />
8 root 20 0 0 0 0 S 0,0 0,0 0:00.00 rcu_bh <br />
9 root rt 0 0 0 0 S 0,0 0,0 0:05.45 migration/0<br />
</pre><br />
Hier können wir nun eindeutig erkennen, dass unser FHEM die CPU mit 100 Prozent auslastet. FHEM hat also ein Problem!<br />
<br />
Zum Vergleich ein FHEM/Perl-Prozess ohne Probleme:<br />
<pre style="white-space: pre;"><br />
[11:50 root@fhem01-cluster cooltux] > top<br />
top - 11:50:33 up 11 days, 19:10, 1 user, load average: 0,84, 1,03, 1,00<br />
Tasks: 133 total, 1 running, 132 sleeping, 0 stopped, 0 zombie<br />
%Cpu(s): 0,6 us, 0,8 sy, 0,0 ni, 98,6 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st<br />
KiB Mem: 945524 total, 818344 used, 127180 free, 43748 buffers<br />
KiB Swap: 102396 total, 46820 used, 55576 free. 489652 cached Mem<br />
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND<br />
22074 fhem 20 0 86424 68516 7200 S 1,3 7,2 0:47.64 perl<br />
22294 root 20 0 5740 2564 2092 R 1,3 0,3 0:00.19 top<br />
22296 fhem 20 0 86424 63556 2240 S 1,3 6,7 0:00.04 perl<br />
22297 fhem 20 0 2088 408 328 S 0,7 0,0 0:00.02 ping<br />
7 root 20 0 0 0 0 S 0,3 0,0 8:21.23 rcu_sched<br />
1366 mysql 20 0 620608 157132 5736 S 0,3 16,6 70:12.59 mysqld<br />
19481 root 20 0 0 0 0 S 0,3 0,0 0:02.35 kworker/3:0<br />
1 root 20 0 23292 2408 1420 S 0,0 0,3 0:54.27 systemd<br />
2 root 20 0 0 0 0 S 0,0 0,0 0:01.09 kthreadd<br />
3 root 20 0 0 0 0 S 0,0 0,0 3:37.42 ksoftirqd/0<br />
5 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kworker/0:0H<br />
</pre><br />
== Prüfen: Stimmen die Dateiberechtigungen? ==<br />
Alle Dateien im Verzeichnis /opt/fhem/ und allen Unterverzeichnissen gehören nach der Installation dem Benutzer fhem und der Gruppe dialout. Man kann es leicht prüfen:<br />
<code>ls -la /opt/fhem/</code><br />
<br />
Häufig wird der Eigentümer durch Manipulation der Dateien falsch gesetzt, mit diesem Befehl kann man alle Dateien auf den Eigentümer fhem und dessen primäre Gruppe setzen.<br />
<br />
<code>sudo chown -R fhem: /opt/fhem/</code><br />
<br />
Die Setup Routine setzt den Besitz auf fhem:dialout <code>sudo chown -R fhem:dialout /opt/fhem/</code><br />
<br />
== Und wenn sich gar nichts mehr tut? ==<br />
=== Die letzen Zeilen im existierenden FHEM Log anzeigen ===<br />
So lässt man sich auf Systemebene die letzen 20 Zeilen im Log anzeigen<syntaxhighlight lang="bash"><br />
tail -n 20 /opt/fhem/log/fhem-$(date '+%Y-%m').log<br />
</syntaxhighlight><br />
<br />
=== Fehlernachrichten von FHEM bei dessen Start analysieren ===<br />
In der Regel werden die Ausgaben von FHEM, auch die beim Start, gemeinsam mit vielen anderen Nachrichten in ein Logfile geschrieben. Dort kann natürlich nach Ursachen geforscht werden.<br />
<br />
Eine einfachere Auswertung wird möglich, wenn man diese Meldungen zeitweilig in einem Terminalfenster (das Ding, um Kommandozeilenbefehle einzugeben) angezeigt bekommt.<br />
<br />
Seit dem 01.08.2017 gibt es die Möglichkeit beim manuellen Starten von FHEM im Terminal den Schalter -d zu verwenden ({{Link2Forum|Topic=74774|Message=666766}}). Dieser startet FHEM mit den beiden gesetzten Attributen <code>attr global logfile -</code> und <code>attr global verbose 5</code> und gibt somit alle Meldungen im Terminalfenster aus. Zuerst mit ins FHEM Verzeichnis wechseln. Root oder sudo ist nicht erforderlich!<br />
<br />
Allerdings muss ein (mit 100 %) laufendes FHEM zunächst beendet werden! z.B.: <code>sudo systemctl stop fhem</code><br />
<br />
ins FHEM Verzeichnis wechseln: <code>cd /opt/fhem</code><br />
<br />
Je nach Konfiguration FHEM im debug Modus starten:<br />
<br />
fhem.cfg - Nutzer: <code>perl fhem.pl -d fhem.cfg</code><br />
<br />
configDB - Nutzer: <code>perl fhem.pl -d configDB</code><br />
<br />
Wenn man genug analysiert hat, FHEM mit Ctrl-C/Strg-C stoppen<br />
<br />
== Es ist nach dem letzten Update passiert? ==<br />
Beispielhaft für das Vorgehen wird das in diesem {{Link2Forum|Topic=118533|LinkText=Forumthread}} beschrieben. FHEM speichert vor dem Update die Dateien ins Verzeichnis restoreDir die aktualisiert werden. Es handelt sich dabei nicht um eine komplette Sicherung des Systems!<br />
<br />
Man kann sich über die gesicherten Versionen/Dateien einen Überblick verschaffen (Datum anpassen!):<br />
:<code>ls -lha /opt/fhem/restoreDir/update</code><br />
:<code>ls -lhaR /opt/fhem/restoreDir/update/2020-02-28</code><br />
<br />
Hat man die verursachende Datei ermittelt, kann man gezielt diese Datei wieder herstellen:<br />
:<code>sudo -su fhem cp /opt/fhem/restoreDir/update/2021-02-06/FHEM/NameDerDatei /opt/fhem/FHEM/</code><br />
Es gibt bei einigen Modulen Abhängigkeiten von anderen Dateien, es ist dringend angeraten, dann den kompletten zusammengehörigen Satz wieder herzustellen!<br />
<br />
Will man einen kompletten Schritt zurück vor dem Update gehen, weil man den Fehler nicht einkreisen kann, stellt man so alles vor dem Update wieder her. <br />
:<code>sudo -su fhem cp -R /opt/fhem/restoreDir/update/2021-02-05/* /opt/fhem/</code><br />
<br />
== Die config Datei ist das Problem? ==<br />
Bei jedem save wird in /opt/fhem/restoreDirs eine Sicherung der fhem.cfg und das Statefile fhem.save durchgeführt. <br />
<br />
Auf der Kommandozeile vom System kann man sich einen Überblick verschaffen:<br />
<br />
<code>ls -lha /opt/fhem/restoreDir/save</code><br />
<br />
Dort sollten Pfade mit Datums Angaben sein.<br />
<br />
Den exakten Zeitpunkt der gesicherten Dateien kann man sich so anzeigen lassen (Beispiel).<br />
<br />
<code>ls -lhaR /opt/fhem/restoreDir/save/2020-02-28</code><br />
<br />
Die "lastKnownGood" Konfiguration kann man so wiederherstellen und anschließend FHEM wieder starten:<br />
<br />
<code>sudo -su fhem cp -R /opt/fhem/restoreDir/save/2020-02-28/* /opt/fhem/</code><br />
<br />
Die Berechtigungen werden durch verwenden von User fhem eigentlich erhalten. <br />
<br />
Falls die Berechtigungen nicht stimmen:<br />
<br />
<code>sudo chown fhem: /opt/fhem/fhem.cfg</code><br />
<br />
<code>sudo chown fhem: /opt/fhem/log/fhem.save</code><br />
<br />
== Minimal Config starten ==<br />
Wenn gar nichts mehr geht, ist es manchmal ratsam eine minimal Konfiguration zu starten um die Hardware oder Netzwerkanbindung an sich zu testen.<br />
<br />
Wichtig ist zunächst sicher zu stellen, dass kein FHEM Prozess läuft (siehe oben)<br />
<br />
Die fhem.cfg.demo (Bestandteil von FHEM) ist extra für den interaktiven Start gedacht, die Logausgaben landen in der Konsole. <syntaxhighlight lang="bash"><br />
cd /opt/fhem<br />
sudo perl fhem.pl fhem.cfg.demo<br />
<br />
</syntaxhighlight>Oder man holt sich die Original minimal fhem.cfg<syntaxhighlight lang="bash"><br />
cd /opt/fhem<br />
sudo -su fhem wget -qO minimal.cfg https://svn.fhem.de/fhem/trunk/fhem/fhem.cfg<br />
sudo perl fhem.pl minimal.cfg<br />
</syntaxhighlight><br />
<br />
Damit wäre es auch möglich ein [[Update]] zu machen oder Dateien wie im Update Wiki Artikel beschrieben direkt aus dem SVN zu holen.<br />
<br />
'''Hinweis:''' Es ist wichtig fhem.pl mit erhöhten Rechten zu starten, da sonst fhem.pl nicht auf den user fhem umschalten kann - das würde zu Rechte Problemen führen!<br />
<br />
Für configDB User gibt es den {{Link2Forum|Topic=86225|LinkText= rescue Modus}}.<br />
[[Kategorie:HOWTOS]]</div>Otto123http://wiki.fhem.de/w/index.php?title=HM-MOD-RPI-PCB_HomeMatic_Funkmodul_f%C3%BCr_Raspberry_Pi&diff=37534HM-MOD-RPI-PCB HomeMatic Funkmodul für Raspberry Pi2022-09-02T11:18:52Z<p>Otto123: /* Anbindung mit ESP8266 */ Tasmota eingefügt</p>
<hr />
<div>{{Infobox Hardware<br />
|Bild=HM-MOD-RPI-PCB.jpg<br />
|Bildbeschreibung=HomeMatic Funkmodul für Raspberry Pi <br />
|HWProtocol=HomeMatic<br />
|HWType=Gateway<br />
|HWCategory=HomeMatic<br />
|HWComm=868,3/869,525 MHz<br />
|HWChannels=n/a<br />
|HWVoltage=1,8–3,6 V&nbsp;DC<br />
|HWPowerConsumption=50 mA max.<br />
|HWPoweredBy=RasPi<br />
|HWSize=19x41x14mm<br />
|HWDeviceFHEM=[[HMUARTLGW]]<br />
|HWManufacturer=ELV / eQ-3 <br />
}}<br />
Das [[HM-MOD-RPI-PCB HomeMatic Funkmodul für Raspberry Pi]] ist eine Platine, die auf die GPIO-Schnittstelle des [[Raspberry Pi]] aufgesteckt werden und damit als [[Interface]] zu [[HomeMatic]] Geräten dienen kann. <br />
<br />
== Aufbau, Einsatz und grundsätzliche Funktionsweise ==<br />
Das Modul besteht aus zwei Teilplatinen, die von eQ-3 über den Internetshop von ELV (als Bausatz ab etwa 20€, fertig montiert ab etwa 30€) verkauft werden. <br />
<br />
Das eigentliche Funkmodul wird mit HM-MOD-RPI-UART bezeichnet (und trägt den Aufdruck UART, im obigen Bild hinten teilweise verdeckt und mit der umrandeten 7 versehen), sie hat fünf einpolige Buchsen mit dem Rastermaß 2mm. Die Zusatzplatine zum Anschluss an die GPIO wird mit TRX1 bezeichnet (im obigen Bild vorn sichtbar mit dem Aufdruck HM-MOD-RPI-PCB), sie hat zwei sechspolige Buchsen mit dem Rastermaß 2,54mm. Die Zusatzplatine enthält im Wesentlichen Stützkondensatoren und erlaubt einen direkten Anschluss an die GPIO eines Raspberry Pi.<br />
* Der vorgesehene Einsatz als Aufsteckmodul auf den GPIO Port des Raspberry erfordert eine Modell abhängige Konfiguration. Diese wird im Setupbereich des Wiki Artikel zum [[Raspberry_Pi]] beschrieben.<br />
<br />
{{Randnotiz|RNText=Neben der hier beschriebenen Option das HM-MOD-RPI-PCB zu verwenden, besteht auch die Möglichkeit, damit auf demselben Raspberry eine virtuelle CCU zu betreiben, welche dann mit [[HMCCU]] eingebunden werden kann. Hierfür stehen mehrere Virtualisierungsvarianten zur Verfügung; eine kurze Darstellung, wie das mittels YAHM funktioniert, ist in diesem {{Link2Forum|Topic=79670|Message=718289|Forenbeitrag}} zu finden.}}Mit dieser Platine in Verbindung mit dem FHEM-Modul [[HMUARTLGW]] ist nur der Betrieb von BidCoS-Geräten möglich. Zur Einbindung von Geräten, die HM-IP verwenden, ist derzeit (Stand Juni 2018) noch zwingend eine (ggf. virtualisierte) CCU2 oder neuer erforderlich.<br />
<br />
Das Funkmodul stellt auf dem 868MHz-Frequenzband eine Verbindung zu Homematic-Geräten her. Das Modul wird über die serielle Schnittstelle an ein Gerät gekoppelt, dass diese serielle Schnittstelle auswerten und die Information dann weiterverarbeiten kann. Hier kommen beispielsweise in Frage: Raspberry Pi, WeMos mini, ESP8266-Module, USB-serielle Adapter. Bereits das UART-Funkmodul erlaubt eine serielle Anbindung (die entsprechenden Schnittstellen Tx und Rx sind vorhanden, sie basieren auf 3,3V), es kann aber auch die zusätzliche TRX1-Platine seriell verbunden werden. Des weiteren gibt es im Forum ein {{Link2Forum|Topic=56606}}, in dem PeMue eine eigene Platinenversion (Schaltplan, Stückliste und vieles mehr) vorstellt.<br />
<br />
=== Platine 1 -PCB-Modul ===<br />
[[Datei:Hm-uart trx1.png|thumb|right|200px|Verkabelung beim HM-MOD-PCB]]<br />
Am einfachsten ist es sicherlich, das kombinierte PCB-Modul (also beide Platinen UART und TRX1 durch eine Pfostenleiste miteinander verlötet) direkt auf die GPIO des Raspberry Pi aufzustecken. Das Bild rechts zeigt die entsprechende Verkabelung. Dabei ist zu beachten, dass sich nicht zwei Module die GPIO teilen können. Steckt schon ein Modul im Raspberry Pi, muss der Anschluss per USB, in einem zweiten Raspberry Pi oder per WLAN gewählt werden.<br />
<br clear="all"><br />
<br />
=== Platine 2 -UART-Modul ===<br />
[[Datei:Verkabelung-HM-MOD-uart.png|thumb|right|200px|Verkabelung beim HM-MOD-UART]]<br />
Will man das TRX1-Modul nicht verwenden, so kann man auch das UART-Modul direkt mit Rx/Tx des Raspberry Pi verbinden. Das Bild rechts zeigt die entsprechende Verkabelung. Hier sollten allerdings Stützkondensatoren an die Stromversorgung des UART angebracht werden, da Spannungsschwankungen sonst zu schwer interpretierbaren Fehlern führen können. Die Anschlüsse sind dem nachstehenden Bild zu entnehmen, allerdings ist hier nicht die UART-Platine, sondern das TRX1-Gegenstück zu sehen!<br />
<br />
Sowohl serielle Schnittstelle des Raspberry Pi als auch das UART-Modul arbeiten mit 3,3V arbeitet, so dass man keine Spannungsteiler benötigt. Mehr Informationen zu den GPIOs findet man unter diesem [http://www.netzmafia.de/skripten/hardware/RasPi/RasPi_GPIO.html Link].<br />
<br />
=== Zusammenbau und Verwendung ===<br />
Man sollte die Antenne aus dem Gehäuse schauen lassen oder gar eine externe Antenne anbringen. Idealerweise sollte das Ende der Drahtantenne mit einem Klecks Heißkleber oder ähnlichem isoliert werden; eine Berührung vor allem mit dem Innenleben des Raspberry Pi muss vermieden werden!<br />
<br />
Beide Platinen können zusammengebaut oder auch nur das UART Modul getrennt verwendet werden. <br />
[[Datei:HM-MOD-UART-Unten.jpg|thumb|left|200px|Montage des Moduls HM-MOD-UART unten]]<br />
[[Datei:HM-MOD-UART-Oben.jpg|thumb|right|200px|Montage des Moduls HM-MOD-UART oben]]<br />
Die originale Montage in der Anleitung von eq3 sieht den Zusammenbau PCB Modul unten und UART Modul oben vor (Bild rechts). Damit schließen die kleineren Pi-Gehäuse nicht richtig: das Gesamtmodul klemmt am Deckel.<br />
<br />
Man kann ohne weiteres das UART-Modul unter dem PCB-Modul montieren (Bild links), damit wird die Gesamthöhe geringer und es passt problemlos in jedes Gehäuse. Bitte vorher die genaue Situation prüfen: Es kann sein, dass damit Kühlkörper oder ähnliches seitens der Pi-Platine stören.<br />
<br />
Man kann auch das PCB Modul kürzen und das UART Modul mit kurzen Drähten in einer Ebene verbinden (kein Bild).<br />
<br />
Bitte auf die richtige Lage (Bilder) beim Zusammenbau und auf Lötzinnbrücken achten. Da die Anschlüsse durchkontaktiert sind, bewirkt eine falsche Positionierung des UART-Moduls im schlimmsten Fall einen Kurzschluss. Man erkennt auf beiden Bildern, dass beim UART-Modul die Pinleiste einmal auf der einen und ein andermal auf der anderen Seite des Moduls angelötet werden muss! <br />
<br />
<br clear="all"><br />
== Verwendung ==<br />
Das Modul muss, um verwendet zu werden, mit einer Hardware verbunden werden. Hier kommen mehrere Möglichkeiten in Betracht, die jeweils vor und Nachteile aufweisen. Sie werden jetzt nacheinander präsentiert. <br />
<br />
=== Anbindung an die GPIO im Raspberry ===<br />
==== Installation ====<br />
Man kann das HM-MOD-RPI-PCB Modul direkt in die GPIOs eines Raspberry stecken. Das hat den Vorteil, dass das Gerät (mehr oder weniger) sofort betriebsbereit ist, aber den Nachteil, dass am RPi vorher mehrere Installationen zu erfolgen haben. <br />
<br />
Die '''<big>notwendige Konfiguration der Schnittstelle</big>''' ist hier beschrieben: [[Raspberry_Pi#Verwendung_UART_f.C3.BCr_Zusatzmodule|Verwendung UART für Zusatzmodule]].<br />
* Der Einsatz in FHEM für CUL_HM erfolgt mit dem Modul [[HMUARTLGW]]<br />
* Die automatische Erkennung der USB Geräte muss deaktiviert werden: <br />
::<code>attr initialUsbCheck disable 1</code><br />
: Nach dem Setzen des Attributes muss die Änderung gespeichert werden (siehe [[save]])!<br />
<br />
=== Anbindung über das Netzwerk===<br />
Wenn das HM-MOD-RPI-PCB Modul an einen RPi angeschlossen ist, kann man dieses Modul danach auch im Netzwerk verfügbar machen. Dieser Pi kann beliebige Aufgaben erledigen, nur das HM-MOD-RPI-PCB Modul selbst darf nicht lokal verwendet werden. Somit kann man bei einem Umzug des FHEM Servers das HM-MOD-RPI-PCB Modul einfach weiterhin nutzen oder einen vorhandene RaspberryPi zum "HMLAN" umbauen. Sollte man aber ausschließlich Zugriff auf das HM-MOD-RPI-PCB Modul im Netzwerk benötigen, empfiehlt sich auch aus Kostengründen (Stromverbrauch) eine andere Lösung.<br />
<br />
Achtung! Auch über das Netzwerk darf immer '''nur eine Instanz auf das freigegebene Modul zugreifen'''!<br />
<br />
Die Konfiguration der Schnittstelle ist in jedem Fall gleich: [[Raspberry Pi#Verwendung UART für Zusatzmodule|Verwendung UART für Zusatzmodule]]. <br />
<br />
Die [[HM-MOD-RPI-PCB HomeMatic Funkmodul für Raspberry Pi#Definition in FHEM 2|Definition in FHEM]] erfolgt dann mit dem Parameter <code>uart:// .</code><br />
<br />
===== Variante mit ser2net =====<br />
[https://forum.fhem.de/index.php/topic,124384.0.html '''Achtung!''' Mit der Version 4 hat sich die Konfiguration geändert!]<br />
<br />
Diese Installation auf dem Pi mit dem HM-MOD-RPI-PCB Modul bitte im Kontext <code>sudo su</code> ausführen. <br />
<br />
Bis zur ser2net '''Version 3'''<br />
<br />
<pre>apt-get install ser2net<br />
echo "4000:raw:0:/dev/ttyAMA0:115200 NONE 1STOPBIT 8DATABITS HANGUP_WHEN_DONE" >> /etc/ser2net.conf<br />
# Den Dienst neu starten<br />
systemctl restart ser2net</pre>Ab der ser2net '''Version 4''' erfolgt die Konfiguration im anderen Format /etc/ser2net.yaml. [https://man.archlinux.org/man/community/ser2net/ser2net.yaml.5.en manpage]<syntaxhighlight lang="bash"><br />
cp /etc/ser2net.yaml /etc/ser2net.yaml.sav<br />
cat <<EOI > /etc/ser2net.yaml<br />
%YAML 1.1<br />
---<br />
# HM_MOD-RPI-PCB<br />
connection: &con01<br />
accepter: tcp,4000<br />
connector: serialdev,<br />
/dev/ttyAMA0,<br />
115200n81,local<br />
EOI<br />
</syntaxhighlight>Zur Kommunikation zwischen FHEM und ser2net auf einem anderen Gerät im Netzwerk kann (mindestens ab Debian Bullseye) zusätzlich die Option "NOBREAK" im Connector (siehe [https://www.mankier.com/8/ser2net manpage]) erforderlich sein.<br />
<br />
In der Service unit müssen Abhängigkeiten eingefügt werden, sonst startet der Dienst nach einem System reboot nicht:<br />
<br />
<code>systemctl edit --full ser2net</code> siehe auch [[Fhem.service (systemd unit file)|Wiki (systemd unit file)]]<syntaxhighlight lang="bash"><br />
[Unit]<br />
Description=Serial port to network proxy<br />
Documentation=man:ser2net(8)<br />
After=network-online.target<br />
Wants=network-online.target<br />
<br />
[Service]<br />
EnvironmentFile=-/etc/default/ser2net<br />
ExecStart=/usr/sbin/ser2net -n -c $CONFFILE -P /run/ser2net.pid<br />
Type=exec<br />
Restart=on-failure<br />
<br />
[Install]<br />
WantedBy=multi-user.target<br />
</syntaxhighlight><br />
<br />
===== Variante mit socat =====<br />
Installation auf dem Pi wo das Modul steckt bitte so installieren. <br />
:<code>sudo apt-get install socat</code><br />
Zum Test kann man socat in der Kommandozeile starten<br />
:<code>sudo socat TCP4-LISTEN:2000,fork,reuseaddr /dev/ttyAMA0,raw,echo=0,b115200 </code><br />
<br />
Für den dauerhaften Betrieb muss der Start von socat automatisch erfolgen. <br />
Auf einem Debian Jessie mit systemd legt man z.B. einen Dienst durch folgende Datei an:<br />
/etc/systemd/system/hmlangw.service<br />
<syntaxhighlight lang="Text"><br />
[Install]<br />
WantedBy=multi-user.target<br />
Type=forking<br />
<br />
[Service]<br />
ExecStart=/usr/bin/socat TCP4-LISTEN:2000,fork,reuseaddr /dev/ttyAMA0,raw,echo=0,b115200<br />
User=root<br />
Restart=always<br />
RestartSec=10<br />
</syntaxhighlight><br />
Dann kann mit <br />
:<code>sudo systemctl enable hmlangw </code><br />
der Service zum Autostart konfiguriert werden.<br />
<br />
=== Anbindung mit USB-Adapter ===<br />
{{Randnotiz|RNTyp=r|RNText=Bitte beachten: Es sind immer wieder Exemplare mit [[CP2102]] im Umlauf, die mehr als 3.3V Spannung liefern! Vor dem Verbinden mit dem HM-Modul sollte daher geprüft werden, ob der interne Spannungswandler ordnungsgemäß funktioniert und wirklich nur 3.3V liefert. Bei den blauen Micro-Modulen kann man den Fehler nach dieser Anleitung beheben: [https://www.silabs.com/community/interface/forum.topic.html/cp2102_3_3v_outputi-EaVr Beitrag von PBudmark vom 08.07.2017].}}<br />
[[Datei:PL2102 Modul.png|200px|thumb|right|Mod zur Herstellung der korrekten Spannung]]<br />
Das UART-Modul kann ebenfalls mit einem USB-Adapter an ein USB-fähiges Gerät angeschlossen werden. Allerdings ist hier wieder auf den Spannnungspegel zu achten, unbedingt einen USB-Adapter mit 3,3 Volt Pegel nehmen! Der Vorteil ist hier, dass hohe Geschwindigkeiten möglich sind und nicht wie bei WLAN Latenzen auftreten, aber es muss eben ein USB-Anschluss verfügbar sein.<br />
<br />
Grundsätzlich bewährt haben sich z.B. Modelle mit einem [[CP2102]], der auch ausreichend Stromreserven zum Betrieb des Moduls bietet. Dabei ist die serielle Schnittstelle wie üblich zu kreuzen, also<br />
<br />
'''Verschaltung'''<br />
3.3V <-> 3.3V<br />
GND <-> GND<br />
Rx <-> Tx<br />
Tx <-> Rx<br />
<br />
=== Anbindung mit ESP8266 ===<br />
Hier ist der Vorteil, dass vor Ort nur WLAN verfügbar sein muss. Nachteilig kann sich auswirken, dass WLAN hohe Latenzen aufweisen kann und daher manchmal der Eindruck entsteht, das Modul sei gerade abwesend. <br />
<br />
Zum Anschluss kann ein beliebiger ESP8266 verwendet werden. Mit einigen Versionen (Beispiele im Forum: {{Link2Forum|Topic=102141|Message=956606|LinkText=ESP07}} sowie {{Link2Forum|Topic=102141|LinkText=Wemos mini pro}}) ist eine Anbindung anscheinend nicht oder nur schwer möglich - wobei dies auch an nicht funktionsfähigen Clonen liegen kann oder beim Wemos daran, dass dort die USB-Schnittstelle mit Tx/Rx nicht kalkulierbare Störungen auslöst. Ein Problem bei Wlan Anbindung kann die vergrößerte roundtrip delay darstellen. <br />
<br />
Es gibt verschiedene ESP Firmware-Möglichkeiten: <br />
* [https://github.com/jeelabs/esp-link '''ESPLink'''] ist eine sehr stabile und nicht mehr aktiv weiterentwickelte Firmware, die die serielle Schnittstelle direkt mit WLAN verbindet und ohne größere Schwierigkeiten eingerichtet werden kann und funktioniert. Sie nutzt die serielle Schnittstelle des ESP. Allerdings erlaubt ESPLink nicht die Nutzung anderer GPIOs, so können beispielsweise keine anderen Sensoren mit angeschlossen bzw. ausgelesen werden. Verwendet man ESP-Link, so muss neben der WLAN Konfiguration nur das Pin Assignment konfiguriert werden. Alle Pins auf disabled stellen.<br />
* [https://www.letscontrolit.com/wiki/index.php/ESPEasy '''ESPEasy'''] (neue Version: ESPMega) wird beständig weiterentwickelt und gestattet es, weitere Sensoren anzuschließen und deren Werte auszulesen. Insbesondere kann man mit ESPEasy auch zwei weitere Pins nutzen, um eine serielle Schnittstelle zu simulieren (so genannter ''serieller Server''). Man spricht auch von einer ''swapped'' Schnittstelle. Die {{Link2Forum|Topic=62651|LinkText=Platine von amunra}} nutzt eine solche Schnittstelle. Allerdings gibt es mit einigen ESP8266-Geräten Schwierigkeiten, diese serielle Schnittstelle zu nutzen. So ist etwa ein serieller Server mit neueren ESP-Versionen anscheinend nicht lauffähig (siehe dazu {{Link2Forum|Topic=75422|LinkText=diesen Thread}}). Es gibt eine ältere Firmware-Version von PeMue, die unmittelbar funktionsfähig scheint, siehe dazu {{Link2Forum|Topic=86592|LinkText=diesen Forenthread}}. <br />
* '''Tasmota''' kann mit der Komponente TCP_Bridge ebenfalls das Modul ansteuern. Hier im [https://forum.fhem.de/index.php/topic,125817.msg1233521.html Forum] gibt es dazu eine ausführliche Anleitung und den Erfahrungsbericht. <br />
[[Datei:Esp-pin Konfiguration HMUART.png|200px|mini|esp-link Pin-Konfiguration beim swapped Server]]<br />
Bei der seriellen Schnittstelle (da die ESP auf 3,3V laufen, sind keine Spannungsteiler erforderlich) findet man die Verschaltung unten. Bei der ''swapped'' Schnittstelle wird auf die digitalen Pins D7/D8 zurückgegriffen (siehe auch unten). Die letztere Verschaltung erfordert eine entsprechende Implementierung der Schnittstelle in der Firmware selbst, die beispielsweise bei ESPEasy unter Umständen nicht gegeben ist oder selbst kompiliert werden muss. <br />
<br />
'''Verschaltung bei einem WeMos D1 mini'''<br />
(UART) <-> (Wemos swapped) <-> (Wemos seriell)<br />
3.3V <-> 3.3V <-> 3.3V<br />
GND <-> GND <-> GND<br />
Rx <-> D8 <-> Tx (D10 oder Tx)<br />
Tx <-> D7 <-> Rx (D9 oder Rx)<br />
<br />
Es gibt eine ausführliche Erläuterung für die Software unter [https://forum.fhem.de/index.php?action=dlattach;topic=56606.0;attach=68630], siehe auch [https://www.esp8266.com/viewtopic.php?f=32&t=18669 diese Grafik der Pins des Wemos]<br />
<br />
Im Forum gibt es mehr Informationen zu diesen Adaptern, zum Beispiel {{Link2Forum|Topic=62651|LinkText="(amunra)-Platine für HM-MOD-UART-RPI..."}} oder {{Link2Forum|Topic=79559|LinkText="3. Sammelbestellung - Homematic WLAN Gateway"}}.<br />
<br />
[[Datei:HM-CFG-WLAN-k.jpeg|thumb|left|200px|Anschluß an Wemos]]<br />
Auf dem linken Foto ist der Anschluss des gesamten Moduls (Rastermaß 2,54mm statt 2mm!) an den Wemos zur Wifi-Einbindung abgebildet.<br />
<br />
=== Betrieb mit einem LAN-TTL-Wandler ===<br />
[[Datei:Hm-uart und usr-tcp232-T2.png|thumb|right|400px|Anschluß an die gängige Variante USR-TCP232-T2]]Auf gängigen Marktplätzen sind für etwas weniger als 10 Euro Module erhältlich, die einen seriellen Anschluss im LAN bereitstellen können. Nähere Hinweise sind in den Artikeln [[Serial TTL to Ethernet Module]] sowie [[1W-IF-ETH]] zu finden.<br />
<br />
Die Module melden sich per DHCP<ref>jedenfalls neuere firmware-Versionen</ref> im Netzwerk an, die Konfiguration erfolgt je nach Variante über ein Web-Interface, ein Windows-Tool oder eine Management-Software.<br />
<br />
=== Betrieb mit MapleCUx ===<br />
Auch die seriellen Schnittstellen, die ein MapleCUL oder [[MapleCUN]] bereitstellen, können zum Anschluß des Moduls verwendet werden. Der MapleCUN stellt beide seriellen Schnittstellen je unter einem eigenen Port ins Netz.<br />
<br />
== Definition in FHEM ==<br />
Die Funktion in FHEM hängt ab von der verwendeten Hardware. Die eigentliche Funktion wird mit dem Modul [[HMUARTLGW]] hergestellt. Alle dortigen Hinweise zur Konfiguration sind zu beachten! Man sollte sich auch mit den Grundlagen der [[HomeMatic]] Kommunikation vertraut machen.<br />
<br />
Je nach physischem Anschluss erfolgt eine Anbindung in FHEM in unterschiedlicher Weise. Folgende Beispiele sind '''abweichend''' von der '''<big>[[HMUARTLGW#Define|Standardkonfiguration]]!</big>'''<br />
<br />
Wurde ein USB-Adapter auf dem FHEM-Gerät selbst verwendet, definiert man das Gerät in FHEM wie folgt.<br />
define USB_HmUART HMUARTLGW /dev/ttyUSBx<br />
Wurde dagegen das Gerät über WLAN oder LAN durch das UART-Modul angebunden, erfolgt die Einbindung in FHEM durch<br />
define WLAN_HmUART HMUARTLGW uart://<IP-Adresse>:<Portnummer><br />
Portnummern:<br />
*ser2net 4000 (bzw. entsprechend gewählter Einstellung)<br />
*socat 2000 (bzw. entsprechend gewählter Einstellung)<br />
*esp-link 23 <br />
*MapleCUN 2324 bzw. 2325 <br />
*USR-TCP232-T2 entspr. Konfiguration.<br />
<br />
=== Logbeispiel ===<br />
Typischerweise meldet sich das Modul beim Start so:<br />
2016.10.06 17:11:16 3: Opening myHmUART device /dev/ttyAMA0<br />
2016.10.06 17:11:16 3: Setting myHmUART serial parameters to 115200,8,N,1<br />
2016.10.06 17:11:16 3: myHmUART device opened<br />
2016.10.06 17:11:17 3: HMUARTLGW myHmUART currently running Co_CPU_BL<br />
2016.10.06 17:11:17 3: HMUARTLGW myHmUART currently running Co_CPU_App<br />
<br />
=== Verwendung AES in FHEM===<br />
Das Modul beherrscht AES.<br />
Für weitere Informationen gibt es einen separaten Wiki Eintrag [[AES Encryption]]<br />
<br />
=== Firmware Update des UART-Moduls mit FHEM ===<br />
Die Module werden mit einer Firmware 1.2.1 ausgeliefert. Dies Firmware ist nicht für einen stabilen Betrieb geeignet, die Firmware 1.4.1 ist die minimal lauffähige Version.<br />
<br />
Bitte den Befehl zum download inklusive der Anführungszeichen in die FHEM Kommandozeile eingeben!<br />
<br />
'''Firmware herunterladen'''<br />
* Version 1.4.1<br />
<syntaxhighlight lang="text">"wget -qO ./FHEM/firmware/coprocessor_update.eq3 https://raw.githubusercontent.com/eq-3/occu/28045df83480122f90ab92f7c6e625f9bf3b61aa/firmware/HM-MOD-UART/coprocessor_update.eq3"</syntaxhighlight><br />
* Alternativ die aktuellste (für den Betrieb mit dem Modul HMUARTLGW '''NICHT''' empfohlen)<br />
<syntaxhighlight lang="text">"wget -qO ./FHEM/firmware/coprocessor_update.eq3 https://raw.githubusercontent.com/eq-3/occu/HEAD/firmware/HM-MOD-UART/coprocessor_update.eq3"</syntaxhighlight><br />
(Firmware neuer als 1.4.1 dient nur bei CCU-Klonen mit Mischbetrieb BidCOs, klassisch HomeMatic und HomeMatic IP, siehe {{Link2Forum|Topic=70752|LinkText=diesen Forenthread}}).<br />
<br />
'''Flashen der neuen Firmware''' <br />
<br />
Erstmal überzeugen das die Firmware da ist: Z.B. mit dem Befehl in der FHEM Kommandozeile, die Ausgabe erfolgt in der Weboberfläche!<br />
<syntaxhighlight lang="text">{qx(ls -lha ./FHEM/firmware)}</syntaxhighlight><br />
Wenn alles ok - Befehl zum flashen ausführen:<br />
<syntaxhighlight lang="text">set myHmUART updateCoPro /opt/fhem/FHEM/firmware/coprocessor_update.eq3</syntaxhighlight><br />
<br />
=== Firmware Update des UART-Moduls ohne FHEM ===<br />
Sollte das Update über FHEM nicht funktionieren oder FHEM nicht verfügbar sein, kann die Firmware auch wie folgt eingespielt werden (Quelle: [http://heinz-otto.blogspot.com/2016/07/raspberry-pi-homematic-modul.html Ottos Technik Blog])<br />
<br />
sudo su<br />
apt-get update && apt-get -y install libusb-1.0-0-dev build-essential git<br />
systemctl stop fhem<br />
git clone git://git.zerfleddert.de/hmcfgusb<br />
cd hmcfgusb/<br />
make<br />
# Firmware runterladen<br />
wget https://raw.githubusercontent.com/eq-3/occu/ee68faf77e42ed5e3641790b43a710a3301cea7e/firmware/HM-MOD-UART/coprocessor_update.eq3<br />
# eigentliches flashen:<br />
./flash-hmmoduart -U /dev/ttyAMA0 coprocessor_update.eq3<br />
<br />
=== Bekannte Probleme ===<br />
* Sollten beim Flashen der Firmware hartnäckige Probleme auftreten (kein Erfolg aber auch gar keine Fehlermeldungen) ist das Modul vom Strom zu trennen, ein Neustart des Pi reicht nicht!<br />
* Ein {{Link2Forum|Topic=41203|Message=340320|LinkText=Beitrag}} aus dem genannten Forenthread: ''Das Ding ist anscheinend wirklich einfach das Funkmodul aus der CCU2 (wird zumindest in der eQ-3 SW als CCU2 angesprochen) und spricht ein für FHEM vollkommen neues Protokoll.''<br />
* Beim Raspberry 4 gibt es eine Einstellung zur Temperaturkontrolle, die muss deaktiviert werden. Siehe diesen {{Link2Forum|Topic=123223|Message=1178032|LinkText=Beitrag im Forum}}.<br />
* Bei Verwendung mit einem USR TCP232-T2 Wandler kann es in der Default-Einstellung des Wandlers dazu kommen, dass obsolete Kommunikation gepuffert und nach einem Wiederverbinden unnötig an FHEM gesendet wird (siehe {{Link2Forum|Topic=123948|LinkText=dieses Foren-Thema}}). Im FHEM-Log gibt es in diesem Fall die Meldung "HMUART failed to enter App!" Abhilfe schafft das Aktivieren der Option "Buffer Data before connected" unter "Expand Function" im WebUI des TCP-232.<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=41203|LinkText=Forenthread}} mit Nachfrage zur Unterstützung dieses Geräts in FHEM<br />
* {{Link2Forum|Topic=54511|LinkText=Modul für HomeMatic UART-Modul (RPi) und HomeMatic LAN Gateway}}<br />
* [http://www.elv.de/homematic-funkmodul-fuer-raspberry-pi-bausatz.html Produktseite] bei ELV<br />
* {{DocLink|elv|/Assets/Produkte/10/1040/104029/Downloads/104029_lan_gateway_um.pdf Bedienungsanleitung}}<br />
* {{Link2Forum|Topic=56606|LinkText=Forenthread}} Hardware Thread mit vielen Varianten der Anbindung. In Post #26 gibt es die Detailbeschreibung in der angehängten PDF.<br />
:<hr /><br />
<references /><br />
<br />
[[Kategorie:HomeMatic Components]]<br />
[[Kategorie:Interfaces]]<br />
[[Kategorie:Raspberry Pi]]<br />
[[Kategorie:868MHz]]</div>Otto123http://wiki.fhem.de/w/index.php?title=E-Mail_senden&diff=37524E-Mail senden2022-08-12T07:51:30Z<p>Otto123: /* Raspberry Pi */ sendEmail Aufruf für attachments korrigiert</p>
<hr />
<div>Um aus FHEM heraus '''E-Mail senden''' zu können, sind abhängig von der verwendeten Platform unterschiedliche Vorgehensweisen erforderlich.<br />
{{Randnotiz|RNTyp=y|RNText=Anleitung zur Einrichtung von Exim4 auf Debian mit GMX als Smarthost:[[Media:Anleitung_Exim4_Debian_GMX.pdf|PDF]]}}<br />
== Linux ==<br />
=== FritzBox 7170 (non-chroot) oder "reine" Linuxe ===<br />
Datei 99_email.pm im Modul-Verzeichnis mit folgender Funktion anlegen (oder in bestehende 99_irgendwas.pm kopieren):<br />
<syntaxhighlight lang="perl"><br />
sub fb_mail {<br />
my $rcpt = $_[0];<br />
my $subject = $_[1];<br />
my $text = $_[2];<br />
system(&quot;/bin/echo \&quot;$text\&quot; | /usr/bin/mail send -i - -s \&quot;$subject\&quot; -t \&quot;$rcpt\&quot;&quot;);<br />
}<br />
</syntaxhighlight><br />
Aufruf dann mittels <br />
:<code>{ fb_mail('empfaenger@mail.de','Subject','text 123') }</code><br />
Darauf achten, dass der fhem-User Mails senden darf (in richtige Gruppe eintragen. Ggf. vorher einmal su fhem und probieren).<br />
<br />
=== Fritz!Box 7390 ===<br />
Auf der [[AVM Fritz!Box|FritzBox 7390]] ist diese Funktion seit 10/2012 Bestandteil der FHEM Standardauslieferung. Sie ist untergebracht in FritzBoxUtils.pm und heisst dort FB_mail($$$) (Groß-Kleinschreibung beachten).<br />
<br />
Da der Dateiname von FritzBoxUtils.pm nicht mit 99_ beginnt, wird diese Programmdatei nicht automatisch beim Start von FHEM geladen. FHEM muss zum Laden dieser Programmdatei aufgefordert werden. Dazu (z.&nbsp;B. in 99_myUtils.pm) die Zeile ''use FritzBoxUtils;'' einfügen.<br />
<br />
Mit dem Install von AVM.de wird fhem in einer chroot-Umgebung ausgeführt, die den Zugriff auf die Mailfunktion der Fritzbox nicht zulässt. Daher muss FHEM in der [http://fhem.de/fhem.html#Download Version von fhem.de] installiert sein. Sollte Ihre Fritzbox bisher mit dem install von AVM laufen, kann (nach einem backup!) das image von fhem.de einfach drüberinstalliert werden. Es sollten dabei alle Einstellungen erhalten bleiben.<br />
<br />
<syntaxhighlight lang="perl"><br />
sub fb_mail {<br />
my $rcpt = $_[0];<br />
my $subject = $_[1];<br />
my $text = $_[2];<br />
system(&quot;/bin/echo \&quot;$text\&quot; &gt; /var/tmp/fhem_nachricht.txt&quot;);<br />
system(&quot;/sbin/mailer send -i '/var/tmp/fhem_nachricht.txt' -s \&quot;$subject\&quot; -t \&quot;$rcpt\&quot;&quot;);<br />
system(&quot;rm /var/tmp/fhem_nachricht.txt&quot;);<br />
}<br />
</syntaxhighlight><br />
<br />
Aufruf dann mittels <br />
:<code>{ fb_mail('empfaenger@mail.de','Subject','text 123') }</code><br />
bzw. <br />
:<code>{ FB_mail('empfaenger@mail.de','Subject','text 123') }</code><br />
<br />
Dem Mailer können noch weitere Parameter hinzugefügt werden. Mehr dazu siehe: [http://www.wehavemorefun.de/fritzbox/Mailer Mailer]<br />
<br />
=== OpenWRT ===<br />
Die Anleitung wurde mit einer frühen Beta von Barrier Breaker (r391xx) mit einem TP_Lind WDR 4900 getestet. Da "sendEmail" nicht als Package vorliegt wird in dieser Anleitung "ssmtp" verwendet.<br />
Die Installation erfolgt mittels:<br />
<br />
<syntaxhighlight lang="bash"><br />
opkg update<br />
opkg install ssmtp_2.64-4_mpc85xx.ipk <br />
</syntaxhighlight><br />
<br />
Hierbei werden die Pakete libopenssl und zlib mit installiert. Damit ssmtp funktioniert müssen die Dateien /etc/ssmtp/ssmtp.conf und /etc/ssmtp/revaliases angepasst werden.<br />
<br />
/etc/ssmtp/ssmtp.conf <br />
<syntaxhighlight lang="text"><br />
root=arnold@gmx.net<br />
mailhub=mail.gmx.net:465<br />
rewriteDomain=gmx.net<br />
hostname=gmx.net<br />
FromLineOverride=YES<br />
UseTLS=YES<br />
#UseSTARTTLS=YES<br />
AuthUser=arnold@gmx.net<br />
AuthPass=Passwort_von_arnold@gmx.net<br />
</syntaxhighlight><br />
<br />
/etc/ssmtp/revaliases<br />
<syntaxhighlight lang="text"><br />
root:arnold@gmx.net:mail.gmx.net:465<br />
</syntaxhighlight><br />
<br />
In der [[99_myUtils_anlegen|99_myUtils]] folgende Unterroutine einfügen (von der RPi-Anleitung übernommen):<br />
<br />
<syntaxhighlight lang="perl"><br />
sub OpenWRTMail <br />
{ <br />
my $rcpt = shift;<br />
my $subject = shift; <br />
my $text = shift; <br />
my $ret = "";<br />
my $sender = "dockstar\@heye-tammo.de"; <br />
Log 1, "sendEmail RCP: $rcpt, Subject: $subject, Text: $text";<br />
$ret .= qx(echo -e 'to:$rcpt\n from:$sender\nsubject:$subject\n$text\n' | ssmtp $rcpt);<br />
$ret =~ s,[\r\n]*,,g; # remove CR from return-string <br />
Log 1, "sendEmail returned: $ret"; <br />
}<br />
</syntaxhighlight><br />
<br />
Ab hier den entsprechenden Abschnitt unter "Raspberry Pi" lesen.<br />
<br />
=== Synology DiskStation ===<br />
Beim DSM 3.2 gab es keinen <code>sendmail</code>-Befehl, sondern nur eine Funktion für den Versand der System-Benachrichtigungen. Interessanterweise funktionierte aber der <code>php-mail</code>-Befehl, so dass man mittels folgendem Modul Mails frei versenden kann:<br />
<syntaxhighlight lang="perl"><br />
sub sendmail($$$) {<br />
my($empf, $subj, $nachricht) = @_;<br />
system(&quot;php -r 'mail(\&quot;$empf\&quot;,\&quot;$subj\&quot;,\&quot;$nachricht\&quot;);'&quot;);<br />
undef;<br />
}<br />
</syntaxhighlight><br />
<br />
=== Raspberry Pi ===<br />
{{Randnotiz|RNTyp=o|RNText=In früheren Distributionen wurde das Paket sowie der Aufruf uU. mit großem "E" geschrieben: ''sendEmail''.}}Auf einem [[Raspberry Pi]] muß noch sendemail nachinstalliert werden. Diese Anleitung funktioniert ab der Stretch-Version von Raspbian bzw. '''Debian''' sowie unter '''Ubuntu''' seit ca. Version 16.04.<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get update<br />
sudo apt-get install sendemail libio-socket-ssl-perl libnet-ssleay-perl perl<br />
</syntaxhighlight><br />
<br />
Man kann die korrekte Funktion im Terminal (ohne <code>{qx()}</code> ) oder auch in der FHEM Kommandozeile testen (Hinweis: manche Provider (z.B. gmail) lassen diesen Zugang erst nach Freischaltung zu!).<br />
<syntaxhighlight lang="perl"><br />
{qx(sendemail -f 'Ab\@send.er' -t 'Emp\@faeng.er' -u 'subject' -m 'text' -a 'DateinameOderLeer' -s 'smtpFQDN:port' -xu 'MailUser' -xp 'PasswortOhneKlammeraffen')}<br />
</syntaxhighlight><br />
<br />
{{Hinweis|Bei Gmail muss seit dem 30.6.2022 ein separates Passwort erzeugt werden, die alte Einstellung über "Zugriff durch weniger sichere Apps" funktioniert nicht mehr. Siehe Support Seite Google: https://support.google.com/accounts/answer/185833}}<br />
<br />
Beispiel mit Gmail über Linux Terminalfenster:<br />
<syntaxhighlight lang="perl"><br />
sendemail -f 'Der.Absender@gmail.com' -t 'Der.Empfaenger@gmail.com' -u 'subject' -m 'text' -a '' -s 'smtp.gmail.com:587' -xu 'Der.Absender' -xp DASSUPERGEHEIMEPASSW0RT<br />
</syntaxhighlight><br />
<br />
In der [[99_myUtils_anlegen|99_myUtils]] folgende Unterroutine einfügen:<br />
<syntaxhighlight lang="perl"><br />
######## DebianMail Mail auf dem RPi versenden ############ <br />
# $provider für SMTP Server anpassen. <br />
# Einmal in der FHEM Kommandozeile, user und password anpassen:<br />
# {setKeyValue("myEmailKonto",'user@domain');;setKeyValue("myEmailPasswrd",'password')}<br />
sub DebianMail <br />
{ <br />
my $rcpt = shift;<br />
my $subject = shift; <br />
my $text = shift; <br />
my $attach = shift; <br />
my $ret = "";<br />
my $error;<br />
my $konto = getKeyValue("myEmailKonto"); <br />
my $passwrd = getKeyValue("myEmailPasswrd"); <br />
my $from = $konto; # or use different KeyValue if konto is not the from email address<br />
my $provider = "smtp.1und1.de"; # smtp.domain.tld:port see provider documentation<br />
#Log 1, "sendEmail RCP: $rcpt";<br />
#Log 1, "sendEmail Subject: $subject";<br />
#Log 1, "sendEmail Text: $text";<br />
#Log 1, "sendEmail Anhang: $attach";<br />
if (not defined($attach)){$attach=''}<br />
$ret .= qx(sendemail -f '$from' -t '$rcpt' -u '$subject' -m '$text' -a $attach -s '$provider' -xu '$konto' -xp '$passwrd' -o tls=auto -o message-charset=utf-8);<br />
$ret =~ s,[\r\n]*,,g; # remove CR from return-string <br />
Log 1, "sendemail returned: $ret"; <br />
}<br />
###############################################################################<br />
</syntaxhighlight><br />
<br />
Die Zugangsdaten für den Email-Account müssen dabei FHEM-intern gespeichert werden. Dazu gibt man einmalig über die Kommandozeile folgendes ein (user@domain und password müssen auf den Email Account geändert werden):<br />
:<code><nowiki> {setKeyValue("myEmailKonto",'user@domain');;setKeyValue("myEmailPasswrd",'password')}</nowiki></code><br />
<br />
Um die TLS Verschlüsselung (ehem. SSL) nicht zu nutzen, muss in der viertletzten Zeile tls=no verwendet und der Port des Mailproviders auf 25 eigetragen werden. Sollte anschließend keine Mail verschickt werden, siehe Probleme.<br />
<br />
Falls der Body-Text in einem (Android-)Mailer auf dem Handy nicht gezeigt wird, kann der Parameter '''-o message-content-type=html''' helfen.<br />
<br />
Die Funktion kann beispielsweise folgendermaßen aufgerufen werden:<br />
{{Randnotiz|RNTyp=g|RNText=Bei allen Feldern können generell doppelte " oder einfache ' Anführungszeichen verwendet werden. Innerhalb von "" müssen Sonderzeichen wie @ aber maskiert werden, da sie sonst als Steuerzeichen interpretiert werden:<br />
:<code><nowiki>"email\@email.domain" oder 'email@email.domain'</nowiki></code><br />
}}<br />
Direkt in der FHEM Kommandozeile (ohne Anhang)<br />
:<code><nowiki>{DebianMail("email\@email.domain","Subject","Text")}</nowiki></code><br />
Die ordnungsgemäße Ausführung wird mit 71 quittiert.<br />
Beispiele mehrere Anhänge (Es ist wichtig Dateinamen mit Leerzeichen in separate Anführungszeichen zu setzen)<syntaxhighlight lang="perl"><br />
{DebianMail("email\@email.domain","Subject","Text","Anhang1 Anhang2 Anhang3")}<br />
{DebianMail('email@email.domain','Subject','Text',"'with spaces Anhang1' 'with spaces Anhang2'")}<br />
</syntaxhighlight>oder (mehr als einen Empfänger, diese können durch Leerzeichen, Semikolon oder Komma getrennt sein)<br />
<br />
<syntaxhighlight lang="text"><br />
define Sonstiges at *01:00:00 {\<br />
DebianMail('email@email.domain,email2@email.domain',"Subject","Text","'Anhang1' 'Anhang2' ...");;\<br />
}<br />
</syntaxhighlight><br />
{{Randnotiz|RNTyp=y|RNText=Eine erweiterte - nicht blockierende - Version des Scripts ist [[SSCAM_-_Steuerung_von_Kameras_in_Synology_Surveillance_Station#Mail mit Snapshot im Anhang und Aufnahmelink versenden (sendEmail)|hier]] zu finden}}<br />
<br />
=== BeagleBoard-xM ===<br />
Auf einem [[:Kategorie:BeagleBoard-xM|BeagleBoard-xM]] mit einem [http://en.opensuse.org/HCL:BeagleBoard-xM OpenSUSE 12.2] kann man ebenfalls das Perl-Programm ''sendEmail'' wie beim RPi nutzen. Dies gibt es aber nicht in den Repositories von openSUSE, sondern man muss sich ''sendEmail'' als Source herunterladen. Das geht am einfachsten per ''wget'', welches man ebenfalls erst installieren muss (aber aus einem Repository).<br />
<syntaxhighlight lang="bash"><br />
$ zypper in wget<br />
$ cd /opt<br />
$ wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz<br />
$ tar xvfz sendEmail-v1.56.tar.gz<br />
$ cd sendEmail-v1.56<br />
$ cp sendMail /usr/local/bin<br />
</syntaxhighlight><br />
Dann geht man weiter vor wie unter RPi beschrieben (anlegen der SUB-Routine in 99_myUtils usw.).<br />
<br />
'''Hinweis:''' Die Version 1.56 von ''sendEmail'' ist Stand Januar 2013 die aktuelle. Da diese Programmversion von 2009 stammt, ist mit neuen Versionen selten zu rechnen. Vielleicht schauen Sie trotzdem vorher auf der [http://caspian.dotconf.net/menu/Software/SendEmail/ Homepage von sendEmail] nach.<br />
<br />
== Windows ==<br />
# Kopiere die Datei sendEmail.exe* in Dein FHEM Verzeichnis (hier c:\fhem-5.0\); Quelle: [http://caspian.dotconf.net/menu/Software/SendEmail/ Homepage von sendEmail]<br />
# Erstelle im FHEM Verzeichnis die Datei wmail.bat mit folgendem Inhalt (eine Zeile):<br />
:<code>sendEmail -f absender@domain.de -u "%1" -m " " -s SMTP-SERVERAdresse -xu SMTP_USERNAME -xp SMTP_PASSWORT -t empfänger@domain.de -o message-header="X-Message-Flag: FHEM"</code><br />
# Beispiel fhem.cfg<br />
## Mail wenn sich der Status von Heizung.* oder Hzg.* ändert <br><code>define Mail_Heizung notify Heizung.*|Hzg.* { system("wmail $NAME:$EVENT")}</code><br />
## Mail bei Signal Aussentemperatur (für dieses Beispiel wird [http://fhem.de/commandref.html#getstate http://fhem.de/commandref.html#getstate getstate] benötigt) <br><code>define Mail_Aussentemperatur notify Aussentemperatur {\</code><br><code>my ($val);;\</code><br><code>$val = fhem "getstate $NAME";;\</code><br><code>system("wmail \"$NAME: $val\"");;\</code><br><code>}</code><br />
<br />
== Probleme ==<br />
=== sendEmail / sendemail (Schreibweise alt / neu ) ===<br />
Erhält man Fehler bez. TLS (''ERROR => TLS setup failed: SSL connect attempt failed error: ...'' ), sind eventuell die ca-certificates veraltet oder nicht installiert. Prüfung:<br />
:<code>apt-cache policy ca-certificates</code><br />
Falls man keine E-Mails verschicken kann, kann man in einem ersten Test prüfen, ob sendEmail als solches funktioniert und die Konfiguration (Benutzer, Passwort, Server-Name usw.) des Mail-Kontos, über das die Mails abgesetzt werden sollen, richtig ist.<br />
<br />
Hierzu setzt man in der FHEM-Befehlszeile die folgende Anweisung ab:<br />
:<code>{ SUB-Routinen-Name('EMailAdresse@Mail.Domain','Test','Test-Text');; }</code><br />
und ersetzt ''SUB-Routinen-Name'' durch den Namen der in 99_myUtils erzeugten Prozedur. Statt ''EMailAdresse@Mail.Domain'' trägt man noch eine gültige E-Mail-Adresse ein und bestätigt den Befehl dann mittels &lt;Enter&gt; (nicht "save"). Empfangen Sie nicht kurzfristig eine entsprechende E-Mail, ist sehr wahrscheinlich an den Zugangsdaten etwas verkehrt. <br />
<br />
Vor dem testen der Routine oben kann sendEmail auch über die Konsole (z.&nbsp;B. via ssh) getestet werden:<br />
:<code>sendEmail -vv -f 'Absender@AbsDomain.de' -t 'Empfänger@EmpfDomain.de' -u 'subject' -m 'body' -s 'smtp.AbsDomain.de' -xu 'AbsenderBenutzername' -xp 'AbsenderPasswort' -o tls=yes</code><br />
<br />
=== Keine Mail mit TLS Verschlüsselung ===<br />
{{Randnotiz|RNTyp=y|RNText=Diese Information trifft nur auf alte Systeme zu, aktuell (2021) befindet sich in Zeile 1933 der korrekte Code}}<br />
Prüfung mit <code>grep -n SSLv /usr/bin/sendEmail</code><br />
<br />
Den Test über die Konsole durchführen. Erhält man folgende Fehlermeldung:<br />
''invalid SSL_version specified at /usr/share/perl5/IO/Socket/SSL.pm line 332''<br />
muss auf dem Raspberry folgende Datei angepasst werden: ''/usr/bin/sendEmail''.<br />
In Zeile 1907 muss<br />
if (! IO::Socket::SSL->start_SSL($SERVER, SSL_version => 'SSLv3 TLSv1')) {<br />
<br />
in folgendes geändert werden<br />
if (! IO::Socket::SSL->start_SSL($SERVER, SSL_version => 'SSLv23:!SSLv2')) {<br />
<br />
Der frühere Tipp, direkt in der SSL.pm Datei zu editieren, führt zu Problemen, wenn man auf FHEM per HTTPS zugreifen will und ist daher nicht zu empfehlen.<br />
<br />
=== Email laut Log gesendet aber nicht angekommen? ===<br />
Dann bitte in der Fritzbox Oberfläche überpüfen, ob unter "System" -> "Push Service" selbiger eingerichtet und aktiviert wurde. <br />
<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:FritzBox]]<br />
[[Kategorie:BeagleBoard-xM]]<br />
[[Kategorie:Raspberry Pi]]<br />
[[Kategorie:E-Mail]]</div>Otto123http://wiki.fhem.de/w/index.php?title=Speedtest&diff=37516Speedtest2022-08-08T16:32:26Z<p>Otto123: /* Installation des CLI Binary von ookla */</p>
<hr />
<div>{{Infobox Modul<br />
|ModPurpose=Testet die Internetgeschwindigkeit<br />
|ModType=d<br />
|ModCmdRef=speedtest<br />
|ModForumArea=Sonstiges<br />
|ModTechName=32_speedtest.pm<br />
|ModOwner=Andre / justme1968 ({{Link2FU|430|Forum}} / [[Benutzer_Diskussion:Justme|Wiki]])}}<br />
[[Speedtest]] ist ein Modul, mit dem in regelmäßigen Abständen die Internet-Geschwindigket (Download, Upload, Ping) gemessen werden kann. Dabei wird auf das externe Python-Script [https://github.com/sivel/speedtest-cli speedtest-cli] zurückgegriffen. <br />
<br />
Mit dem Stand vom 05.10.2020 kann alternativ auch das offizielle CLI Binary von ookla verwendet werden. Dies liefert in der Regel genauere Werte, vor allem bei höheren Bandbreiten. <br />
<br />
== Voraussetzungen ==<br />
Für diese Anleitung ist notwendig:<br />
* Debian-Derivat (Debian, Ubuntu, Raspbian, ...)<br />
* Linux-Grundkenntnisse<br />
* Paket- und Quellenverwaltung apt-get<br />
* wget<br />
<br />
Alle in diesen Kapitel genannten Befehle müssen auf der Kommandozeile abgesetzt werden.<br />
<br />
=== Installation von speedtest-cli ===<br />
Voraussetzung:<br />
* Python 2.4 - 3.4<br />
{{Hinweis|Sollte [https://www.python.org/ Python] und/oder [https://www.gnu.org/software/wget/ wget] nicht installiert sein, kann das mit folgenden zwei Befehlen erledigt werden:<br />
sudo apt-get update<br />
sudo apt-get install python wget<br />
}}<br />
Zuerst muss das speedtest-cli - Script heruntergeladen werden. Der folgende Befehl erledigt das mit Hilfe von wget und speichert die Datei im Verzeichnis ''/usr/local/bin'':<br />
sudo wget -O /usr/local/bin/speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py<br />
<br />
Anschließend muss die Datei noch als "ausführbar" markiert werden:<br />
sudo chmod +x /usr/local/bin/speedtest-cli<br />
<br />
Ob alles funktioniert hat, kann man dann mit einem einfachen Aufruf überprüfen:<br />
speedtest-cli --help<br />
<br />
Weitere Installationsanleitungen sind auf der [https://github.com/sivel/speedtest-cli speedtest-cli - Webseite] zu finden.<br />
<br />
=== Installation des CLI Binary von ookla ===<br />
<br />
Entweder das offizielle Setup Script von ookla verwenden: https://www.speedtest.net/apps/cli, oder das für die Hardware passende CLI Binary von direkt herunterladen und auspacken.<br />
<br />
Beispiel für '''RasperryPi''':<br />
* <code> wget -O speedtest.tgz <nowiki>https://install.speedtest.net/app/cli/ookla-speedtest-1.1.1-linux-armhf.tgz</nowiki></code> <br />
* <code> tar -xzvf speedtest.tgz</code><br />
* <code>mv speedtest /usr/local/bin/</code><br />
<br />
und setzen des Attributs <code>ookla</code> mit dem Wert 1.<br />
<br />
Falls damit der folgende Fehler im FHEM-Log angezeigt wird<br />
<pre><br />
2020.10.07 11:52:14.721 5: speedtest done<br />
what(): basic_string::_M_construct null not valid<br />
terminate called after throwing an instance of 'std::logic_error'<br />
</pre><br />
muss das FHEM-Start -Script angepasst werden. Beispiel in {{Link2Forum|Topic=114118|Message=1090706|LinkText=diesem Forenbeitrag}}.<br />
<br />
== Definition ==<br />
Das Modul wird folgendermaßen definiert:<br />
define <name> speedtest [interval] [server]<br />
<br />
=== Optionen ===<br />
*<code><interval></code>: Optional. Der Wert bestimmt, in welchen Zeitabständen ein Geschwindigkeitstest durchgeführt wird. Wird kein Intervall angegeben, wird der Standard-Wert (3600s) verwendet. Minimum sind 1800 Sekunden.<br />
*<code><server></code>: Optional. Hier kann die ID eines Speedtest-Servers eingetragen werden, gegen den die Geschwindigkeits-Tests gefahren werden. Ist kein Wert angegeben, wird der "nächstgelegene" Server verwendet.<br />
<br />
{{Hinweis|Eine Liste aller verfügbaren Speedtest-Server kann mittels <code>speedtest-cli --list</code> bzw. <code>speedtest-cli --list {{!}} grep Germany</code> angezeigt werden}}<br />
<br />
=== Readings ===<br />
* <code>ping</code> (ms)<br />
* <code>download</code> (MBit/s)<br />
* <code>upload</code> (MBit/s)<br />
<br />
=== Set ===<br />
* <code>statusRequest</code>: Startet einen manuellen Durchlauf des definierten Tests<br />
<br />
=== Attribute ===<br />
Bei der Definition des Moduls können folgende Attribute gesetzt werden:<br />
* <code>path</code>: Hier kann das Verzeichnis des speedtest-cli-Scripts angegeben werden (z.B.: /usr/local/bin).<br />
* <code>checks-till-disable</code>: Über dieses Attribut lässt sich festlegen, wie häufig speedtest-cli ausgeführt werden soll, bevor der automatische Aufruf deaktiviert wird. Nach Ablauf des Zählers wird das Modul automatisch auf disable gesetzt. Bei jedem Durchlauf wird der Zähler um 1 reduziert.<br />
* <code>disable</code>: Ist dieses Attribut auf 1 gesetzt, ist die automatische Ausführung deaktiviert. Das manuelle Ausführen über <code>set</code> ist trotzdem möglich.<br />
* <code>ookla</code>: Ist dieses Attribut auf 1 gesetzt, wird das CLI Binary von ookla verwendet.<br />
== Beispiel ==<br />
[[File:speedtest01.png|mini|right|200px|Ein speedtest-Device nach dem Geschwindigkeits-Test]]<br />
<br />
=== Definition des Moduls ===<br />
<syntaxhighlight lang="perl"><br />
define MySpeedtest speedtest 1800 5255<br />
attr MySpeedtest path /usr/local/bin<br />
</syntaxhighlight><br />
<br />
=== Logging in eine Datei ===<br />
Das Speichern der Ergebnisse in ein Logfile erreicht man z.B. so:<br />
<syntaxhighlight lang="perl"><br />
define FileLog_MySpeedtest FileLog ./log/MySpeedtest-%Y%m.log MySpeedtest:.*<br />
attr FileLog_MySpeedtest logtype text<br />
</syntaxhighlight><br />
<br />
==== Plot (FileLog)====<br />
Ein zugehörige SVG-Plot könnte wie folgt aussehen:<br />
<syntaxhighlight lang="perl"><br />
############################<br />
# Display speedtest results<br />
<br />
set terminal png transparent size <SIZE> crop<br />
set output '<OUT>.png'<br />
set xdata time<br />
set timefmt "%Y-%m-%d_%H:%M:%S"<br />
set xlabel " "<br />
set title '<L1>'<br />
<br />
set yrange [0:1]<br />
set y2range [0:12]<br />
set y3range [0:120]<br />
<br />
set ylabel "Mbit/s"<br />
set y2label "Mbit/s"<br />
set y3label "ms"<br />
<br />
#FileLog 4:speedtest.download\x3a::<br />
#FileLog 4:speedtest.upload\x3a::<br />
#FileLog 4:speedtest.ping\x3a::<br />
<br />
plot<br />
using 1:2 ls l0 axes x1y2 title 'download (Mbit/s)' with lines,<br />
using 1:2 ls l1 axes x1y1 title 'upload (Mbit/s)' with lines,<br />
using 1:2 ls l2 axes x1y3 title 'ping (ms)' with lines<br />
</syntaxhighlight><br />
<br />
Der Weblink dazu wird wie folgt definiert:<br />
<syntaxhighlight lang="perl"><br />
define wl_speedtest SVG FileLog_speedtest:speedtest3:CURRENT<br />
</syntaxhighlight><br />
<br />
=== Logging mit Hilfe von [[DbLog]] ===<br />
Das Loggen in eine Datenbank erfolgt, wenn ein Reading explizit oder generell alle Readings bei der Definition von [[DbLog]] angegeben worden sind und bei der Definition des Moduls [[Speedtest]] die Readings nicht über ''DbLogExclude'' ausgeschlossen wurden.<br />
<br />
==== Plot (DbLog) ====<br />
Definition des Plots bei Verwendung von DbLog:<br />
<syntaxhighlight lang="perl"><br />
define wl_speedtest SVG myDbLog:speedtest:HISTORY<br />
attr wl_speedtest label "DL $data{currval1} / UL $data{currval2} / ping $data{currval3}"<br />
attr wl_speedtest plotfunction speedtest<br />
</syntaxhighlight><br />
<br />
Definition der Datei speedtest.gplots:<br />
<syntaxhighlight lang="perl"><br />
############################<br />
# Display speedtest results<br />
<br />
set terminal png transparent size <SIZE> crop<br />
set output '<OUT>.png'<br />
set xdata time<br />
set timefmt "%Y-%m-%d_%H:%M:%S"<br />
set xlabel " "<br />
set title '<L1>'<br />
<br />
set yrange [0:1]<br />
set y2range [0:12]<br />
set y3range [0:120]<br />
<br />
set ylabel "Mbit/s"<br />
set y2label "Mbit/s"<br />
set y3label "ms"<br />
<br />
#myDbLog <SPEC1>:download:::$val=~s/([\d.]*).*/$1/eg<br />
#myDbLog <SPEC1>:upload:::$val=~s/([\d.]*).*/$1/eg<br />
#myDbLog <SPEC1>:ping:::$val=~s/([\d.]*).*/$1/eg<br />
<br />
plot<br />
using 1:2 ls l0 axes x1y2 title 'download (Mbit/s)' with lines,<br />
using 1:2 ls l1 axes x1y1 title 'upload (Mbit/s)' with lines,<br />
using 1:2 ls l2 axes x1y3 title 'ping (ms)' with lines<br />
</syntaxhighlight><br />
<br />
== Bekannte Probleme ==<br />
* Für den Betrieb ist Python notwendig. Daher läuft das Script nicht ohne Weiteres auf einer FritzBox.<br />
* Zwischenzeitlich wurde das Script umbenannt. Das Modul erwartet nach wie vor den ursprünglichen Namen. Daher ist wie oben beschrieben darauf zu achten, dass das abgelegte Script <code>speedtest-cli</code> heißt und notfalls dementsprechend umbenannt wird.<br />
* Das Modul bricht ggf. mit einer Perl-Fehlermeldung im FHEM-Log ab, obwohl das Script von der Konsole aus einwandfrei läuft. Dies tritt z.B. bei Verwendung von Rasbian mit installierten Python 2.7 und Python 3 auf. Zur Behebung muss im Script <code>speedtest-cli</code> die erste Zeile auf <code>#!/usr/bin/env python'''3'''</code> geändert werden.<br />
* Auf manchen Systemen muss in aktuellen speedtest-cli Versionen die Zeile <code>'(%s; U; %s; en-us)' % (platform.system(), platform.architecture()[0]),</code> auskommentiert werden.<br />
<br />
== Troubleshooting ==<br />
Im Folgenden sind ein paar Ansatzpunkte genannt, um beim Troubleshooting zu unterstützen:<br />
* Das Script läuft auf der Kommandzeile problemlos, das Modul bringt aber Fehler:<br />
** Script ist nicht ausführbar (<code>chmod +x speedtest-cli</code>)<br />
** Der FHEM-User (''fhem'') hat keine Berechtigung das Script auszuführen<br />
<!--<br />
; Ist das Log frei von Fehlermeldungen?<br />
; Werden im Modul Readings angezeigt?<br />
; Kommen die Readings im Log (Filelog oder DbLog) an?<br />
--><br />
* SVG-Plot zeigt nichts an:<br />
** Verweis auf Filelog oder DbLog falsch<br />
** Falsches gplot-File angegeben<br />
** Übergabe der Plotfunktion (bei DbLog) nicht korrekt<br />
** Falsche Groß-/Kleinschreibung verwendet (case sensitive)<br />
<!--<br />
* Ist der Inhalt des gplot-Files korrekt<br />
* Ist die Definition der Quelle korrekt (Filelog, DbLog oder LogProxy)?<br />
* Ist die Regexpr korrekt?<br />
--><br />
* Fehlermeldung ''isn't numeric in sprintf at ./FHEM/98_SVG.pm''<br />
** Dieses kommt grundsätzlich immer dann vor, wenn SVG versucht einen Wert einzulesen, der neben der Zahl auch die Einheit enthält. Dieses kann bei der Verwendung von DbLog vorkommen, weil DbLog nicht weiß, wie es Wert und Einheit trennen soll. Abhilfe schafft eine entsprechende Regular Expression, die nur den Zahlenwert liefert.<br />
<br />
== Weblinks ==<br />
* Beschreibung des Scripts [http://binarynature.blogspot.de/2013/03/measure-internet-connection-speed-from-linux-command-line.html binarynature.blogspot.de]<br />
* [https://pypi.python.org/pypi/speedtest-cli speedtest-cli auf pypi.python.org]<br />
* [https://github.com/sivel/speedtest-cli speedtest-cli auf github.com]<br />
* Forumseintrag über die Entwicklung des Moduls {{Link2Forum|Topic=13419|Message=83189|LinkText=Thema: Internetgeschwindigkeit überwachen}}<br />
* Forumseintrag darüber, dass das Binary nicht auf der Fritzbox läuft {{Link2Forum|Topic=27242|Message=201516|LinkText=Thema: Internetgeschwindigkeit - speedtest}}<br />
* Forumseintrag über aus der Idee wird ein Modul {{Link2Forum|Topic=13483|Message=83538|LinkText=Thema: Internetgeschwindigkeit überwachen}}<br />
* Forumsbeitrag zum Einsatz unter Windows {{Link2Forum|Topic= 111602|LinkText=Thema: Speedtest für windows}}<br />
<br />
== Sonstiges ==<br />
Besten Dank an wkarl, Puschel74, justme1968 für Idee, Modulerstellung/Pflege und Installationsanleitung.</div>Otto123http://wiki.fhem.de/w/index.php?title=FHEM_startet_nicht_-_Tipps_zur_Fehlersuche&diff=37498FHEM startet nicht - Tipps zur Fehlersuche2022-07-17T11:54:26Z<p>Otto123: /* Fehlernachrichten von FHEM bei dessen Start analysieren */ alte Version entfernt um Verwirrung zu vermeiden</p>
<hr />
<div>Es gibt einen weiteren Artikel zur Fehlersuche. [[Hilfe! Mein FHEM funktioniert nicht!]]<br />
<br />
'''Kein Zugriff auf FHEMWEB/FHEM startet nicht - Was kann ich tun?'''<br />
<br />
Deine [[FHEMWEB]]-Seite ist nicht erreichbar? Ist FHEM tot, oder ist das Netzwerk kaputt? Was kann ich machen, um zu prüfen, woran es genau liegt?<br />
<br />
In diesem Wiki-Artikel soll es darum gehen, wie Du für Dich prüfen kannst, ob ein Fehler bei FHEM, im Netzwerk oder ein anderes Problem vorliegt.<br />
== Prüfen: Läuft überhaupt ein FHEM-Prozess? ==<br />
Man kann sich unter einem Linuxsystem sämtliche laufende Prozesse auflisten lassen<br />
<br />
<code>ps ax</code><br />
<br />
Der Befehl ''ps'' listet je nach Argument alle laufende Prozesse auf. Die Liste kann man nun noch nach einem bestimmten Prozess filtern. Aufruf und Ausgabe einer Prozessliste mit einem Filter nach perl sieht z. B. so aus:<br />
<br />
<code>ps ax | grep perl</code><br />
<br />
<code>cooltux@fhem01-cluster:~> ps ax | grep perl</code><br />
<br />
<code>11320 pts/0 S+ 0:00 grep --color=auto perl</code><br />
<br />
Wie wir sehen, wird hier lediglich der gerade ausgeführte Befehl ''ps'' gefunden (weil das Wort ''perl'' in der Aufrufzeile stand. Es wird hier überhaupt kein Perl-Prozess gelistet. Aktuell läuft also definitiv kein FHEM, das ja ein Perl-Programm/Prozess ist.<br />
<br />
Eine Prozessliste mit einem laufenden FHEM-Prozess könnte so aussehen:<br />
<br />
<code>[11:31 root@fhem01-cluster cooltux] > ps ax | grep perl</code><br />
<br />
<code>15852 ? R 2119:09 /usr/bin/perl fhem.pl configDB</code><br />
<br />
<code>21447 pts/0 S+ 0:00 grep perl</code><br />
<br />
FHEM (''perl fhem.pl ...'') ist in diesem Fall also aktiv.<br />
<br />
=== systemd ===<br />
<br />
Nutzt das Linux-System den systemd, kann mit folgendem Befehl der Status des FHEM-Prozesses geprüft werden:<br />
<br />
<code>service fhem status</code><br />
<br />
Eine Ausgabe könnte z.B. so aussehen:<br />
<pre><br />
● fhem.service - FHEM Home Automation<br />
Loaded: loaded (/etc/systemd/system/fhem.service; enabled; vendor preset: enabled)<br />
Active: active (running) since Thu 2018-08-09 14:32:16 CEST; 20h ago<br />
Process: 27641 ExecStart=/usr/bin/perl fhem.pl fhem.cfg (code=exited, status=0/SUCCESS)<br />
Main PID: 27643 (perl)<br />
Tasks: 1 (limit: 4915)<br />
CGroup: /system.slice/fhem.service<br />
└─27643 /usr/bin/perl fhem.pl fhem.cfg<br />
<br />
Aug 09 14:32:16 fhem-host systemd[1]: Starting FHEM Home Automation...<br />
Aug 09 14:32:16 fhem-host systemd[1]: Started FHEM Home Automation.<br />
</pre><br />
<br />
== Prüfen: Ist der laufende FHEM-Prozess überlastet? ==<br />
Ich sollte mir anschauen, ob der FHEM-Prozess vielleicht zu sehr ausgelastet ist, der Prozess also 100 Prozent CPU Auslastung produziert?<br />
<br />
Ein weiterer Linuxbefehl ''top'' wird uns hierbei behilflich sein:<br />
<pre style="white-space: pre;"><br />
[11:38 root@fhem01-cluster cooltux] > top<br />
top - 11:38:18 up 11 days, 18:58, 1 user, load average: 1,07, 1,03, 1,00<br />
Tasks: 125 total, 2 running, 123 sleeping, 0 stopped, 0 zombie<br />
%Cpu(s): 24,9 us, 0,9 sy, 0,0 ni, 74,1 id, 0,0 wa, 0,0 hi, 0,1 si, 0,0 st<br />
KiB Mem: 945524 total, 833532 used, 111992 free, 41552 buffers<br />
KiB Swap: 102396 total, 46564 used, 55832 free. 496240 cached Mem<br />
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND<br />
15852 fhem 20 0 103652 82160 5068 R 100,0 8,7 2125:41 perl <br />
21683 root 20 0 5740 2560 2092 R 1,0 0,3 0:00.37 top <br />
19129 cooltux 20 0 86204 22348 3668 S 0,3 2,4 64:16.90 insync-portable <br />
21350 cooltux 20 0 11436 2848 2248 S 0,3 0,3 0:00.10 sshd <br />
1 root 20 0 23292 2368 1380 S 0,0 0,3 0:54.23 systemd <br />
2 root 20 0 0 0 0 S 0,0 0,0 0:01.09 kthreadd <br />
3 root 20 0 0 0 0 S 0,0 0,0 3:37.20 ksoftirqd/0 <br />
5 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kworker/0:0H <br />
7 root 20 0 0 0 0 S 0,0 0,0 8:20.71 rcu_sched <br />
8 root 20 0 0 0 0 S 0,0 0,0 0:00.00 rcu_bh <br />
9 root rt 0 0 0 0 S 0,0 0,0 0:05.45 migration/0<br />
</pre><br />
Hier können wir nun eindeutig erkennen, dass unser FHEM die CPU mit 100 Prozent auslastet. FHEM hat also ein Problem!<br />
<br />
Zum Vergleich ein FHEM/Perl-Prozess ohne Probleme:<br />
<pre style="white-space: pre;"><br />
[11:50 root@fhem01-cluster cooltux] > top<br />
top - 11:50:33 up 11 days, 19:10, 1 user, load average: 0,84, 1,03, 1,00<br />
Tasks: 133 total, 1 running, 132 sleeping, 0 stopped, 0 zombie<br />
%Cpu(s): 0,6 us, 0,8 sy, 0,0 ni, 98,6 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st<br />
KiB Mem: 945524 total, 818344 used, 127180 free, 43748 buffers<br />
KiB Swap: 102396 total, 46820 used, 55576 free. 489652 cached Mem<br />
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND<br />
22074 fhem 20 0 86424 68516 7200 S 1,3 7,2 0:47.64 perl<br />
22294 root 20 0 5740 2564 2092 R 1,3 0,3 0:00.19 top<br />
22296 fhem 20 0 86424 63556 2240 S 1,3 6,7 0:00.04 perl<br />
22297 fhem 20 0 2088 408 328 S 0,7 0,0 0:00.02 ping<br />
7 root 20 0 0 0 0 S 0,3 0,0 8:21.23 rcu_sched<br />
1366 mysql 20 0 620608 157132 5736 S 0,3 16,6 70:12.59 mysqld<br />
19481 root 20 0 0 0 0 S 0,3 0,0 0:02.35 kworker/3:0<br />
1 root 20 0 23292 2408 1420 S 0,0 0,3 0:54.27 systemd<br />
2 root 20 0 0 0 0 S 0,0 0,0 0:01.09 kthreadd<br />
3 root 20 0 0 0 0 S 0,0 0,0 3:37.42 ksoftirqd/0<br />
5 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kworker/0:0H<br />
</pre><br />
== Prüfen: Stimmen die Dateiberechtigungen? ==<br />
Alle Dateien im Verzeichnis /opt/fhem/ und allen Unterverzeichnissen gehören nach der Installation dem Benutzer fhem und der Gruppe dialout. Man kann es leicht prüfen:<br />
<code>ls -la /opt/fhem/</code><br />
<br />
Häufig wird der Eigentümer durch Manipulation der Dateien falsch gesetzt, mit diesem Befehl kann man alle Dateien auf den Eigentümer fhem und dessen primäre Gruppe setzen.<br />
<br />
<code>sudo chown -R fhem: /opt/fhem/</code><br />
<br />
Die Setup Routine setzt den Besitz auf fhem:dialout <code>sudo chown -R fhem:dialout /opt/fhem/</code><br />
<br />
== Und wenn sich gar nichts mehr tut? ==<br />
=== Die letzen Zeilen im existierenden FHEM Log anzeigen ===<br />
So lässt man sich auf Systemebene die letzen 20 Zeilen im Log anzeigen<syntaxhighlight lang="bash"><br />
tail -n 20 /opt/fhem/log/fhem-$(date '+%Y-%m').log<br />
</syntaxhighlight><br />
<br />
=== Fehlernachrichten von FHEM bei dessen Start analysieren ===<br />
In der Regel werden die Ausgaben von FHEM, auch die beim Start, gemeinsam mit vielen anderen Nachrichten in ein Logfile geschrieben. Dort kann natürlich nach Ursachen geforscht werden.<br />
<br />
Eine einfachere Auswertung wird möglich, wenn man diese Meldungen zeitweilig in einem Terminalfenster (das Ding, um Kommandozeilenbefehle einzugeben) angezeigt bekommt.<br />
<br />
Seit dem 01.08.2017 gibt es die Möglichkeit beim manuellen Starten von FHEM im Terminal den Schalter -d zu verwenden ({{Link2Forum|Topic=74774|Message=666766}}). Dieser startet FHEM mit den beiden gesetzten Attributen <code>attr global logfile -</code> und <code>attr global verbose 5</code> und gibt somit alle Meldungen im Terminalfenster aus. Zuerst mit ins FHEM Verzeichnis wechseln. Root oder sudo ist nicht erforderlich!<br />
<br />
Allerdings muss ein (mit 100 %) laufendes FHEM zunächst beendet werden! z.B.: <code>sudo systemctl stop fhem</code><br />
<br />
ins FHEM Verzeichnis wechseln: <code>cd /opt/fhem</code><br />
<br />
Je nach Konfiguration FHEM im debug Modus starten:<br />
<br />
fhem.cfg - Nutzer: <code>perl fhem.pl -d fhem.cfg</code><br />
<br />
configDB - Nutzer: <code>perl fhem.pl -d configDB</code><br />
<br />
Wenn man genug analysiert hat, FHEM mit Ctrl-C/Strg-C stoppen<br />
<br />
== Es ist nach dem letzten Update passiert? ==<br />
Beispielhaft für das Vorgehen wird das in diesem {{Link2Forum|Topic=118533|LinkText=Forumthread}} beschrieben. FHEM speichert vor dem Update die Dateien ins Verzeichnis restoreDir die aktualisiert werden. Es handelt sich dabei nicht um eine komplette Sicherung des Systems!<br />
<br />
Man kann sich über die gesicherten Versionen/Dateien einen Überblick verschaffen (Datum anpassen!):<br />
:<code>ls -lha /opt/fhem/restoreDir/update</code><br />
:<code>ls -lhaR /opt/fhem/restoreDir/update/2020-02-28</code><br />
<br />
Hat man die verursachende Datei ermittelt, kann man gezielt diese Datei wieder herstellen:<br />
:<code>sudo -su fhem cp /opt/fhem/restoreDir/update/2021-02-06/FHEM/NameDerDatei /opt/fhem/FHEM/</code><br />
Es gibt bei einigen Modulen Abhängigkeiten von anderen Dateien, es ist dringend angeraten, dann den kompletten zusammengehörigen Satz wieder herzustellen!<br />
<br />
Will man einen kompletten Schritt zurück vor dem Update gehen, weil man den Fehler nicht einkreisen kann, stellt man so alles vor dem Update wieder her. <br />
:<code>sudo -su fhem cp -R /opt/fhem/restoreDir/update/2021-02-05/* /opt/fhem/</code><br />
<br />
== Die config Datei ist das Problem? ==<br />
Bei jedem save wird in /opt/fhem/restoreDirs eine Sicherung der fhem.cfg und das Statefile fhem.save durchgeführt. <br />
<br />
Auf der Kommandozeile vom System kann man sich einen Überblick verschaffen:<br />
<br />
<code>ls -lha /opt/fhem/restoreDir/save</code><br />
<br />
Dort sollten Pfade mit Datums Angaben sein.<br />
<br />
Den exakten Zeitpunkt der gesicherten Dateien kann man sich so anzeigen lassen (Beispiel).<br />
<br />
<code>ls -lhaR /opt/fhem/restoreDir/save/2020-02-28</code><br />
<br />
Die "lastKnownGood" Konfiguration kann man so wiederherstellen und anschließend FHEM wieder starten:<br />
<br />
<code>sudo -su fhem cp -R /opt/fhem/restoreDir/save/2020-02-28/* /opt/fhem/</code><br />
<br />
Die Berechtigungen werden durch verwenden von User fhem eigentlich erhalten. <br />
<br />
Falls die Berechtigungen nicht stimmen:<br />
<br />
<code>sudo chown fhem: /opt/fhem/fhem.cfg</code><br />
<br />
<code>sudo chown fhem: /opt/fhem/log/fhem.save</code><br />
<br />
== Minimal Config starten ==<br />
Wenn gar nichts mehr geht, ist es manchmal ratsam eine minimal Konfiguration zu starten um die Hardware oder Netzwerkanbindung an sich zu testen.<br />
<br />
Wichtig ist zunächst sicher zu stellen, dass kein FHEM Prozess läuft (siehe oben)<syntaxhighlight lang="bash"><br />
cd /opt/fhem<br />
sudo perl fhem.pl fhem.cfg.demo<br />
<br />
</syntaxhighlight>Oder man holt sich die Original minimal fhem.cfg<syntaxhighlight lang="bash"><br />
cd /opt/fhem<br />
sudo -su fhem wget -qO minimal.cfg https://svn.fhem.de/fhem/trunk/fhem/fhem.cfg<br />
sudo perl fhem.pl minimal.cfg<br />
</syntaxhighlight><br />
<br />
Damit wäre es auch möglich ein [[Update]] zu machen oder Dateien wie im Update Wiki Artikel beschrieben direkt aus dem SVN zu holen.<br />
<br />
'''Hinweis:''' Es ist wichtig fhem.pl mit erhöhten Rechten zu starten, da sonst fhem.pl nicht auf den user fhem umschalten kann - das würde zu Rechte Problemen führen!<br />
<br />
Für configDB User gibt es den {{Link2Forum|Topic=86225|LinkText= rescue Modus}}.<br />
[[Kategorie:HOWTOS]]</div>Otto123http://wiki.fhem.de/w/index.php?title=E-Mail_senden&diff=37488E-Mail senden2022-07-04T10:54:30Z<p>Otto123: /* Synology DiskStation */ Hinweis Gmail APP Passwort</p>
<hr />
<div>Um aus FHEM heraus '''E-Mail senden''' zu können, sind abhängig von der verwendeten Platform unterschiedliche Vorgehensweisen erforderlich.<br />
{{Randnotiz|RNTyp=y|RNText=Anleitung zur Einrichtung von Exim4 auf Debian mit GMX als Smarthost:[[Media:Anleitung_Exim4_Debian_GMX.pdf|PDF]]}}<br />
== Linux ==<br />
=== FritzBox 7170 (non-chroot) oder "reine" Linuxe ===<br />
Datei 99_email.pm im Modul-Verzeichnis mit folgender Funktion anlegen (oder in bestehende 99_irgendwas.pm kopieren):<br />
<syntaxhighlight lang="perl"><br />
sub fb_mail {<br />
my $rcpt = $_[0];<br />
my $subject = $_[1];<br />
my $text = $_[2];<br />
system(&quot;/bin/echo \&quot;$text\&quot; | /usr/bin/mail send -i - -s \&quot;$subject\&quot; -t \&quot;$rcpt\&quot;&quot;);<br />
}<br />
</syntaxhighlight><br />
Aufruf dann mittels <br />
:<code>{ fb_mail('empfaenger@mail.de','Subject','text 123') }</code><br />
Darauf achten, dass der fhem-User Mails senden darf (in richtige Gruppe eintragen. Ggf. vorher einmal su fhem und probieren).<br />
<br />
=== Fritz!Box 7390 ===<br />
Auf der [[AVM Fritz!Box|FritzBox 7390]] ist diese Funktion seit 10/2012 Bestandteil der FHEM Standardauslieferung. Sie ist untergebracht in FritzBoxUtils.pm und heisst dort FB_mail($$$) (Groß-Kleinschreibung beachten).<br />
<br />
Da der Dateiname von FritzBoxUtils.pm nicht mit 99_ beginnt, wird diese Programmdatei nicht automatisch beim Start von FHEM geladen. FHEM muss zum Laden dieser Programmdatei aufgefordert werden. Dazu (z.&nbsp;B. in 99_myUtils.pm) die Zeile ''use FritzBoxUtils;'' einfügen.<br />
<br />
Mit dem Install von AVM.de wird fhem in einer chroot-Umgebung ausgeführt, die den Zugriff auf die Mailfunktion der Fritzbox nicht zulässt. Daher muss FHEM in der [http://fhem.de/fhem.html#Download Version von fhem.de] installiert sein. Sollte Ihre Fritzbox bisher mit dem install von AVM laufen, kann (nach einem backup!) das image von fhem.de einfach drüberinstalliert werden. Es sollten dabei alle Einstellungen erhalten bleiben.<br />
<br />
<syntaxhighlight lang="perl"><br />
sub fb_mail {<br />
my $rcpt = $_[0];<br />
my $subject = $_[1];<br />
my $text = $_[2];<br />
system(&quot;/bin/echo \&quot;$text\&quot; &gt; /var/tmp/fhem_nachricht.txt&quot;);<br />
system(&quot;/sbin/mailer send -i '/var/tmp/fhem_nachricht.txt' -s \&quot;$subject\&quot; -t \&quot;$rcpt\&quot;&quot;);<br />
system(&quot;rm /var/tmp/fhem_nachricht.txt&quot;);<br />
}<br />
</syntaxhighlight><br />
<br />
Aufruf dann mittels <br />
:<code>{ fb_mail('empfaenger@mail.de','Subject','text 123') }</code><br />
bzw. <br />
:<code>{ FB_mail('empfaenger@mail.de','Subject','text 123') }</code><br />
<br />
Dem Mailer können noch weitere Parameter hinzugefügt werden. Mehr dazu siehe: [http://www.wehavemorefun.de/fritzbox/Mailer Mailer]<br />
<br />
=== OpenWRT ===<br />
Die Anleitung wurde mit einer frühen Beta von Barrier Breaker (r391xx) mit einem TP_Lind WDR 4900 getestet. Da "sendEmail" nicht als Package vorliegt wird in dieser Anleitung "ssmtp" verwendet.<br />
Die Installation erfolgt mittels:<br />
<br />
<syntaxhighlight lang="bash"><br />
opkg update<br />
opkg install ssmtp_2.64-4_mpc85xx.ipk <br />
</syntaxhighlight><br />
<br />
Hierbei werden die Pakete libopenssl und zlib mit installiert. Damit ssmtp funktioniert müssen die Dateien /etc/ssmtp/ssmtp.conf und /etc/ssmtp/revaliases angepasst werden.<br />
<br />
/etc/ssmtp/ssmtp.conf <br />
<syntaxhighlight lang="text"><br />
root=arnold@gmx.net<br />
mailhub=mail.gmx.net:465<br />
rewriteDomain=gmx.net<br />
hostname=gmx.net<br />
FromLineOverride=YES<br />
UseTLS=YES<br />
#UseSTARTTLS=YES<br />
AuthUser=arnold@gmx.net<br />
AuthPass=Passwort_von_arnold@gmx.net<br />
</syntaxhighlight><br />
<br />
/etc/ssmtp/revaliases<br />
<syntaxhighlight lang="text"><br />
root:arnold@gmx.net:mail.gmx.net:465<br />
</syntaxhighlight><br />
<br />
In der [[99_myUtils_anlegen|99_myUtils]] folgende Unterroutine einfügen (von der RPi-Anleitung übernommen):<br />
<br />
<syntaxhighlight lang="perl"><br />
sub OpenWRTMail <br />
{ <br />
my $rcpt = shift;<br />
my $subject = shift; <br />
my $text = shift; <br />
my $ret = "";<br />
my $sender = "dockstar\@heye-tammo.de"; <br />
Log 1, "sendEmail RCP: $rcpt, Subject: $subject, Text: $text";<br />
$ret .= qx(echo -e 'to:$rcpt\n from:$sender\nsubject:$subject\n$text\n' | ssmtp $rcpt);<br />
$ret =~ s,[\r\n]*,,g; # remove CR from return-string <br />
Log 1, "sendEmail returned: $ret"; <br />
}<br />
</syntaxhighlight><br />
<br />
Ab hier den entsprechenden Abschnitt unter "Raspberry Pi" lesen.<br />
<br />
=== Synology DiskStation ===<br />
Beim DSM 3.2 gab es keinen <code>sendmail</code>-Befehl, sondern nur eine Funktion für den Versand der System-Benachrichtigungen. Interessanterweise funktionierte aber der <code>php-mail</code>-Befehl, so dass man mittels folgendem Modul Mails frei versenden kann:<br />
<syntaxhighlight lang="perl"><br />
sub sendmail($$$) {<br />
my($empf, $subj, $nachricht) = @_;<br />
system(&quot;php -r 'mail(\&quot;$empf\&quot;,\&quot;$subj\&quot;,\&quot;$nachricht\&quot;);'&quot;);<br />
undef;<br />
}<br />
</syntaxhighlight><br />
<br />
=== Raspberry Pi ===<br />
{{Randnotiz|RNTyp=o|RNText=In früheren Distributionen wurde das Paket sowie der Aufruf uU. mit großem "E" geschrieben: ''sendEmail''.}}Auf einem [[Raspberry Pi]] muß noch sendemail nachinstalliert werden. Diese Anleitung funktioniert ab der Stretch-Version von Raspbian bzw. '''Debian''' sowie unter '''Ubuntu''' seit ca. Version 16.04.<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get update<br />
sudo apt-get install sendemail libio-socket-ssl-perl libnet-ssleay-perl perl<br />
</syntaxhighlight><br />
<br />
Man kann die korrekte Funktion im Terminal (ohne <code>{qx()}</code> ) oder auch in der FHEM Kommandozeile testen (Hinweis: manche Provider (z.B. gmail) lassen diesen Zugang erst nach Freischaltung zu!).<br />
<syntaxhighlight lang="perl"><br />
{qx(sendemail -f 'Ab\@send.er' -t 'Emp\@faeng.er' -u 'subject' -m 'text' -a 'DateinameOderLeer' -s 'smtpFQDN:port' -xu 'MailUser' -xp 'PasswortOhneKlammeraffen')}<br />
</syntaxhighlight><br />
<br />
{{Hinweis|Bei Gmail muss seit dem 30.6.2022 ein separates Passwort erzeugt werden, die alte Einstellung über "Zugriff durch weniger sichere Apps" funktioniert nicht mehr. Siehe Support Seite Google: https://support.google.com/accounts/answer/185833}}<br />
<br />
Beispiel mit Gmail über Linux Terminalfenster:<br />
<syntaxhighlight lang="perl"><br />
sendemail -f 'Der.Absender@gmail.com' -t 'Der.Empfaenger@gmail.com' -u 'subject' -m 'text' -a '' -s 'smtp.gmail.com:587' -xu 'Der.Absender' -xp DASSUPERGEHEIMEPASSW0RT<br />
</syntaxhighlight><br />
<br />
In der [[99_myUtils_anlegen|99_myUtils]] folgende Unterroutine einfügen:<br />
<syntaxhighlight lang="perl"><br />
######## DebianMail Mail auf dem RPi versenden ############ <br />
# $provider für SMTP Server anpassen. <br />
# Einmal in der FHEM Kommandozeile, user und password anpassen:<br />
# {setKeyValue("myEmailKonto",'user@domain');;setKeyValue("myEmailPasswrd",'password')}<br />
sub DebianMail <br />
{ <br />
my $rcpt = shift;<br />
my $subject = shift; <br />
my $text = shift; <br />
my $attach = shift; <br />
my $ret = "";<br />
my $error;<br />
my $konto = getKeyValue("myEmailKonto"); <br />
my $passwrd = getKeyValue("myEmailPasswrd"); <br />
my $from = $konto; # or use different KeyValue if konto is not the from email address<br />
my $provider = "smtp.1und1.de"; # smtp.domain.tld:port see provider documentation<br />
#Log 1, "sendEmail RCP: $rcpt";<br />
#Log 1, "sendEmail Subject: $subject";<br />
#Log 1, "sendEmail Text: $text";<br />
#Log 1, "sendEmail Anhang: $attach";<br />
if (not defined($attach)){$attach=''}<br />
$ret .= qx(sendemail -f '$from' -t '$rcpt' -u '$subject' -m '$text' -a '$attach' -s '$provider' -xu '$konto' -xp '$passwrd' -o tls=auto -o message-charset=utf-8);<br />
$ret =~ s,[\r\n]*,,g; # remove CR from return-string <br />
Log 1, "sendemail returned: $ret"; <br />
}<br />
###############################################################################<br />
</syntaxhighlight><br />
<br />
Die Zugangsdaten für den Email-Account müssen dabei FHEM-intern gespeichert werden. Dazu gibt man einmalig über die Kommandozeile folgendes ein (user@domain und password müssen auf den Email Account geändert werden):<br />
:<code><nowiki> {setKeyValue("myEmailKonto",'user@domain');;setKeyValue("myEmailPasswrd",'password')}</nowiki></code><br />
<br />
Um die TLS Verschlüsselung (ehem. SSL) nicht zu nutzen, muss in der viertletzten Zeile tls=no verwendet und der Port des Mailproviders auf 25 eigetragen werden. Sollte anschließend keine Mail verschickt werden, siehe Probleme.<br />
<br />
Falls der Body-Text in einem (Android-)Mailer auf dem Handy nicht gezeigt wird, kann der Parameter '''-o message-content-type=html''' helfen.<br />
<br />
Die Funktion kann beispielsweise folgendermaßen aufgerufen werden:<br />
{{Randnotiz|RNTyp=g|RNText=Bei allen Feldern können generell doppelte " oder einfache ' Anführungszeichen verwendet werden. Innerhalb von "" müssen Sonderzeichen wie @ aber maskiert werden, da sie sonst als Steuerzeichen interpretiert werden:<br />
:<code><nowiki>"email\@email.domain" oder 'email@email.domain'</nowiki></code><br />
}}<br />
Direkt in der FHEM Kommandozeile (ohne Anhang)<br />
:<code><nowiki>{DebianMail("email\@email.domain","Subject","Text")}</nowiki></code><br />
Die ordnungsgemäße Ausführung wird mit 71 quittiert.<br />
Oder im notify mit mehreren Anhängen<br />
:<code><nowiki>define Sonstiges notify Fenster:Window:.*,.*Low.Batt*. {\ DebianMail("email\@email.domain","Subject","Text","'Anhang1' 'Anhang2' ...");;\ }</nowiki></code><br />
<br />
oder (mehr als einen Empfänger, diese können durch Leerzeichen, Semikolon oder Komma getrennt sein)<br />
<br />
<syntaxhighlight lang="text"><br />
define Sonstiges at *01:00:00 {\<br />
DebianMail('email@email.domain,email2@email.domain',"Subject","Text","'Anhang1' 'Anhang2' ...");;\<br />
}<br />
</syntaxhighlight><br />
{{Randnotiz|RNTyp=y|RNText=Eine erweiterte - nicht blockierende - Version des Scripts ist [[SSCAM_-_Steuerung_von_Kameras_in_Synology_Surveillance_Station#Mail mit Snapshot im Anhang und Aufnahmelink versenden (sendEmail)|hier]] zu finden}}<br />
Es ist wichtig, die Dateinamen mit ' ' zu klammern, da hierdurch auch Leerzeichen im Pfad/Dateinamen möglich sind.<br />
<br />
=== BeagleBoard-xM ===<br />
Auf einem [[:Kategorie:BeagleBoard-xM|BeagleBoard-xM]] mit einem [http://en.opensuse.org/HCL:BeagleBoard-xM OpenSUSE 12.2] kann man ebenfalls das Perl-Programm ''sendEmail'' wie beim RPi nutzen. Dies gibt es aber nicht in den Repositories von openSUSE, sondern man muss sich ''sendEmail'' als Source herunterladen. Das geht am einfachsten per ''wget'', welches man ebenfalls erst installieren muss (aber aus einem Repository).<br />
<syntaxhighlight lang="bash"><br />
$ zypper in wget<br />
$ cd /opt<br />
$ wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz<br />
$ tar xvfz sendEmail-v1.56.tar.gz<br />
$ cd sendEmail-v1.56<br />
$ cp sendMail /usr/local/bin<br />
</syntaxhighlight><br />
Dann geht man weiter vor wie unter RPi beschrieben (anlegen der SUB-Routine in 99_myUtils usw.).<br />
<br />
'''Hinweis:''' Die Version 1.56 von ''sendEmail'' ist Stand Januar 2013 die aktuelle. Da diese Programmversion von 2009 stammt, ist mit neuen Versionen selten zu rechnen. Vielleicht schauen Sie trotzdem vorher auf der [http://caspian.dotconf.net/menu/Software/SendEmail/ Homepage von sendEmail] nach.<br />
<br />
== Windows ==<br />
# Kopiere die Datei sendEmail.exe* in Dein FHEM Verzeichnis (hier c:\fhem-5.0\); Quelle: [http://caspian.dotconf.net/menu/Software/SendEmail/ Homepage von sendEmail]<br />
# Erstelle im FHEM Verzeichnis die Datei wmail.bat mit folgendem Inhalt (eine Zeile):<br />
:<code>sendEmail -f absender@domain.de -u "%1" -m " " -s SMTP-SERVERAdresse -xu SMTP_USERNAME -xp SMTP_PASSWORT -t empfänger@domain.de -o message-header="X-Message-Flag: FHEM"</code><br />
# Beispiel fhem.cfg<br />
## Mail wenn sich der Status von Heizung.* oder Hzg.* ändert <br><code>define Mail_Heizung notify Heizung.*|Hzg.* { system("wmail $NAME:$EVENT")}</code><br />
## Mail bei Signal Aussentemperatur (für dieses Beispiel wird [http://fhem.de/commandref.html#getstate http://fhem.de/commandref.html#getstate getstate] benötigt) <br><code>define Mail_Aussentemperatur notify Aussentemperatur {\</code><br><code>my ($val);;\</code><br><code>$val = fhem "getstate $NAME";;\</code><br><code>system("wmail \"$NAME: $val\"");;\</code><br><code>}</code><br />
<br />
== Probleme ==<br />
=== sendEmail / sendemail (Schreibweise alt / neu ) ===<br />
Erhält man Fehler bez. TLS (''ERROR => TLS setup failed: SSL connect attempt failed error: ...'' ), sind eventuell die ca-certificates veraltet oder nicht installiert. Prüfung:<br />
:<code>apt-cache policy ca-certificates</code><br />
Falls man keine E-Mails verschicken kann, kann man in einem ersten Test prüfen, ob sendEmail als solches funktioniert und die Konfiguration (Benutzer, Passwort, Server-Name usw.) des Mail-Kontos, über das die Mails abgesetzt werden sollen, richtig ist.<br />
<br />
Hierzu setzt man in der FHEM-Befehlszeile die folgende Anweisung ab:<br />
:<code>{ SUB-Routinen-Name('EMailAdresse@Mail.Domain','Test','Test-Text');; }</code><br />
und ersetzt ''SUB-Routinen-Name'' durch den Namen der in 99_myUtils erzeugten Prozedur. Statt ''EMailAdresse@Mail.Domain'' trägt man noch eine gültige E-Mail-Adresse ein und bestätigt den Befehl dann mittels &lt;Enter&gt; (nicht "save"). Empfangen Sie nicht kurzfristig eine entsprechende E-Mail, ist sehr wahrscheinlich an den Zugangsdaten etwas verkehrt. <br />
<br />
Vor dem testen der Routine oben kann sendEmail auch über die Konsole (z.&nbsp;B. via ssh) getestet werden:<br />
:<code>sendEmail -vv -f 'Absender@AbsDomain.de' -t 'Empfänger@EmpfDomain.de' -u 'subject' -m 'body' -s 'smtp.AbsDomain.de' -xu 'AbsenderBenutzername' -xp 'AbsenderPasswort' -o tls=yes</code><br />
<br />
=== Keine Mail mit TLS Verschlüsselung ===<br />
{{Randnotiz|RNTyp=y|RNText=Diese Information trifft nur auf alte Systeme zu, aktuell (2021) befindet sich in Zeile 1933 der korrekte Code}}<br />
Prüfung mit <code>grep -n SSLv /usr/bin/sendEmail</code><br />
<br />
Den Test über die Konsole durchführen. Erhält man folgende Fehlermeldung:<br />
''invalid SSL_version specified at /usr/share/perl5/IO/Socket/SSL.pm line 332''<br />
muss auf dem Raspberry folgende Datei angepasst werden: ''/usr/bin/sendEmail''.<br />
In Zeile 1907 muss<br />
if (! IO::Socket::SSL->start_SSL($SERVER, SSL_version => 'SSLv3 TLSv1')) {<br />
<br />
in folgendes geändert werden<br />
if (! IO::Socket::SSL->start_SSL($SERVER, SSL_version => 'SSLv23:!SSLv2')) {<br />
<br />
Der frühere Tipp, direkt in der SSL.pm Datei zu editieren, führt zu Problemen, wenn man auf FHEM per HTTPS zugreifen will und ist daher nicht zu empfehlen.<br />
<br />
=== Email laut Log gesendet aber nicht angekommen? ===<br />
Dann bitte in der Fritzbox Oberfläche überpüfen, ob unter "System" -> "Push Service" selbiger eingerichtet und aktiviert wurde. <br />
<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:FritzBox]]<br />
[[Kategorie:BeagleBoard-xM]]<br />
[[Kategorie:Raspberry Pi]]<br />
[[Kategorie:E-Mail]]</div>Otto123http://wiki.fhem.de/w/index.php?title=MQTT2-Module_-_Praxisbeispiele&diff=37397MQTT2-Module - Praxisbeispiele2022-04-09T11:36:25Z<p>Otto123: /* Verwendung des Docker Containers */ Link zur Original Doku eingefügt</p>
<hr />
<div>== Einführung: MQTT bzw. MQTT2 in FHEM ==<br />
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT verwenden, beachten Sie bitte, dass der MQTT2_CLIENT die ursprüngliche Herkunft der über MQTT verteilten Informationen nicht kennt. Daher ergeben sich in der Anwendung kleinere Unterschiede, zu deren Verständnis die diesbezüglichen [[MQTT2_CLIENT#Anwendung|Hinweise zu MQTT2_CLIENT]] bekannt sein sollten.}}Zur Einbindung von Geräten, welche zur Nutzung des MQTT-Protokols konfiguriert werden können und darüber mit einem MQTT-Server (früher: Broker) kommunizieren, stehen unter FHEM verschiedene Optionen zur Verfügung, wobei nicht alle Module beliebig miteinander verwendet werden können. Details hierzu sind dieser [[MQTT|Übersicht]] zu entnehmen. <br />
<br />
Im Rahmen dieses Artikels wird für die eigentlichen Geräte [[MQTT2 DEVICE|MQTT2_DEVICE]] verwendet, damit wird als IO-Device entweder {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} oder [[MQTT2 CLIENT|MQTT2_CLIENT]] benötigt, mit einem IO-Device des Typs [[MQTT (Modul)|MQTT]] funktioniert die nachfolgende Darstellung dagegen nicht<ref>Allerdings können die Konfigurationen in der Regel recht einfach auf die bisherige MQTT-Implementierung übertragen werden</ref>. MQTT2_DEVICE unterstützt u.a. auch die ''setExtensions'' direkt, also z.B. ''on-for-timer<ref>Beachten Sie bei mehrkanaligen Geräten, dass jeweils nur ein Hauptkanal mittels setExtensions verwaltet werden kann! U.a. aus diesen Grund ist es meist sinnvoller, die ''split''-Varianten der attrTemplate-Einrichtung zu verwenden.</ref>'' sowie ''[[MQTT2-Module - Praxisbeispiele#attrTemplate_2|attrTemplate]]''<ref>Auch MQTT_DEVICE unterstützt SetExtensions, allerdings muss dies dort per Attribut eingeschaltet werden</ref>.<br />
<br />
=== Allgemeine Einstellungen und Hinweise ===<br />
{{Randnotiz|RNTyp=r|RNText=Beachten Sie, dass für [[autocreate]] in Verbindung mit MQTT2_SERVER '''zwingend''' jeder über MQTT kommunizierende Client eine ClientID angeben muss. Passen Sie daher ggf. die Einstellungen Ihres Geräts an. Manche Geräte verwenden auch "Wegwerf"-ClientID's. Für diese empfiehlt es sich, ggf. dann die durch autocreate erstellten Geräte nachzubearbeiten und die ClientID-Angabe v.a. aus den Inhalten des readingList-Attributs zu entfernen.}}Die nachfolgenden Beispiele gelingen am einfachsten mit '''MQTT2_SERVER als Server ("Broker")''', für diesen sollte dabei ''autocreate'' '''nicht deaktiviert''' sein, damit die erforderlichen MQTT2_DEVICES soweit möglich automatisiert erstellt werden<ref>Dabei wird vorausgesetzt, dass ein allgemeines {{Link2CmdRef|Anker=autocreate|Lang=en|Label=autocreate}}-Device (''TYPE=autocreate'') ebenfalls aktiv ist.</ref> . <br />
<br />
Beispiel<ref>MQTT2_SERVER verwendet als default-Einstellung für ''autocreate'' ''simple'', ohne dass ein entsprechendes Attribut gesetzt werden müsste. Die Einstellung ''complex'' empfiehlt sich in der Regel nicht; diese ist jedoch dann zu empfehlen, wenn das Device entweder verschachtelte JSON-Array-Strukturen liefert oder bestimmte Readings nicht gefüllt werden sollen.</ref>:<br />
define MQTT2_FHEM_Server MQTT2_SERVER 1883 global<br />
<br />
Falls der MQTT Broker mit Hilfe von [[allowed]] abgesichert wurde, muss in den Geräten ebenfalls User bzw. Passwort eingetragen werden, damit eine MQTT Kommunikation möglich ist.<br />
<br />
{{Hinweis|Die Code-Darstellung in diesem Beitrag entspricht jeweils dem RAW-Format zum [[Import von Code Snippets]]. Wer die Attribute direkt und einzeln bearbeitet, muss ggf. die "\" entfernen!}}<br />
<br />
=== MQTT-Einstellungen in den Geräten ===<br />
Die Beispiele gehen davon aus, dass die einzubindenden Geräte '''''mit den default-Einstellungen''''' für MQTT betrieben werden, wenn man von den Angaben zum Server und ggf. der Gerätekennung absieht. Es sollten also insbesondere '''keine Veränderungen der topic-Pfade''' vorgenommen werden.<br />
<br />
{{Hinweis|Einige der hier beschriebenen Einstellungen haben Änderungen der sich durch die jeweiligen Automatismen eigentlich jeweils ergebenden Standard-Werte zur Folge, insbesondere, was Reading-Namen und von den Geräten gesendete Werte angeht. Sie sollten daher zunächst die Konfiguration des jeweiligen MQTT2-DEVICE-Geräts abschließen, und erst anschließend die weitere Integration mit Event-Handlern, logging usw. vornehmen. }}<br />
<br />
=== auto-Konfigurations-features ===<br />
Viele firmwares und Dienste bieten Möglichkeiten an, einer Controller-Software (insbesondere homeassistant) Hilfsdaten zur automatisierten Konfiguration bereitzustellen. Da FHEM diese Daten nicht zu ihrem ursprünglichen Zweck verwenden kann, werden hierdurch lediglich zusätzliche Readings erzeugt, mit denen man als User in der Regel wenig anfangen kann. Es wird daher empfohlen, derartige features '''abzuschalten'''. Wo dies nicht möglich ist, sollte man eine passende [[MQTT2_CLIENT#ignoreRegexp|ignoreRegexp]] setzen bzw. diese passend erweitern!<br />
<br />
=== Schritt für Schritt ===<br />
Hier werden in der Regel fertige Konfigurationen für häufige Anwendungsfälle (beispielhaft) dargestellt. In [[MQTT2_DEVICE - Schritt für Schritt]] ist etwas mehr über die Vorgehensweise bei der Zusammenstellung der verschiedenen Attribute und deren Zusammenwirken zu erfahren.<br />
<br />
== zigbee2mqtt ==<br />
[[Bild:MQTT2_zigbee2mqtt_Bulbs.png|400px|thumb|Darstellung in FHEMWEB]]<br />
[https://www.zigbee2mqtt.io zigbee2mqtt] ist ein open-source Projekt, mit dem zigbee-Geräte über MQTT direkt angesprochen werden können, ohne dass hierfür eine Bridge eines Herstellers benötigt wird.<br />
<br />
Einzelheiten zur Vorgehensweise sind auf der Detailseite [[Zigbee2mqtt|zigbee2mqtt]] zu finden.<br />
<br />
== Tasmota ==<br />
{{Randnotiz|RNTyp=r|RNText=Bitte beachten Sie, dass versicherungsrechtliche Probleme entstehen können, wenn die herstellereigene Firmware ersetzt wird!}}[https://github.com/arendst/Sonoff-Tasmota Tasmota] ('''T'''heo '''A'''rends '''S'''onoff '''M'''QTT '''O'''ver '''T'''he '''A'''ir - einer offenen Firmware von [https://github.com/arendst arendst]) ist eine open-source Software für ESP8266-Geräte, die z.B. statt der originalen Firmware für Sonoff-Geräte und andere ESP8266-basierte WLAN-Steckdosen usw. verwendet werden kann. <br />
{{Hinweis|[[Datei:Tasmota mqtt config.png|120px|thumb|right]]Vor allem, aber nicht nur bei Verwendung des MQTT2_CLIENT als IO, ist es empfehlenswert, in der MQTT-Konfiguration der tasmota-Geräte für den Parameter ''<nowiki>topic = %topic% (tasmota)</nowiki>'' ebenfalls die dynamisch aus der Chip-ID erzeugte Kennung ''DVES_%06X'' zu verwenden. (Kopieren Sie einfach diese Zeichenkette aus dem Eingabefeld für ''"client ..."'', siehe nebenstehende Abbildung). Die eigentliche Umbenennung zu einem "sprechenden Namen" kann dann innerhalb von FHEM - mittels ''rename'' oder ggf. mit einem ''alias'' - erfolgen.}}<br />
=== MQTT2_DEVICE ===<br />
Dieses sollte bei aktiviertem ''autocreate'' am MQTT2_SERVER-Device automatisch angelegt werden, sobald das betreffende Gerät eingesteckt oder neu gestartet oder an einem evtl. vorhandenen Taster geschalten wird. Bislang wurden Tasmota version(en) ab 6.1.1 bis min. 8.1.0 getestet, dies auf verschiedener Hardware, zunächst mit Sonoff Touch und S20, zwischenzeitlich mit einer Vielzahl von Geräten, die per USB-Adapter oder mit der Methode aus dem [https://www.heise.de/ct/artikel/Tuya-Convert-IoT-Geraete-ohne-Loeten-vom-Cloud-Zwang-befreien-4283623.html Tuya-Convert]-Projekt des heise-Verlags auf Tasmota umgeflasht wurden.<br />
<br />
=== Manuelle Anpassungen - Schalter ===<br />
Die RAW-Definition kann dann beispielsweise wie folgt ergänzt werden: <br />
<syntaxhighlight lang="perl"><br />
defmod MQTT2_DVES_9B01BD MQTT2_DEVICE DVES_9B01BD<br />
attr MQTT2_DVES_9B01BD IODev m2server<br />
attr MQTT2_DVES_9B01BD devStateIcon on:FS20.on:off off:FS20.off:on<br />
attr MQTT2_DVES_9B01BD readingList DVES_9B01BD:tele/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:tele/DVES_9B01BD/LWT:.* LWT\<br />
DVES_9B01BD:tele/DVES_9B01BD/UPTIME:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:tele/DVES_9B01BD/SENSOR:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:tele/DVES_9B01BD/INFO1:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:tele/DVES_9B01BD/INFO2:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:tele/DVES_9B01BD/INFO3:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:stat/DVES_9B01BD/RESULT:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:stat/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }<br />
attr MQTT2_DVES_9B01BD room MQTT2_DEVICE<br />
attr MQTT2_DVES_9B01BD setList on cmnd/DVES_9B01BD/POWER on\<br />
off cmnd/DVES_9B01BD/POWER off\<br />
reboot cmnd/DVES_9B01BD/Restart 1<br />
attr MQTT2_DVES_9B01BD webCmd on:off:reboot<br />
</syntaxhighlight><br />
<br />
=== Manuelle Anpassungen - Dimmer ===<br />
{{Randnotiz|RNTyp=r|RNText=Dieses Beispiel ist nur bedingt zur Nachahmung zu empfehlen: Prinzipiell kann man Readings und setter in MQTT2_DEVICE fast nach Belieben benennen. Wählt man allerdings <i>FHEM-typische</i> Namen, kann dies sehr zur Vereinfachung beitragen. Z.B. wird eine Sprachssteuerung bei einem Dimmer üblicherweise automatisch korrekt eingestellt werden, wenn der für die Helligkeit zuständige setter z.B. <i>pct</i> (oder <i>brightness</i>) heißt, oder eine abzufragende Temperatur <i>temperature</i>. Entsprechendes gilt im Rahmen von <i>devspec-Abfragen</i>.}}Bei einem Dimmer sind einige zusätzliche Anpassungen vorzunehmen. Ein Dimmer wird über '''POWER''' geschaltet und über '''Dimmer''' gedimmt. Damit das funktioniert, müssen ein stateFormat und devStateIcon zusammenarbeiten:<br />
<syntaxhighlight lang="perl"><br />
attr MQTT2_DVES_2DF34D devStateIcon 10\d.*:dim100%@orange:off 1\d.*:dim12%@orange:off 2\d.*:dim18%@orange:off 3\d.*:dim31%@orange:off 4\d.*:dim43%@orange:off 5\d.*:dim50%@orange:off 6\d.*:dim62%@orange:off 7\d.*:dim68%@orange:off 8\d.*:dim81%@orange:off 9\d.*:dim93%@orange:off 0:FS20.off:on .*:FS20.off@orange:off<br />
attr MQTT2_DVES_2DF34D stateFormat {if(ReadingsVal($name,"POWER",0)eq"off"){0}else{ReadingsVal($name,"Dimmer",0)}}<br />
</syntaxhighlight><br />
Nun kann man über das Icon ein- und ausschalten und der Zustand des Dimmers wird korrekt angezeigt.<br />
<br />
Es fehlt noch ein Slider, um auch dimmen zu können. Zusätzlich muss setList noch um Dimmer erweitert werden:<br />
<syntaxhighlight lang="text"><br />
attr MQTT2_DVES_2DF34D setList on cmnd/dimmer/POWER on\<br />
off cmnd/dimmer/POWER off\<br />
Dimmer cmnd/dimmer/Dimmer<br />
attr MQTT2_DVES_2DF34D webCmd Dimmer<br />
attr MQTT2_DVES_2DF34D widgetOverride Dimmer:slider,0,1,100<br />
</syntaxhighlight><br />
<br />
=== attrTemplate ===<br />
===== Allgemeines =====<br />
Für gängige Tasmota-Geräte stehen ''templates'' bereit, mit denen sich diese schnell konfigurieren lassen. <br />
Beachten Sie dazu den Abschnitt ''attrTemplate'' in [[MQTT2 DEVICE#attrTemplate|MQTT2_DEVICE]]. Bei Anwendung eines template mit "split" im Namen werden dabei weitere Geräte angelegt und konfiguriert.{{Hinweis|Bitte attrTemplates nicht verwechseln mit templates, die auf den Tasmota- bzw. Blackadder-Seiten angeboten werden, welche zur Konfiguration der firmware genutzt werden können! Es sollte zunächst die firmware korrekt eingerichtet werden, so dass das Gerät selbst direkt auf dessen Web-Interface korrekt bedient werden kann.}}<br />
<br />
===== Kein passendes attrTemplate vorhanden? =====<br />
Exisitert (noch) kein passendes attrTemplate, ist zu empfehlen, zunächst das "''tasmota_basic''" anzuwenden. Dieses führt einige Basiskonfigurationen durch, die für FHEM hilfreich sind, z.B. wird die firmware so eingestellt, dass Schaltzustände in Kleinschreibung übermittelt werden, statt der defaults "ON" bzw. "OFF".<br />
<br />
Allerdings stellt dieses das ''autocreate'' an dem MQTT2_DEVICE auf 0, was dann nicht optimal ist, wenn man weitere Readings aus dem Gerät erwartet, etwa, weil zusätzliche Sensoren vorhanden sind. In diesem Fall empfiehlt es sich, das ''autocreate''-Attribut an dem MQTT2_DEVICE zu löschen, damit alle weiteren Informationen verarbeitet werden und ggf. im ''jsonMap''-Attribut nur die Angabe "''POWER1:state''" zu belassen.<br />
<br />
=== on-for-timer ===<br />
Um z.B. ein Relais nur für einen Zeitraum anzuschalten, kann man bei Tasmota-Geräten zwischen mehrere Varianten wählen. Ohne speziellen ''setter'' in der ''setList'' werden die '''SetExtensions''' verwendet. Timer laufen damit innerhalb FHEM. Da diese intern als temporäres [[at]] ausgeführt werden, sind diese auch noch nach einem FHEM-Neustart vorhanden, sofern FHEM ordnungsgemäß beendet und neu gestartet wird.<br />
<br />
Die Tasmota-firmware bietet ergänzend dazu zwei Möglichkeiten an, bei denen der Timer direkt auf dem ESP-Microcontroller verwaltet wird:<br />
<br />
==== delay ==== <br />
Zeile zur Erweiterung der ''setList'' (Attributeingabe via FHEMWEB!):<br />
on-for-timer {my $duration = $EVTPART1*10; 'cmnd/DVES_575127/Backlog POWER1 1; delay '.$duration.'; POWER1 0'}<br />
<br />
Ohne Auswirkungen auf alles, was danach kommt, hat aber den Nachteil, dass die möglichen Zeitspannen auf 3600 1/10 Sekunden begrenzt sind (siehe [https://tasmota.github.io/docs/Commands/#delay Commands - Tasmota Delay]), also 6 Minuten.<br />
<br />
====pulseTime ====<br />
Zeile zur Erweiterung der ''setList'' (s.o.):<br />
on-for-timer {my $duration = $EVTPART1 < 11.2 ? $EVTPART1*10 : $EVTPART1+100; 'CMNDTOPIC/Backlog pulseTime1 '.$duration.'; POWER1 1'}<br />
Auch hier sind die möglichen längsten Einschaltdauern begrenzt, allerdings ist diese mit 18h deutlich länger als mit ''delay''. Diese Implementierung hat den Nachteil, dass der ESP-Microcontroller die jeweils letzte pulseTime auch für alle weiteren "normalen" Einschaltvorgänge berücksichtigt, das Relais also ebenfalls nach Ablauf der übermittelten pulseTime abgeschaltet wird; dies gilt allerdings ohne explizites ''save'' nur bis zum nächsten reboot des Microcontrollers.<br />
<br />
Da nach dem ersten pulseTime setzten, diese immer benutzt wird, kann man mit einem kleine Workaround das Device normal arbeiten lassen. Dafür wird bei jedem anderem Befehl, aus der PulseTime, der Timer deaktiviert.<br />
Hierfür machen wir uns zu nutzen, dass man mehrere Befehle gleichzeitig an Tasmota senden kann (backlog). Ob diese Lösung auch mit anderen MQTT Firmwares funktioniert, kann ich nicht sagen. Es wurde lediglich mit Tasmota getestet.<br />
Wir senden also, bevor wir den eigentlich Tasmota Befehl zum Ein- oder Ausschalten schicken, einen Befehl zum deaktivieren des Timers: "pulseTime 0"<br />
Hier ein Beispiel: (das entsprechende device "DEV_611F3E" muss gegen das eigene ersetzt werden)<br />
off:noArg cmnd/DVES_611F3E/backlog pulseTime 0; POWER1 0<br />
on:noArg cmnd/DVES_611F3E/backlog pulseTime 0; POWER1 1 <br />
toggle:noArg cmnd/DVES_611F3E/backlog pulseTime 0; POWER1 2<br />
<br />
=== zigbee2tasmota ===<br />
[https://tasmota.github.io/docs/Zigbee/ zigbee2tasmota] ist eine Erweiterung der Tasmota-firmware für Microcontroller, insbesondere dem ESP8266 (und ESP32)(link), über die einige ZigBee-Chipsätze (insbesondere TI CC2530) als [[ZigBee#Koordinator_.28ZigBee_coordinator.2C_ZC.29|Coordinator]] eingebunden werden können, um ein ZigBee-Netzwerk aufzubauen.<br />
{{Hinweis|Stand 08/2020 war die Einbindung anderer Chipsätze erst in einem Alpha-Stadium; die Zahl der über einen CC2530 einbindbaren ZigBee-Geräte ist daher derzeit relativ begrenzt (ca. 16)!}}<br />
Auch für diese Lösung stehen einige ''attrTemplate'' zur Verfügung. Nähere Informationen hierzu sind dem Artikel [[Zigbee2Tasmota-MQTT]] zu entnehmen.<br />
<br />
== ESPurna ==<br />
ESPurna ist eine weitere alternative firmware für ESP8266-basierte Geräte, Details sind der [https://github.com/xoseperez/espurna/wiki Projektseite] zu entnehmen.<br />
<br />
Das Format, in dem ESPurna Daten sendet, unterscheidet sich v.a. darin, dass bool'sche Werte als 0 oder 1 gesendet werden, und nicht wie sonst üblich als "on" oder "off" oä.. Es stehen einige Mustertemplates zur Verfügung, um diese Art der Payload in FHEM-konforme Werte zu überführen.<br />
<br />
== Shelly ==<br />
=== Vorbemerkung ===<br />
Auch für Shelly-Geräte steht eine Auswahl an [[MQTT2-Module - Praxisbeispiele#attrTemplate_2|templates]] bereit.<br />
Beachten Sie auch hier, dass uU. bei Anwendung eines template mit "split" im Namen weitere Geräte angelegt und konfiguriert werden.<br />
<br />
Standardmäßig senden die Shelly-Geräte ihren kompletten Status alle 30 Sekunden. Dies kann man über den Parameter ''mqtt_update_period'' in den ''settings'' ändern, allerdings ist dieser nur über die HTTP-Schnittstelle des Shelly verfügbar. Um diese Statusupdates abzustellen, kann über den Browser folgender Befehl verwendet werden:<br />
http://<ip-des-shelly>/settings?mqtt_update_period=0, <br />
Soweit bekannt, werden dann nur statische updates ausgeschaltet, z.B. für das Relay bzw. angeschlossene Taster oder Schalter; insbesondere Verbrauchswerte werden dennoch aktualisiert.<br />
<br />
=== Shelly1 ===<br />
<br />
=== Shellybulb ===<br />
Zunächst muss man einen Statusupdate des Shellybulb erzwingen (Aus- und Einschalten, physikalisch oder per Web-UI), damit das Gerät bei eingeschaltetem autocreate angelegt wird. Dies sieht zunächst so aus:<br />
Internals:<br />
CFGFN <br />
CID shellybulb_3CC533<br />
DEF shellybulb_3CC533<br />
DEVICETOPIC MQTT2_shellybulb_3CC533<br />
IODev MQTT2_FHEM_Server<br />
NAME MQTT2_shellybulb_3CC533<br />
NR 246<br />
STATE ???<br />
TYPE MQTT2_DEVICE<br />
READINGS:<br />
2018-12-12 19:28:08 status_blue 0<br />
2018-12-12 19:28:08 status_brightness 61<br />
2018-12-12 19:28:08 status_effect 0<br />
2018-12-12 19:28:08 status_gain 26<br />
2018-12-12 19:28:08 status_green 0<br />
2018-12-12 19:28:08 status_ison true<br />
2018-12-12 19:28:08 status_mode color<br />
2018-12-12 19:28:08 status_red 255<br />
2018-12-12 19:28:08 status_temp 3250<br />
2018-12-12 19:28:08 status_white 0<br />
Attributes:<br />
IODev MQTT2_FHEM_Server<br />
readingList shellybulb_3CC533:shellies/shellybulb-3CC533/color/0/status:.* { json2nameValue($EVENT, 'status_') }<br />
room MQTT2_DEVICE<br />
[[Bild:MQTT2 Shellybulb.png|400px|thumb|Darstellung in FHEMWEB nach Anwendung des template]]Dann bei den set-Anweisungen das attrTemplate "shellybulb" auswählen und setzen. Es erscheint eine Abfrage, ob die vorhandenen Readings gelöscht werden sollen. Diese bitte bestätigen und die Seite neu laden. Danach einmal An- und Ausschalten, damit die Readings auch durch einen neuen Status initialisiert werden und die Seite im Browser neu laden.<br />
<br />
=== Shelly Plug S ===<br />
Über die Leistungsmessung des Shelly Plug S lässt sich sehr einfach auch eine Erkennung des Betriebszustandes des angeschlossenen Gerätes realisieren. Dazu stellt man zuerst fest, wieviel Leistung das Gerät in jedem Betriebszustand verbraucht und kann dann z.B. für einen angeschlossenen Fernseher, der im Standby 1 Watt und im Betrieb > 100 Watt verbraucht, den Zustand erkennen und als on/off Status anzeigen. Dazu wird das state Reading wie folgt definiert:<br />
attr readingList shellies/shellyplug-s-123456/relay/0/power:.* { { state => $EVTPART0<100?"off":"on" } }<br />
Der Status des MQTT2 Devices zeigt dann bei <100W "off" und sonst "on" an.<br />
<br />
=== HTTP-Commands ===<br />
In diesem {{Link2Forum|Topic=102369|LinkText=Forumsbeitrag}} wird eine Lösung vorgestellt, um über [[99 myUtils anlegen|myUtils-Code]] weitere Kommandos bereitzustellen, die sonst nur direkt über das Web-Interface zu erreichen sind.<br />
<br />
== Shelly Gen2 ==<br />
=== Vorbereitung ===<br />
Shelly mit dem WLAN verbinden, entweder über die Shelly APP oder per Laptop auf den Offenen AP des Shelly verbinden und dann übers WebUI des Shelly mit dem Heimischen WLAN verbinden. Über die APP geht dies meist etwas einfach und schneller, besonders wenn man mehrere Shelly Geräte hinzufügen möchte. Durch die BT Unterstützung der Gen2 Geräte, klappt dies meist auch deutlich schneller und zuverlässiger als noch bei Gen 1 Geräten. <br />
Nachdem der Shelly mit dem WLAN verbunden ist, sollte die Firmware überprüft und gegebenenfalls aktualisiert werden (Stand Anfang 2022 scheint die firmware noch nicht voll ausgereift gewesen zu sein, da dass insbesondere die MQTT-Schnittstelle immer wieder überarbeitet wurde). Bitte KEINE BETA Versionen installieren, wenn nicht dazu aufgefordert wurde.<br />
Nach dem, durch das Update ausgelösten, Neustart kurz Prüfen ob die Uhrzeit passt, wenn trotz richtiger Zeitzone die Uhrzeit nicht stimmt hilft ein weiterer Neustart.<br />
Nun auf Networks| Internet (leider in APP und WebUI unterschiedlich), hier auf MQTT und die Einstellungen für den verwendeten MQTT Server treffen. Diese Einstellungen werden auch wieder durch Neustart übernommen.<br />
=== Shelly Plus 1 ===<br />
Zunächst muss man einen Statusupdate des Shelly erzwingen (Aus- und Einschalten, physikalisch oder per Web-UI), damit das Gerät bei eingeschaltetem autocreate angelegt wird. Dies sieht zunächst so aus:<br />
<syntaxhighlight lang="text"><br />
defmod MQTT2_shellyplus1_441793a34044 MQTT2_DEVICE shellyplus1_441793a34044<br />
attr MQTT2_shellyplus1_441793a34044 readingList shellyplus1_441793a34044:shellyplus1-441793a34044/online:.* online\<br />
shellyplus1_441793a34044:shellyplus1-441793a34044/status/mqtt:.* { json2nameValue($EVENT) }\<br />
shellyplus1_441793a34044:shellyplus1-441793a34044/events/rpc:.* { json2nameValue($EVENT) }\<br />
shellyplus1_441793a34044:shellyplus1-441793a34044/status/sys:.* { json2nameValue($EVENT) }\<br />
shellyplus1_441793a34044:shellyplus1-441793a34044/status/switch_0:.* { json2nameValue($EVENT) }<br />
attr MQTT2_shellyplus1_441793a34044 room MQTT2_DEVICE<br />
<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 IODev m2s<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 available_updates_beta_version 0.10.0-beta6<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 cfg_rev 7<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 connected true<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 dst shellyplus1-441793a34044/events<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 fs_free 237568<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 fs_size 458752<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 id 0<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 mac 441793A34044<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 method NotifyStatus<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 online true<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 output false<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_mqtt_connected true<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_switch_0_id 0<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_switch_0_output false<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_switch_0_source WS_in<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_switch_0_temperature_tC 39.88<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_switch_0_temperature_tF 103.78<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 params_sys_available_updates_beta_version 0.10.0-beta6<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_ts 1646474952.66<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_rssi -57<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_ssid WLAN-Alex<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_sta_ip 192.168.177.167<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_status got ip<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 ram_free 179764<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 ram_size 249456<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 restart_required false<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 source WS_in<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 src shellyplus1-441793a34044<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 temperature_tC 39.9<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 temperature_tF 103.9<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 time 11:08<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 unixtime 1646474911<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 uptime 7<br />
</syntaxhighlight><br />
<br />
Über die set Anweisung unterhalb der Device Übersicht können wir ein attrTemplate wählen; shellyPlus_1<br />
Es erscheint eine kurze Übersicht was im Template enthalten ist, dieses befindet sich noch im Aufbau und wird aktuell von der Community aufgebaut und weiterentwickelt. Mit einem Klick auf „set“ laden wir das Template und übernehmen die Einstellungen für den Shelly Plus 1.<br />
Damit ist der Shelly bereit, im Status wird neben dem Namen auch der Onlinestatus des Shellys (grüner | roter Punkt) so wie eine Lampe mit Toggle (on | off) Funktion und die Temperatur des Shellys angezeigt. Darüber hinaus verschwindet die Lampe und wird durch einen klickbaren Hinweis ersetzt, wenn ein Neustart des Shellys nötig ist.<br />
<br />
=== Tipps ===<br />
{{Randnotiz|RNTyp=g|RNText=So nimmt man bei Verwendung eines normalen Schalters (eine Stellung EIN eine AUS) gerne den „Flip“ Mode – damit wird der Shelly IMMER umgeschaltet, egal in welche Stellung der Schalter sich bewegt („Kreuzschaltung“). Diese Einstellungen trifft man grundlegend im WebUI des Shelly (oder APP) unter „Channel settings“.<br />
Für den „Flip“ müssen wir die Grundeinstellung des „Power on default“ auch ändern (gleiche Seite) - persönlich wähle ich „Restore last“, also: nach Stromausfall wird der letzte Zustand wieder hergestellt; grundsätzlich gehen alle Modi außer „Match input“.<br />
}}<br />
Das aktuelle Template wurde um die Funktion erweitert, den Button Mode umzuschalten. In den meisten Fällen legt man sich auf eine Schaltmethode fest, welche zum Hardware Setup passt.<br />
<br />
Manchmal will man aber vielleicht den Hardware Schalter deaktivieren, nennen wir es „Kindersicherung“. Bei Shelly heißt das „detached“.<br />
Diese Funktion wurde ins Template als „in_mode“ Übernommen. Mögliche set Befehle sind „flip“, „detached“ „toggle“. Bedingung zur Verwendung ist: „relay power on default“ darf NICHT „Match input“ sein. Sollte Follow statt Flip bevorzugt werden, müsste entsprechende Zeile in der setList von „flip“ auf „follow“ angepasst werden.<br />
<br />
Der Befehlt lässt sich mit dem webCmd in_mode auch schnell zugänglich in die Übersicht vom Shelly setzen, so erhält man neben dem Status ein Dropdown mit flip detached und toggle zum schnellen umschalten. Mit webCmdLabel kann man noch einen Namen für das Dropdown setzen.<br />
<br />
== OpenMQTTGateway ==<br />
Um verschiedene Systeme wie BLE usw. auf MQTT zu bringen bietet sich [https://github.com/1technophile/OpenMQTTGateway OpenMQTTGateway] an, z.B. wird für das Auslesen vieler BLE-Seonsoren lediglich ein ESP32-Board ohne Zusatzhardware (ab ca. 5,- Euro in Fernost erhältlich) benötigt, auf das dann eine vorkompilierte firmware geflasht wird (hierfür wird ein USB-seriell-Wandler benötigt).<br />
<br />
Nähere Details sind im Artikel [[OpenMQTTGateway]] zu finden.<br />
<br />
== 8-Port-Ethernet Board ==<br />
<gallery><br />
datei:8-relais-ethernetboard closed.jpg|mit Gehäuse<br />
datei:8-Port-MQTT-Relais-Board.jpg|ohne Gehäuse<br />
</gallery><br />
In diesem {{Link2Forum|Topic=107536|Message=1016379|LinkText=Forenbeitrag}} bzw. dem betreffenden Thread wurde ein Relais-Board vorgestellt, mit dem 8 Relais über Ethernetkabel verbunden werden, die Kommunikation erfolgt dann über MQTT. Über die verwendete Software ist wenig bekannt, es könnte jedoch sein, dass diese Art der Einbindung auch bei weiteren Boards funktioniert, die einen bestimmten Ethernet-Chipset von TI (DP83848) und eine Cortex M3 MCU verwenden.<br />
<br />
== Milight-Bridge ==<br />
=== Vorbemerkung ===<br />
Der [https://github.com/sidoh/esp8266_milight_hub esp8266_milight_hub] ist ein open source- Projekt, mit dem auf Basis von ''openmili'' eine Vielzahl von MiLight-Geräten gesteuert werden können. Der MiLight-Hub erstetzt dabei eine beliebige Zahl von Milight-Bridges und ist auch zu verschiedenen Versionen des MiLight-Protokols kompatibel.<br />
Neben MQTT kann dieser auch mit HTTPMOD oder Wifilight (bzw. den MiLight-Modulen) gesteuert werden. Die Hardware entspricht dabei im Wesentlichen einem MySensors-Wifi-Gateway<ref>Es wird lediglich ein anderer CS-PIN genutzt. Dies kann einfach in der Web-Oberfläche der Firmware umgestellt werden.</ref>.<br />
Hier wird vorausgesetzt, dass eine funktionierende Bridge vorhanden ist.<br />
Der Vorteil der MQTT-Lösung liegt darin, dass man bei kompatiblen Fernbedienungen auch direkt Informationen über Schaltvorgänge erhält, die mit der Fernbedienung ausgelöst werden.<br />
<br />
=== Einstellungen am MiLight-Hub ===<br />
Die zum FHEM-Server bzw. dem MQTT2_SERVER passenden Vorgaben sind im Web-Interface des Hub einzustellen. Gegebenenfalls passen Sie die vom Hub zurückzugebenden Elemente im Web-Interface des Hub an.<br />
Die Einstellungen für ''MQTT topic pattern'' usw. können auf den default-Werten<ref>Diese sind: <br>''milight/:device_id/:device_type/:group_id'' für "topic pattern"<br>''milight/updates/:hex_device_id/:device_type/:group_id'' für "update topic pattern"<br>''milight/states/:hex_device_id/:device_type/:group_id'' für "state topic pattern". Der Autor hat derzeit folgende Infotypen zum Senden markiert: "status, brightness, hue, color, mode, color_temp, bulb_mode, computed_color, hex_color" (enthält eventuell zu viele Angaben. Bei einem Eventhandler muss man uU. darauf achten, dass kurz hintereinander zweimal dasselbe Event kommen kann (für ON/OFF)).</ref> belassen werden, für die seit Mitte 2019 vorhandene Option, eine LWT-Message zu senden (''MQTT Client Status Topic''), tragen Sie ''milight/LWT'' ein und aktivieren ''Detailed''.<br />
<br />
=== FHEM-Devices ===<br />
[[Bild:MQTT2 MiLight.png|400px|thumb|Milight: Darstellung in FHEMWEB]]<br />
==== Bridge ====<br />
Wird nun über den Hub oder eine von diesem erkannte Fernbedienung ein vorhandenes Leuchtmittel geschaltet, wird bei eingeschaltetem autocreate ein erstes Device erstellt, die zunächst erstellte Definition sieht typischerweise etwa so aus:<br />
defmod MQTT2_milight_hub_1370325 MQTT2_DEVICE milight_hub_1370325<br />
attr MQTT2_milight_hub_1370325 IODev MQTT2_FHEM_Server<br />
attr MQTT2_milight_hub_1370325 readingList milight_hub_1370325:milight/updates/0xBE59/rgbw/1:.* { json2nameValue($EVENT, '1_', $JSONMAP) }<br />
attr MQTT2_milight_hub_1370325 room MQTT2_DEVICE<br />
<br />
Auf dieses Device wird nun das ''template'' '''esp_milight_hub_bridge''' angewandt.<br />
<br />
==== Einzelne Leuchtmittel ====<br />
<br />
Wird nun nochmals das oben verwendete Leuchtmittel geschaltet, erstellt autocreate ein weiteres Device:<br />
defmod MQTT2_milight_0xBE59_1 MQTT2_DEVICE milight_0xBE59_1<br />
attr MQTT2_milight_0xBE59_1 IODev MQTT2_FHEM_Server<br />
attr MQTT2_milight_0xBE59_1 readingList milight/states/0xBE59/rgbw/1:.* { json2nameValue($EVENT, '1_', $JSONMAP) }<br />
attr MQTT2_milight_0xBE59_1 room MQTT2_DEVICE<br />
<br />
Auf dieses wird nun eines der Bulb-templates angewendet. Wählt man das template X_01_esp_milight_hub_rgbw_bulb, wird eine einfache Variante erstellt, die neben einem toggelnden Icon nur Regler für Helligkeit, die Farbe und zwei Schaltflächen für den Weiß- und Nachtmodus enthält. Wer mehr oder andere Steuerelemente erhalten möchte, verwendet ein anderes template. Nicht benötigte Elemente kann man dabei einfach aus der Definition löschen.<br />
<br />
Alle weiteren Devices werden genauso erstellt. <br />
<br />
Um ein Device zu erhalten, mit dem sich alle Kanäle gleichzeitig steuern lassen, kann das template ''X_01a_esp_milight_hub_make_rgbw_group'' verwendet werden. Dieses verändert nicht das aktuelle Device, sondern erstellt '''eine Kopie''', die dann modifiziert wird. Diese Kopie ist unter dem Namen ''milight_<RemoteID>_0'' im selben Raum zu finden wie das Ausgangsgerät und kann ebenfalls an die eigenen Wünsche angepasst werden. <br />
<br />
Weitere Beispiele:<br />
Beispiel für ein RGB-CCT-Device:<br />
defmod Licht_Wz_all MQTT2_DEVICE<br />
attr Licht_Wz_all IODev MQTT2_Broker<br />
attr Licht_Wz_all eventMap /set_white:Weiss/night_mode:Nacht/white_mode:white/on:on/off:off/ON:on/OFF:off/next_mode:Mode/mode_speed_up:Up/mode_speed_down:Down/<br />
attr Licht_Wz_all group Licht<br />
attr Licht_Wz_all icon light_control<br />
attr Licht_Wz_all readingList milight/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\<br />
milight/updates/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\<br />
milight/states/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\<br />
<br />
attr Licht_Wz_all room Wohnzimmer<br />
attr Licht_Wz_all setList on milight/0x5D02/rgb_cct/0 {"status":"ON"}\<br />
off milight/0x5D02/rgb_cct/0 {"status":"OFF"}\<br />
level milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
hue:colorpicker,HUE,0,1,359 milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
command:uzsuSelectRadio,Weiss,Nacht,Mode,Up,Down milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
brightness:colorpicker,BRI,0,1,255 milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
next_mode milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
mode_speed_up milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
mode_speed_down milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
saturation:colorpicker,BRI,0,1,100 milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
color_temp:colorpicker,CT,153,1,370 milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
device_id milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
effect milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
mode milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
commands milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}<br />
attr Licht_Wz_all sortby 1<br />
attr Licht_Wz_all webCmd command:brightness:saturation:color_temp:hue<br />
attr Licht_Wz_all webCmdLabel command\ <br />
:brightness:saturation\<br />
:color_temp:hue<br />
==== Ein Leuchtmittel, mehrere Fernbedienungen ====<br />
Pairt man mehrere Fernbedienungen mit einem Leuchtmittel, sollten auch alle entsprechenden Fernbedienungscodes in das readingList-Attribut übernommen werden. Dazu übernimmt man am einfachsten die Einträge aus den zusätzlichen MQTT2_DEVICEs. Benötigt man das zusätzliche Device nicht separat, um z.B. eine getrennte Gruppenschaltung zu realisieren, kann man dieses löschen. Beispiel-readingList für ein Device, das auf zwei Fernbedienungscodes und zwei Gruppen "hört":<br />
<br />
attr Licht_Wz_all readingList milight/states/0x1234/rgbw/2:.* {json2nameValue($EVENT) }\<br />
milight/updates/0x1234/rgbw/2:.* { json2nameValue($EVENT) }\<br />
milight/states/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\<br />
milight/updates/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\<br />
milight/states/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\<br />
milight/updates/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\<br />
milight/states/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }\<br />
milight/updates/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }<br />
<br />
==== Fernbedienung als Input-Device nutzen ====<br />
In diesem {{Link2Forum|Topic=103493|LinkText=Thread}} ist dargestellt, wie man eine Fernbedingung des Typs FUT089 dazu verwenden kann, einen [[MPD]] oder Rollladenaktoren zu steuern, oder diese Fernbedienung für [[Hue#HUE-Device|HUEDevice]]-Leuchtmittel zu nutzen.<br />
Um hier nur Differenz-Meldungen direkt an die betreffende myUtils-Funktion zu übergeben und doppelte Events zu verhindern, sollte hier die readingList so angepasst werden, dass nur Messages aus dem "updates"-Zweig ausgewertet werden: <br />
defmod MiLight_RC1_0 MQTT2_DEVICE milight_0xABCD_0<br />
attr MiLight_RC1_0 readingList milight/states/0xABCD/fut089/[0-8]:.* {}<br />
milight/updates/0xABCD/fut089/0:.* { FHEM::attrT_MiLight_Utils::MPDcontrol('myMPD',$EVENT, 'Yamaha_Main') }\<br />
milight/updates/0x5D47/fut089/1:.* { FHEM::attrT_MiLight_Utils::FUT_to_RGBW('Licht_Stehlampe_links',$EVENT) }\<br />
milight/updates/0x5D47/fut089/2:.* { FHEM::attrT_MiLight_Utils::FUT_to_RGBW('Licht_Stehlampe_rechts',$EVENT) }\<br />
milight/updates/0x5D47/fut089/3:.* { FHEM::attrT_MiLight_Utils::four_Lights_matrix($EVENT, 'Licht_WoZi_Vorn_Aussen', 'Licht_WoZi_Vorn_Mitte', 'Licht_WoZi_Hinten_Aussen', 'Licht_WoZi_Hinten_Mitte') }\<br />
milight/updates/0x5D47/fut089/4:.* { FHEM::attrT_MiLight_Utils::shuttercontrol('Jalousie_WZ',$EVENT) }\<br />
milight/updates/0x5D47/fut089/5:.* { FHEM::attrT_MiLight_Utils::shuttercontrol('Rollladen_WZ_SSO',$EVENT) }\<br />
milight/updates/0x5D47/fut089/6:.* { FHEM::attrT_MiLight_Utils::shuttercontrol('Rollladen_WZ_SSW',$EVENT) }\<br />
milight/updates/0x5D47/fut089/7:.* {}\<br />
milight/updates/0x5D47/fut089/8:.* {}<br />
attr MiLight_RC_WZ stateFormat CommandSet<br />
<br />
<br />
== eBus ==<br />
An dieser Stelle sollen lediglich die Grundzüge erläutert werden, eine ausführliche Anleitung über die Konfiguration des [[EBUS-MQTT2|eBus mit MQTT2 gibt es hier]].<br />
<br />
=== Vorbereitung und Definition am eBus ===<br />
Vorausgesetzt wird ein laufender eBus-Dämon. Dessen Einrichtung wird im Artikel [[EBUS#Software|EBUS]] beschrieben.<br />
In der Konfiguration des Dämons ( /etc/default/ebusd ) ist die Kommunikation über MQTT zu aktivieren und die Topic-Struktur festzulegen, z.B. ''ebusd/%circuit/%name''.<br />
--accesslevel=* --mqttport=1883 --mqttjson --mqtthost=IpAdresseMQTTSERVER --mqtttopic=ebusd/%circuit/%name<br />
{{Hinweis|Nachfolgend wird davon ausgegangen, dass als Vorgabe für mqtttopic ''ebusd'' verwendet wurde. Dies kann geändert werden, es wird aber dringend empfohlen, das mqtttopic in jedem Fall mit ''ebus...'' zu beginnen!}}<br />
<br />
=== Vorbereitung und Definition in FHEM ===<br />
Unabhängig von dem konkret genutzten IO-Modul (MQTT2_SERVER oder MQTT2_CLIENT) sollte an diesem '''''vor''''' den nachfolgenden Schritten zunächst das autocreate ausgeschaltet werden. Weiter sollte geprüft werden, ob es bereits MQTT2_DEVICE-Geräte gibt, die Einträge in der ''readingList'' enthalten, die vom ebus stammen. Da wir die ''readingList'' anschließend mit erweiterten JSON-Optionen erstellen wollen, müssen zumindest sämtliche ''readingList''-Attribute entsprechend bereinigt oder gelöscht werden; in der Regel ist es einfacher, diese Geräte nach dem Deaktivieren des autocreate am IO zu löschen.<br />
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT als IO nutzen, sollte für das weitere Vorgehen eine Kopie des MQTT2-"Sammeldevices" genutzt werden, und dessen ''CID'' auf ''ebusd'' geändert werden. Nach Anwendung des ebusd-splitter-templates müssen dann alle den ebus betreffenden Einträge aus der ''readingList'' des "Sammeldevices" gelöscht werden oder diese ganz gelöscht.}}Ist der ebus-Dämon lauffähig und für MQTT konfiguriert, sendet dieser regelmäßige Messages. <br />
<br />
Sind die Vorbereitungen abgeschlossen, aktivieren wir ''autocreate'' wieder, allerdings wählen wir als autocreate-Methode ''complex'' aus, da der eBus-Dämon teilweise<ref>Dies betrifft vorrangig die Statusmeldungen</ref> eine weiter verschachtelte JSON-Struktur zum Versenden der Informationen verwendet als üblich. Danach wird wie bei den anderen o.g. Geräten automatisch ein neues MQTT2_DEVICE angelegt<ref>Bei Verwendung des MQTT2_CLIENT wird dann die ''readingList'' am bereits definierten MQTT2_DEVICE aus der Kopie des "Sammeldevice" automatisch wieder erstellt bzw. gefüllt.</ref><br />
<br />
==== "ebus-Bridge" ====<br />
Auf das von ''autocreate'' erstellte MQTT2_DEVICE wird nunmehr das template ''eBus_daemon_splitter'' angewendet. Nach einiger Zeit sollte sowohl die readingList an diesem Device erweitert worden sein, wie auch ein oder mehrere neue MQTT2_DEVICE-Geräte angelegt. <br />
Dieses Device liefert zukünftig Readings zum Dämon selbst, wie dessen ''uptime'', alle weiteren am eBus angeschlossenen Teilnehmer werden dagegen zweckmäßigerweise durch ein oder mehrere weitere MQTT2_DEVICE-Geräte dargestellt. <br />
<br />
Das ''attrTemplate'' läd eine weitere ''attrTemplate''-file und [[99 myUtils anlegen|99_myUtils-Code]] vom FHEM-Server nach. Beides steht dann auch unmittelbar zur Nutzung zur Verfügung. <br />
==== "ebusd_bai" und weitere Geräte ====<br />
{{Hinweis|Der eBus-Dämon sendet nicht alle Informationen zu allen am eBus angeschlossenen Geräte automatisch. Diese müssen teilweise erst aktiv angefragt werden. Wie das im einzelnen erfolgen kann, ist dem o.g. Detailartikel zu entnehmen.}}<br />
Funktioniert die Kommunikation zwischen dem eBus-Dämon und FHEM, sollte nach einigen Minuten zumindest ein weiteres Gerät namens ''MQTT2_ebus_bai'' angelegt worden sein.<br />
<br />
== Sonos2Mqtt ==<br />
Aus einem Versuch heraus ist ein {{Link2Forum|Topic=111711|LinkText=kleines Projekt}} geworden: Die Sonos Umgebung mit Hilfe von sonos2mqtt als generisches MQTT2_DEVICE komfortabel in FHEM einzubinden.<br />
<br />
Mit Hilfe von ein paar Templates ist die grundlegende Einbindung in FHEM nach einer kleinen Installation auf Systemebene schnell erledigt. Es läuft derzeit noch zahlreiche Entwicklung und Ideenfindung, die Fortschritte sind live im Thread oder [[Sonos2mqtt|konsolidiert im Wiki]] zu finden.<br />
<br />
=== Setup im System ===<br />
Für dies Funktion wird der nodejs Server [https://github.com/svrooij/sonos2mqtt sonos2mqtt] benötigt. Entweder installiert man den lokal, irgendwo im Netzwerk oder nutzt den [[MQTT2-Module - Praxisbeispiele#Verwendung des Docker Containers|Docker Container.]]<br />
<br />
Der nodejs Server sonos2mqtt kann aus Sicht von FHEM irgendwo im Netzwerk stehen - aber er muss im gleichen Netzwerk wie die Sonosplayer stehen. Das UPNP Sonosnetzwerk funktioniert nicht über Netzwerksegmente hinweg.<br />
<br />
Eine Beschreibung aller Startparameter für sonos2mqtt findet man [https://svrooij.io/sonos2mqtt/getting-started.html in der offiziellen Doku].<br />
<br />
Erreicht der nodejs Server sonos2mqtt den MQTT Server nicht über - default: localhost, Port 1883, keine Anmeldung" - muss der Parameter --mqtt gesetzt werden! <br />
<br />
Beispiele:<br />
:<code>--mqtt mqtt://myuser:the_secret_password@192.168.0.3:1800</code> # alles gesetzt<br />
:<code>--mqtt mqtt://192.168.0.3:1800</code> # IP Adresse und Port gesetzt, keine Anmeldung am MQTT Server<br />
:<code>--mqtt mqtt://192.168.0.3</code> # IP Adresse gesetzt, Port ist Standard 1883<br />
<br />
Erfolgt der Start mit pm2, werden die Parameter mit einem ''zusätzlichen'' doppelten Bindestrich (--) hinter dem nodejs Modul übergeben.<br />
<br />
Beispiel:<br />
<syntaxhighlight lang="perl"><br />
pm2 start sonos2mqtt -- --mqtt mqtt://myuser:the_secret_password@192.168.0.3:1800<br />
</syntaxhighlight><br />
<br />
'''Lokales Setup'''<br />
<br />
Voraussetzung: nodejs und pm2 ist installiert und für alle Benutzer verfügbar. <syntaxhighlight lang="bash"><br />
sudo npm install -g sonos2mqtt<br />
</syntaxhighlight><br />
Je nach Entwicklungsstand sind auch Betaversionen verfügbar. Für aktuelle Betaversionen wird dieser Zusatz beim Setup verwendet. -> sonosmqtt@3.1.0-beta.1<br />
<br />
Wird der sonos2mqtt Server auf einer anderen Maschine eingerichtet, ist der Start entsprechend diesem Absatz [[MQTT2-Module - Praxisbeispiele#Autostart von sonos2mqtt im System mit pm2 .28Alternative.29|Autostart von Sonos2mqtt im System mit pm2]] einzurichten.<br />
<br />
=== Setup in FHEM ===<br />
Man definiert lediglich ein Bridge Device, der Rest wird automatisch erledigt.<br />
<br />
Voraussetzung: <br />
* autocreate im System ist aktiv. <br />
* Der verwendete MQTT2_SERVER steht auf '''autocreate simple''' (default/Standard).<br />
* Templates aktuell - FHEM uptodate oder bei Bedarf in der FHEM Kommandozeile aktualisieren:<br />
<pre><br />
{ Svn_GetFile("FHEM/lib/AttrTemplate/mqtt2.template", "FHEM/lib/AttrTemplate/mqtt2.template", sub(){ AttrTemplate_Initialize() }) }<br />
</pre><br />
Bei der Anwendung des Templates für die Bridge wird das Attribut devicetopic ausgelesen oder auf default sonos gesetzt! <br />
<br />
Wird ein anderer Devicetopic verwendet, muss der bei der Anlage der Bridge gesetzt werden!<br />
<br />
Diese Zeilen einzeln in der FHEM Kommandozeile oder als Block in der Raw Definition. <syntaxhighlight lang="perl"><br />
define SonosBridge MQTT2_DEVICE<br />
attr SonosBridge room MQTT2_DEVICE<br />
set SonosBridge attrTemplate sonos2mqtt_bridge_comfort<br />
</syntaxhighlight><br />
Das Template sonos2mqtt_bridge_comfort:<br />
* setzt das Template sonos2mqtt_bridge auf das Device,<br />
* lädt die Datei 99_sonos2mqttUtils.pm aus dem contrib Ordner nach,<br />
* definiert ein notify, dies erledigt im weiteren Betrieb die automatische Konfiguration der automatisch erzeugten MQTT2_DEVICEs. <br />
** mit dem Template sonos2mqtt_speaker (das Template kann auch manuell auf vorhandene Player angewendet werden, die automatische Erzeugung der Player wird aber empfohlen)<br />
** Ermittelt Detailinformation des jeweiligen Players (vor allem IP Adresse und Modelnumber)<br />
** Lädt die Sonosgeräte Icons von den UPNP Devices herunter<br />
** erweitert das setList input Kommando um den TV Eingang (HDMI, spdif) bzw. Line_IN Eingang falls vorhanden (Modelnumber)<br />
* Die Player werden automatisch einzeln erzeugt wenn sie mqtt Nachrichten senden (Play/Stop) oder (alle sofort) wenn der sonos2mqtt Server gestartet wird. <br />
<br />
==== Wozu dient die Bridge? ====<br />
Sie stellt ein paar wesentliche Funktionen zu Verfügung<br />
# Auffangen von nicht benötigten MQTT Nachrichten.<br />
# Erzeugung/Weiterleitung von Nachrichten für die einzelnen Player - damit auch die Erzeugung von separaten Playern nach dem Schema MQTT2_RINCON12345678901234567.<br />
# Statusanzeige sonos2mqtt als Reading connected (0 offline, 1 connected, 2 Player connected).<br />
Sie kann zusätzlich als zentrales Device verwendet werden, um die Sonos Umgebung abzubilden, z.B. Readings für Favoriten u.ä.<br />
<br />
==== Start sonos2mqtt lokal ====<br />
Der Start / Stop des sonos2mqtt Servers innerhalb von FHEM ist nur lokal simpel möglich. Ist der Server irgendwo im Netzwerk oder im Docker Container, muss man andere Möglichkeiten finden. Der Neustart aus FHEM ist zwar praktisch, aber nicht erforderlich. <br />
<br />
Wird eine existierenden Sonos Landschaft inhaltlich verändert (Player dazu/weg), muss der Server neu gestartet werden. Werden Player temporär abgeschaltet, merkt das der Server nach einer Zeit selbst, oder man forciert dies mit einem CheckSubscription an der Bridge.<br />
<br />
Soll das Modul sonos2mqtt mit seinen default Einstellungen gestartet werden, genügt dieser kurze Befehl (in der FHEM Kommandozeile):<br />
<syntaxhighlight lang="bash"><br />
"pm2 start sonos2mqtt"<br />
</syntaxhighlight><br />
Tipp: Verwendet man anstatt "Befehl" den Syntax {qx(Befehl)} in der FHEM Kommandozeile, wirkt der Befehl zwar blockierend aber die Ausgabe erfolgt im Browser und nicht im Logfile. Mit dem Parameter -s erfolgt keine Ausgabe.<br />
<br />
==== Autostart von sonos2mqtt mit FHEM ====<br />
Der Code startet sowohl das sonso2mqtt Modul sofort und implementiert ein notify für den zukünftigen automatischen Start beim Start von FHEM.<br />
<syntaxhighlight lang="perl"><br />
define n_pm2_sonos notify global:INITIALIZED|n_pm2_sonos:start "pm2 -s start sonos2mqtt"<br />
trigger n_pm2_sonos start<br />
</syntaxhighlight> <br />
<br />
=== Autostart von sonos2mqtt im System mit pm2 (Alternative) ===<br />
Der obige Code startet das sonos2mqtt nodejs Modul mit pm2 beim Start von FHEM. Sollte das nicht funktionieren oder nicht ins gesamte Konzept passen (weil z.B. mehrere nodejs Module geladen werden) kann der automatische Start direkt im System erfolgen. Zunächst dafür das oben eventuell schon definierte notify löschen!<syntaxhighlight lang="perl"><br />
delete n_pm2_sonos<br />
</syntaxhighlight>Der Start des Modul muss nicht mit erhöhten Rechten geschehen! Im Terminal folgendes eingeben (unter dem angemeldeten Benutzer wird sonos2mqtt später immer gestartet):<syntaxhighlight lang="bash"><br />
pm2 start sonos2mqtt<br />
pm2 startup<br />
</syntaxhighlight><br />
Der letzte Befehl "redet", d.h. es gibt eine Ausgabe in der Art:<br />
<syntaxhighlight lang="bash"><br />
[PM2] To setup the Startup Script, copy/paste the following command:<br />
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi<br />
</syntaxhighlight><br />
Man tut einfach genau das, was dasteht: die letzte Zeile kopieren und wieder einfügen und ausführen. Danach muss man die Konfiguration von pm2 noch sichern:<br />
<syntaxhighlight lang="bash"><br />
pm2 save<br />
</syntaxhighlight><br />
<br />
=== Verwendung des Docker Containers ===<br />
Ergänzend zur [https://svrooij.io/sonos2mqtt/getting-started.html#run-sonos2mqtt-in-docker Original Doku:]<br />
<br />
Beim Container findet die Konfiguration der Verbindung zum FHEM in den Environment Variablen statt:<br />
<syntaxhighlight lang="perl"><br />
environment:<br />
- SONOS2MQTT_DEVICE=192.168.56.207 # hier muss einer der Sonos Lautsprecher stehen<br />
- SONOS2MQTT_MQTT=mqtt://192.168.56.121:1883 # mqtt2_server FHEM, erweiterter Syntax siehe oben<br />
- SONOS_LISTENER_HOST=192.168.56.121 # Docker host IP<br />
</syntaxhighlight><br />
<br />
=== Sonos2mqtt mit mehr Komfort ===<br />
Im Wiki Artikel [[Sonos2mqtt]] geht es weiter.<br />
<br />
== Owntracks GPS Tracking in FHEM ==<br />
Das hier gezeiget Beispiel verwendet eine MQTT Instanz im Internet, die mit einem MQTT2_CLIENT angebunden wird. Da wenig Traffic benötigt wird, genügt z.B. eine kostenfreie Instanz z.B. bei myqtthub (Stand. Dezember 2020)<br />
<br />
Alternativ kann man einen MQTT2_SERVER auch direkt verfügbar machen, wenn man sich sicher ist was man da tut! Siehe {{Link2Forum|Topic=99666|Message=1028576|LinkText=diesen Forenbeitrag}}. Das Bridge Device wird dabei genau so benötigt, nur der IODev ist dann der MQTT2_SERVER.<br />
<br />
=== owntracks auf dem Smartphone konfigurieren ===<br />
Menü / Einstellung / Verbindung <br />
<br />
Dort sind insgesamt 4 Registerkarten mit Werten zu füllen (Beispiel):<br />
* Modus -> MQTT<br />
* Hostname -> <br />
** Hostnamen: host.cloud.com <br />
** Port: 8883 <br />
** ClientID: ID vom Provider <br />
** WebSockets (nicht nutzen)<br />
* Identifikation -> <br />
** Benutzername: user-name <br />
** Passwort: user-password <br />
** GeräteID: mi6 (erscheint in FHEM im Device Namen verwendet)<br />
** TrackerID: hk (nur zweistellig, erscheint als ID in der owntracks Karte)<br />
* Sicherheit -> TLS aktivieren<br />
=== Definition in FHEM ===<br />
Der MQTT2_CLIENT wird so eingerichtet, man braucht eine andere ClientID als auf dem Smartphone! Stimmt alles sollte das Gerät sofort open anzeigen.<syntaxhighlight lang="perl"><br />
MQTT2_CLIENT einrichten, autocreate simpel<br />
define mqtt2Cloud MQTT2_CLIENT host.cloud.com:8883<br />
attr mqtt2Cloud SSL 1<br />
attr mqtt2Cloud autocreate simple<br />
attr mqtt2Cloud clientId fhem1<br />
attr mqtt2Cloud room MQTT2_IO<br />
attr mqtt2Cloud username user-name<br />
set mqtt2Cloud password user-password<br />
</syntaxhighlight>Für die automatische Erzeugung der Trackergeräte in FHEM richtig man zuerst ein Bridge Device ein:<syntaxhighlight lang="perl"><br />
define MQTT2_Cloud_bridge MQTT2_DEVICE<br />
attr MQTT2_Cloud_bridge IODev mqtt2Cloud<br />
attr MQTT2_Cloud_bridge autocreate 1<br />
attr MQTT2_Cloud_bridge room MQTT2_DEVICE<br />
</syntaxhighlight>Dies wird entweder mit dem Template allgemein konfiguriert<syntaxhighlight lang="perl"><br />
set MQTT2_Cloud_bridge attrTemplate MQTT2_CLIENT_general_bridge<br />
</syntaxhighlight>oder manuell nur für owntracks eingerichtet<syntaxhighlight lang="perl"><br />
attr MQTT2_Cloud_bridge bridgeRegexp owntracks/[^/]+/([^/:]+).* "owntracks_$1"<br />
</syntaxhighlight>MQTT2 Geräte für owntracks werden jetzt automatisch mit dem Namen MQTT2_owntracks_<GeräteID> erzeugt. Diese werden einfach mit dem Template owntracks_device fertig konfiguriert. Bei einem IOS Gerät kann man danach noch das Template owntracks_device_IOS als Erweiterung anwenden.<br />
<br />
==== Anwesenheitserkennung ====<br />
Die Anwesenheit kann im owntracks Device direkt für die selbst definierten Plätze abgelesen werden: entweder steht im reading place der jeweilige Ort oder away. Um hier noch eine gewisse Einheitlichkeit in der Verwendung zu bekommen kann man ein PRESENCE Device verwenden: <syntaxhighlight lang="perl"><br />
define OT_Mi6 PRESENCE event MQTT2_owntracks_mi6:place:.away MQTT2_owntracks_mi6:place:.<Home><br />
</syntaxhighlight>Im Move Modus erfolgt die Erkennung sehr schnell und damit einige Sekunden eher als eine BT Erkennung im Haus - der Akkuverbrauch steigt enorm. Im Significant Modus kann es schon mal ein paar Minuten dauern - ein relevanter Akku Verbrauch ist nicht erkennbar.<br />
<br />
== Allgemeine Hinweise ==<br />
=== MQTT2_SERVER und MQTT2_CLIENT für Debugging nutzen ===<br />
Nutzt man das rawEvents-Attribut am MQTT2-IO<ref>z.B. <code>attr MQTT2_FHEM_Server rawEvents .*</code>, der regex-Filter kann wie üblich angepasst werden</ref>, kann man den Datenverkehr des Servers am Event-Monitor mitschneiden. Dies ist insbesondere für unbekannte Geräte nützlich, deren Topic- und Payload-Struktur noch nicht bekannt ist.<br />
Um den kompletten MQTT Datenaustausch mitzuschneiden, kann man mit <code>attr mqtt2_server verbose 5</code> auch alles ins FHEM-Log schreiben lassen.<br />
<br />
=== autocreate funktioniert anscheinend nicht? ===<br />
In der Regel wird bei neu eingehenden MQTT-Messages über ''autocreate'' ein neues Device erstellt, wenn Nachrichten von einem bisher unbekannten Gerät kommen. Geschieht dies nicht, sollten folgende Punkte geprüft werden:<br />
# (nur bei MQTT2_SERVER:) Der Client muss eine ClientID angeben, diese darf nicht den defaults von ''mosquito_sub'' entsprechen.<br />
# Ein allgemeines {{Link2CmdRef|Anker=autocreate|Lang=en|Label=autocreate}}-Device (''TYPE=autocreate'') muss vorhanden und aktiv sein.<br />
# ''autocreate'' am IO muss eingeschaltet sein, was für MQTT2_SERVER bedeutet, dass es nicht auf "0" stehen darf (hier ist dann ''simple'' die aktive Voreinstellung), für MQTT2_CLIENT sollte ebenfalls ''simple'' verwendet werden; dies muss hier allerdings explizit gesetzt werden.<br />
<br />
Wird dann immer noch kein Device erstellt, gibt es in aller Regel ein Device, das bereits einen entsprechenden Eintrag in der readingList enthält, oder es sind keine Nachrichten eingegangen. Überprüfen Sie daher dann ggf. die Einstellungen am Client-Gerät (z.B. im Web-Interface des Shelly oder Tasmota-geflashten ESP8266).<br />
<br />
Das ''autocreate'' am Device schließlich bestimmt, ob die ''readingsList'' erweitert werden darf, wenn Informationen über bisher nicht über die readingList abgedeckte Topics empfangen werden und vom MQTT2-IO als zu diesem Device/ClientID gehörend identifiziert wurden.<br />
<br />
=== attrTemplate ===<br />
{{Randnotiz|RNTyp=Info|RNText=Die per attrTemplate jeweils erzeugten Konfigurationen sind Einrichtungsbeispiele, die v.a. eine in sich konsistenze Zusammenstellung der verschiedenen Attribute enthalten. Es steht jedem User frei, diese Ausgangsbasis dann nach seinem Belieben zu ändern. Spätere Änderungen des verwendeten attrTemplate wirken sich nicht automatisch auf die durch frühere Versionen oder den User nachkonfigurierte Geräte aus! Da es vorkommen kann, dass sich die per MQTT übermittelten Daten und Topics ändern, wenn z.B. eine firmware aktualisiert wurden, kann dies Anpassungen am jeweiligen Template erforderlich machen. Grundsätzlich sollen die per attrTemplate für MQTT2_DEVICE verfügbaren attrTemplate jeweils für die aktuellste verfügbare stabile firmware-Version passen.}}<br />
Zur Konfiguration von MQTT2_DEVICE-Geräten kann die Funktion ''[[AttrTemplate|attrTemplate]]'' genutzt werden. <br />
Die Anwendung für MQTT2_DEVICE ist [[MQTT2 DEVICE#attrTemplate|hier]] beschrieben.<br />
<br />
<br />
{{Hinweis|In einigen Fällen kann es vorkommen, dass die template-Bezeichnung zwischenzeitlich geändert wurde. Seit 21.09.2019 erfolgt die Sortierung der auswählbaren templates nicht mehr nur nach den Namen, so dass die entsprechenden Namensbestandteile entfallen sind, die einer besseren Sortierung dienten.}}<br />
<br />
=== attrTemplate: Es werden nicht alle templates angezeigt ===<br />
Siehe Beitrag [[AttrTemplate#Warum finde ich das Template xyz nicht.3F|AttrTemplate: Warum finde ich das Template xyz nicht.]]<br />
<br />
=== attrTemplate und Sprachsteuerung ===<br />
Konfiguriert man MQTT2_DEVICE-Geräte mit attrTemplate, werden in der Regel auch direkt die für die Sprachsteuerung der Geräte erforderlichen Attribute mit gesetzt. Weiterführende Hinweise sind auch zu diesem Teilaspekt von ''[[AttrTemplate|attrTemplate]]'' dem betreffenden Hauptartikel zu entnehmen.<br />
<br />
=== bridgeRegexp ===<br />
[[Datei:Mqtt2 server.png|300px|thumb|left|Logische Verortung der bridgeRegexp-Angaben]]{{Randnotiz|RNTyp=y|RNText=Beachten Sie, dass aufgrund des geschilderten Prinzips eine Änderung einer bridgeRegexp bei einem Gerät auch dazu führt, dass alle Readings eines Geräts und alle readingList-Einträge gelöscht werden.}}Üblicherweise werden alle Informationen, die aus einer Quelle stammen auch '''''einem''''' ''MQTT2_DEVICE'' zugeordnet, wobei im Falle des dort nicht aktivierten autocreate-Attributs entsprechende readingList-Einträge erzeugt werden. In dem nebenstehenden Schaubild wären dies die Geräte ''A'' bis ''D''. Das '''Attribut''' ''bridgeRegexp'' kann dazu genutzt werden, um neue, bisher unbekannte Topic-Strukturen im Rahmen des autocreate-Vorgangs anders zu strukturieren. Diese werden dabei im Ergebnis einem '''anderen Device''' (das ggf. erst erstellt wird) zugeschlagen, sollte eine zu der topic-Struktur passende regex in diesem Attribut gesetzt sein. Für dessen CID und die Bildung des Names wird die im 2. Teil jedes Eintrags als ''newClientId'' hinterlegte Angabe verwendet. In nebenstehendem Schaubild ist dies exemplarisch für die Gerätegruppe ''D'' mit dem ''bridge''-Device ''D'' und dessen ''Satelliten'' ''D1'' bis ''D4'' dargestellt.<br />
Dementsprechend sind in den hier aufgeführten Beispielen ''bridgeRegexp''-Attribute immer dort zu finden, wo ein Gerät oder Dienst dazu dient, mit weiteren, ggf. auf andere Weise kommunizierende Geräte oder Baugruppen zu kommunizieren, wie z.B. für über hier dargestellten ''zigbee2mqtt'' oder ''zigbee2tasmota''. Ein Sonderfall hierbei ist das template ''MQTT2_CLIENT_general_bridge'' zur Verwendung mit dem [[MQTT2_CLIENT#Anwendung|MQTT2_CLIENT]], denn aus dessen Sicht stammen alle Informationen aus derselben Quelle, nämlich z.B. dem ''mosquitto''-Server und würden sonst alle einem einem MQTT2_DEVICE zugewiesen.<br />
<br />
=== Ständig neue Devices? ===<br />
MQTT2_SERVER kann zwischen verschiedenen Geräten auch anhand der ClientID unterscheiden. Für jedes neu erkannte Gerät wird auch ein eigenes MQTT2_DEVICE angelegt. Abhilfemaßnahmen:<br />
==== Vergabe einer ClientID ====<br />
Die meisten MQTT-fähigen Geräte enthalten Optionen zur Vergabe einer eindeutigen ClientID (siehe das Beispiel des zigbee2mqtt-Dienstes oben). <br />
Wird keine ClientID vergeben, verwenden manche Clients für jede Verbindung wieder neue ID's. Es wird empfohlen, möglichst von diesen Einstelloptionen Gebrauch zu machen.<br />
<br />
==== Löschen der ClientID aus der readingList usw. ====<br />
Ist dies nicht möglich oder erwünscht, kann man auch die ClientID aus den readingList-, setList- und getList-Attributen entfernen. Dies ist jedenfalls solange unschädlich als nicht mehrere Geräte identische Topic-Pfade verwenden (daher die Empfehlung, insbesondere bei Tasmota-Geräten den ''default'' "sonoff" zu ändern).<br />
Beispielsweise wäre <code>attr Milight_Bridge readingList milight_hub_1370325:milight/LWT:.* {json2nameValue($EVENT) }</code> zu ändern in <code>attr Milight_Bridge readingList milight/LWT:.* {json2nameValue($EVENT) }</code><br />
Die über ''attrTemplate'' verfügbaren Konfigurationen verwenden in der Regel keine ClientID's bzw. entfernen diese.<br />
<br />
=== Wildcards in readingList und setList ===<br />
Auch in readingList und in setList sollten sich sog. wildcards verwenden lassen. Die Vorgehensweise ist jedoch unterschiedlich:<br />
<br />
In ''readingList'' werden normale regex-Ausdrücke verwendet. Ein Punkt steht daher z.B. für ein beliebiges Zeichen, alles zwischen zwei Topic-Tree-Elementen (getrennt typischerweise durch einen "/") kann man so schreiben: "[^/]+" (entspricht: "Mindestens ein Zeichen, das kein Schrägstrich ist"). Ergänzender Hinweis: Will man z.B. Informationen aus einem beliebigen Teil des Topic-trees extrahieren und als Reading-Namen verwenden, kann dies im Rahmen eines Perl-Aufrufs geschehen. Beispiele aus der mqtt2.template-file: OpenMQTTGateway_BT_scanner und OpenMQTTGateway_BT_gtag (letzteres überführt die Information, über welches Gateway bestimmte Informationen eingegangen ist jeweils in eigene Readings pro Gateway).<br />
<br />
In ''setList'' gelten dagegen die wildcard-Konventionen aus der MQTT-Welt. Dort steht "+" für einen austauschbaren Teil des Topic-Trees (zwischen zwei Schrägstrichen). Anmerkung: Bitte vorher prüfen, ob es wirklich sinnvoll ist, derart unspezifische Publishes vorzunehmen. Meist gibt es "Gruppen-Topics", auf die mehrere Geräte eines bestimmten Typs hören bzw. man kann dies dort (in der firmware bzw. auf den Konfigurationsseiten der Geräte) einstellen.<br />
<br />
=== Die JSON-Daten sollen ausnahmsweise nicht ausgepackt werden ===<br />
In manchen Fällen ist das automatische Auspacken der JSON-Payload nicht erwünscht. In diesen Fällen kann man einfach den gewünschten Reading-Namen in die readingList eintragen, statt der Anweisung, den JSON an json2NameValue() zu übergeben. Aus<br />
<pre><br />
attr MQTT_OwnTracks readingList owntracks/clouduser/mi6:.* { json2nameValue($EVENT) }\<br />
owntracks/clouduser/mi6/waypoints:.* { json2nameValue($EVENT) }\<br />
owntracks/clouduser/mi6/event:.* { json2nameValue($EVENT) }<br />
</pre><br />
wird dann:<br />
<pre><br />
attr MQTT_OwnTracks readingList owntracks/clouduser/mi6:.* json_mi6\<br />
owntracks/clouduser/mi6/waypoints:.* json_waypoints\<br />
owntracks/clouduser/mi6/event:.* json_event<br />
</pre><br />
Erforderlichenfalls kann man die Einträge auch doppelt erstellen, um sowohl den JSON wie auch die ausgepackten Readings zu erhalten.<br />
<br />
=== Die JSON-Daten vor dem auspacken manipulieren ===<br />
Aus diversen Gründen kann es zweckmäßig sein, einen bestimmten Wert der JSON-Payload zu ignorieren.<br />
Z.B. sendet ein Client statt eines Messwertes die Info "bad". Dieser Fehlerwert soll aus der JSON-Payload "ausgefiltert" werden:<br />
<pre><br />
attr DEVICE readingList <your topic>:.* { my $rets = json2nameValue($EVENT,'',$JSONMAP);; my %cleaned = map { $_,$rets->{$_} } grep { 'bad' ne $rets->{$_} } keys %{$rets};; return \%cleaned }<br />
</pre><br />
<br />
Oder auch einen Wert umzubenennen wenn die JSON-Payload nur ein Objekt beinhaltet:<br />
<pre><br />
attr DEVICE readingList <your topic>:.* {my %h=(0=>'SofortLaden',1=>'MinPV',2=>'NurPV',3=>'Stop',4=>'Standby');; return {ChargeMode=>$h{$EVENT}}}<br />
</pre><br />
<br />
=== Unnötige Konfigurationsinformationen verwerfen ===<br />
Siehe Einleitung und den [[MQTT2_CLIENT#ignoreRegexp|ignoreRegexp-Abschnitt zu MQTT2_CLIENT]].<br />
<br />
=== Weiterführende Themen ===<br />
==== Verbinden mehrerer FHEM-Instanzen über MQTT ====<br />
Wie im Hauptartikel zu [[MQTT#Kommunikation zu sonstigen FHEM-Geräten über MQTT|MQTT]] erläutert, gibt es mehrere Varianten, wie man mit Hilfe von FHEM aus Events an beliebigen Geräten MQTT-Messages erzeugen kann. So kann man z.B. Messdaten eines Systems über ein ''notify'' iVm. einer einfachen ''publish''-Anweisung an ein zweites FHEM schicken, das diese Daten dann z.B. mit Hilfe der MQTT2-Module auswerten kann.<br />
Damit dabei Nachrichten unterschiedlicher Quellen auch als getrennte Readings bzw. ggf. auch gesonderten MQTT2_DEVICE-Instanzen zugeordnet werden, sollte man entsprechende Topic-Strukturen wählen, die dann auch mit Hilfe einer geeigneten ''bridgeRegexp'' automatisiert ausgewertet werden kann, siehe z.B. dieser {{Link2Forum|Topic=107145|LinkText=Forumsthread}}:<br />
attr MQTT2_myMqttServer bridgeRegexp \<br />
SmartHome/MqttGenericBridge2/([A-Za-z0-9]*)/.*:.* "mgb2_$1"<br />
Dabei werden die betreffenden Informationen der entfernten FHEM-Instanz alle nach dem Schema ''SmartHome/MqttGenericBridge2/<Device-Name>/<Reading-Name>'' versendet.<br />
<br />
==== Umstellung von MQTT_DEVICE (und Derivaten wie XiaomiMQTTDevice) zu MQTT2_DEVICE ====<br />
Wer beabsichtigt, von der Implementierung MQTT+MQTT_DEVICE zu MQTT2-IO und MQTT2_DEVICE zu wechseln, sollte einige Punkte beachten. Viele diesbezügliche Fragen sind vor allem in {{Link2Forum|Topic=103762|LinkText=diesem Foren-Thread}}<br />
<br />
näher erläutert.<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=91394|LinkText=Thread, aus dem diese Anleitung ursprünglich entstanden ist}}<br />
* {{Link2Forum|Topic=91807|LinkText=Thread zum Tasmota-Device}}<br />
* {{Link2Forum|Topic=97989|LinkText=Thread, aus dem diese Anleitung für den eBus ursprünglich entstanden ist}}<br />
* {{Link2Forum|Topic=94495|LinkText=Neue templates einreichen}}<br />
* {{Link2Forum|Topic=94494|LinkText=Fragen, Wünsche und Kritik zu mqtt2.template}}<br />
* {{Link2Forum|Topic=116162|LinkText=Der MQTT-Workshop für MQTT2-Module}}<br />
<br />
== Hinweise ==<br />
<references /><br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:MQTT]]<br />
[[Kategorie:IP Components|IP Komponenten]]<br />
[[Kategorie:Other Components]]<br />
[[Kategorie:Interfaces]]</div>Otto123http://wiki.fhem.de/w/index.php?title=Hauptseite&diff=37372Hauptseite2022-03-31T08:01:37Z<p>Otto123: http auf https geändert</p>
<hr />
<div><!-- Banner für wichtige Mitteilungen --------- --> <br />
<!-- Banner für wichtige Mitteilungen --------- <br />
<div style="background-color: red; border: 1px solid maroon; border-radius: 8px; padding: 0 1em 1em 1em; font-size: bigger; text-align: center; color: white;"><br />
'''Es finden aktuell Wartungsarbeiten an der FHEM-Infrastruktur statt. Es kann daher zu kurzzeitigen Ausfällen und Beeinträchtigungen beim Zugriff auf FHEM-Dienste (Forum, SVN, Wiki, fhem.de, Alexa FHEM Connector) kommen'''<br />
<br />
'''Wir bitten um etwas Geduld. Sämtliche FHEM-Dienste werden im Laufe des Tages wieder wie gewohnt zur Verfügung stehen.'''<br />
</div><br />
Ende von Banner für wichtige Mitteilungen -------- --><br />
<!-- Ende von Banner für wichtige Mitteilungen -------- --><br />
<div><h1 style="font-family:sans-serif; font-size: 1.8em; border: none; text-align: center;">'''FHEM Wiki - Informationsportal zum FHEM SmartHome-Server'''</h1></div><br />
<br />
<div class="flexbox"> <!-- Beginn der Inhaltsboxen --><br />
<div class="mainpagebox" style="order: 1; flex: 1 1 80%; background-color:#cce5ff;"><br />
<div class="mw-collapsible mw-collapsed"><br />
'''Was ist FHEM?'''<br />
<div class="mw-collapsible-content"><br />
'''FHEM''' ([https://register.dpma.de/DPMAregister/marke/register/3020152110040/DE R]) ist ein in Perl geschriebener, GPL v2 lizensierter Server für die Heimautomatisierung. Man kann mit FHEM häufig auftretende Aufgaben automatisieren, wie z.B. Lampen / Rollladen / Heizung / usw. schalten, oder Ereignisse wie Temperatur / Feuchtigkeit / Stromverbrauch protokollieren und visualisieren.<br />
<br />
Das Programm läuft als Server, man kann es über WEB, dedizierte Smartphone Apps oder telnet bedienen, TCP Schnittstellen für JSON und XML existieren ebenfalls.<br />
<br />
Um es zu verwenden, benötigt man einen 24/7 Rechner (NAS, RPi, PC, MacMini, etc) mit einem Perl Interpreter und angeschlossene Interfaces wie CUL-, EnOcean-, Z-Wave-USB-Stick etc. für einen Zugang zu den Aktoren und Sensoren.<br />
</div></div></div><br />
<br />
<div class="mainpagebox" style="order: 4; background-color:#efefef;"><br />
'''Wie fange ich an?'''<br />
* [[Datei:Info_green.png|20px]][https://fhem.de/Heimautomatisierung-mit-fhem.pdf Heimautomatisierung mit FHEM][[Datei:Info_green.png|20px]]<br />DAS Einsteiger-PDF. '''Pflichtlektüre!'''<br /><br />
* [[Quick-Start]], english version: [[Quick-Start/en|Quick-Start]] <br />
* kleiner FHEM-Kurs, benötigt keine Hardware: [[Erste Schritte in FHEM]] / [[First steps in FHEM]]<br />
* [[Systemübersicht]]<br />
* Phasen eines FHEM-Projekts:<br />
** [[Planung]]<br />
** [[Umsetzung]] (Implementierung)<br />
** [[Betrieb]] ("Produktion")<br />
* [[:Kategorie:Glossary|Glossar]] (Erklärung für bestimmte Begriffe)<br /><br />
* [[:Kategorie:HOWTOS|Verschiedene HowTos]]<br /><br />
* [[:Kategorie:FAQ|Frequently asked Questions - Häufig gestellte Fragen mit Antworten]]<br /><br />
<!-- Verlinkte Wiki-Seite für Anfänger ist leer, darum auskommentiert<br />
<div align="right"><small>'''[[Help:Reading|How to read FHEMWiki]]'''</small></div>--><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 6; background-color:#fff0e0;"><br />
'''Unterstützte Hardware (Auszug)'''<br />
<br />
* [[:Kategorie:Hardware Typen|Hardware Typen]] - Funktionsbezogene Übersicht (z.B. [[:Kategorie:Unterhaltungselektronik|Unterhaltungselektronik / Multimedia]], [[:Kategorie:Heizungssteuerung|Heizungssteuerung]], [[:Kategorie:Energieverbrauchsmessung|Energieverbrauchsmessung]], etc.)<br />
* [[:Kategorie:Server Hardware|Server Hardware]] - Hardware, auf der FHEM installiert werden kann<br />
* [[:Kategorie:EMS Components|EMS]], [[:Kategorie:FHT Components|FHT]], [[:Kategorie:HMS Components|HMS]] Komponenten<br />
* [[:Kategorie:1-Wire|1-Wire System]]<br />
* [[:Kategorie:EIB/KNX|EIB/KNX Komponenten]]<br />
* [[:Kategorie:FS20 Components|FS20 Komponenten]]<br />
* [[:Kategorie:EnOcean Components|EnOcean Komponenten]]<br />
* [[:Kategorie:HomeMatic Components|HomeMatic Komponenten]]<br />
* [[:Kategorie:MAX|MAX! Komponenten]]<br />
* [[:Kategorie:panStamp|panStamp Komponenten]]<br />
* [[:Kategorie:Z-Wave Components|Z-Wave Komponenten]]<br />
* [[:Kategorie:ZigBee|Zigbee Komponenten]]<br />
* [[:Kategorie:IP Components|Geräte mit Webinterface ("IP")]]<br />
* [[:Kategorie:Other Components|Andere Komponenten / Sonstige Systeme]]<br />
<br />
<div align="right"><small>'''[[:Kategorie:Hardware|Alle Hardware-Kategorien]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 5; background-color:#F8F8FF;"><br />
'''Ideen und Lösungen'''<br />
<br />
* [[:Kategorie:Code_Snippets|Verschiedene kommentierte Lösungen und Code-Schnippsel]]<br />
* [[:Kategorie:Examples|Beispielanwendungen - Hardwarelösungen - Fremdsystemanbindungen]]<br />
* [[Anwendungsszenarien]]<br />
* [[Trick der Woche|Tipp der Woche]]<br />
* [[Wie kann ich...]]?<br />
<br />
<div align="right"><small>'''[[:Kategorie:FHEM|FHEM-Haupt-Kategorien]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 7; background-color:#FFFFE7;"><br />
'''Developers Corner'''<br />
<br />
* Informationen zur Modul-Entwicklung:<br />
** [[DevelopmentModuleIntro|Development Module Introduction]]<br />
** [[Meta|Development Module and Package Meta Data]]<br />
** [[DevelopmentModuleAPI|Development Module API]]<br />
** [[DevelopmentFHEMWEB-API|Development FHEMWEB API]]<br />
** [[Blocking Call]]<br />
** [[CoProcess]]<br />
** [[HttpUtils]]<br />
** [[DevIo]]<br />
** [[Guidelines zur Dokumentation]]<br />
** [[DevelopmentGuidelinesAV|Development Guidelines AV-Module]]<br />
<br />
<br />
* Organisatorisches:<br />
** [[How to write a patch]]<br />
** [[SVN Nutzungsregeln]]<br />
<br />
<div align="right"><small>'''[[:Kategorie:Development|Alle Artikel zu Development]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 3; background-color:#d7ffff;"><br />
'''FHEM Wiki News'''<br />
<div style="height:20em;overflow:scroll;overflow-x:hidden;">{{FHEMWiki_News}}</div><br />
<div align="right"><small>'''Mehr [[FHEMWiki:News|News]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 2; background-color:#e7f8ff;"><br />
'''Was ist FHEM Wiki?'''<br />
<br />
Das '''FHEM Wiki''' ergänzt die stets tagesaktuelle, von den zuständigen Entwicklern gepflegte {{Link2CmdRef}} (Befehls-Referenz) um weitergehende Informationen rund um FHEM. Im Wiki arbeiten Nutzer und Entwickler gemeinsam an zusätzlicher Dokumentation von FHEM und damit zusammenhängenden Themen.<br />
<br />
Das FHEMWiki stellt neben der {{Link2CmdRef}}, dem [http://forum.fhem.de/ Forum] und der [http://www.fhem.de FHEM] Seite die zentrale Informationsquelle rund um FHEM dar. Bedeutung und Zusammenspiel dieser Elemente [[Dokumentationsstruktur|ist hier]] erläutert. <br />
<br />
<!-- {{NUMBEROFUSERS}} [[Special:Listusers|Benutzer]] haben sich seit Mai 2013 registriert und {{NUMBEROFARTICLES}} Artikel geschrieben. ({{NUMBEROFEDITS}} Seitenänderungen bislang).--><br />
Bitte [[FHEMWiki:Support | unterstütze uns]] und hilf, [[:Kategorie:NeedsEditing| das Wiki zu erweitern]]. Vielen Dank!<br />
<br />
<div align="right"><small>'''Mehr [[FHEMWiki:Über_FHEMWiki|über FHEMWiki]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 8; background-color:#F8F8FF;"><br />
'''Letzte Änderungen'''<br />
<div style="font-size:small;color:black;"><small>{{Special:Recentchanges/8}}</small></div><br />
<div align="right"><small>'''Mehr [[Special:Recentchanges|Änderungen]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 9; flex: 1 1 80%; background-color:#FFFFAA;"><br />
'''Die letzten fünf neuen Seiten'''<br />
<small>{{Special:NewPages/5}}</small><br />
<div align="right"><small>'''Mehr [[Special:NewPages|Neue Seiten]]'''</small></div><br />
</div><br />
<br />
<div class="mainpagebox" style="order: 10; background-color:#DDD68F;"><br />
'''Administratives zum Wiki'''<br />
<br />
''Allgemeine Aktivitäten:''<br />
* Registrierung zur Mitarbeit: wende Dich bitte an einen [[FHEMWiki:Administratoren|Administrator]]<br />
* Basiswissen über die Mitarbeit an einem Wiki erarbeiten ([http://de.wikipedia.org/wiki/Wikipedia:Beteiligen z.B. Wikipedia])<br />
* Erweiterung und Korrektur von Artikeln, wo immer nötig<br />
* Ein(ig)e der [[Spezial:Gewünschte Seiten|gewünschten Seiten]] erstellen <br />
* Ideen aus dem [http://forum.fhem.de Forum] in bestehende oder neue Artikel einarbeiten<br />
* [[Spezial:Verwaiste Seiten|verwaiste Seiten]] in sinnvoller Weise verlinken<br />
* [[Spezial:Sackgassenseiten|Sackgassenseiten]] wikifizieren (Links auf andere Seiten einfügen)<br />
* [[Datei:Info_red.png|20px]] '''Tips / Regeln / Hinweise auf "[[FHEMWiki:Über FHEMWiki|Über FHEMWiki]]" beachten!''' [[Datei:Info_red.png|20px]]<br />
<br />
''Sonstiges:''<br />
* Zum Ausprobieren bitte die [[FHEMWiki:Sandbox]] benutzen<br />
* [//meta.wikimedia.org/wiki/Help:Contents Wiki Benutzerhandbuch].<br />
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Wiki-Konfigurationsvariablen]<br />
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]<br />
* [[FHEMWiki:Interna|Internes zu diesem Wiki]]<br />
</div><br />
<br />
</div><!-- Ende der Flexbox --><br />
[[Kategorie:FHEM]]</div>Otto123http://wiki.fhem.de/w/index.php?title=Sonos2mqtt&diff=37340Sonos2mqtt2022-03-25T23:02:09Z<p>Otto123: /* Dokumentationen und weitere Entwicklungen */ Link ins Forum zum Alarmhandling</p>
<hr />
<div>== Grundeinrichtung ==<br />
Die Grundeinrichtung ist bereits im Artikel [[MQTT2-Module - Praxisbeispiele#Sonos2Mqtt|MQTT2-Module - Praxisbeispiele]] beschrieben. Hier soll es um die praktische Verwendung und Erweiterung gehen. <br />
<br />
Für alle Erweiterungen wird versucht vorhandene Devices in FHEM zu verwenden.<br />
<br />
Viele Dinge werden derzeit noch entwickelt und können frei gestaltet werden - der Vorteil von generischen FHEM Devices.<br />
<br />
== Tipps zur Verwendung ==<br />
Die automatische Konfiguration setzt den alias entsprechend dem im Sonos vergeben Namen . Die langen MQTT2_RINCON_ Namen sind unhandlich und schlecht lesbar. Man kann Player mit einem devspec ansprechen, das simpelste ist:<br />
:<code>set alias=Büro play</code><br />
Oder alle Player<br />
:<code>set model=sonos2mqtt_speaker leaveGroup</code><br />
<br />
== Konfiguration der Player ==<br />
Mit dem Template sonos_bridge_comfort wird aus dem contrib Ordner eine Datei 99_sonos2mqttUtils.pm nachgeladen und aktiviert. Darin befindet sich der wesentliche Code, die sonos2mqtt Geräte selbst enthalten nur rudimentäre Aufrufe. <br />
<br />
Selbstverständlich kann man diese Datei jederzeit selbst gestalten (FHEM Menu:Edit Files) aber man sollte beachten, dass eine erneute Anwendung des Templates die Datei überschreibt.<br />
<br />
Man kann auch jederzeit diese Datei aus dem SVN neu laden:<br />
<syntaxhighlight lang="perl"><br />
{ Svn_GetFile("contrib/AttrTemplate/99_sonos2mqttUtils.pm", "FHEM/99_sonos2mqttUtils.pm", sub(){ CommandReload(undef, "99_sonos2mqttUtils") }) }<br />
</syntaxhighlight>Hauptroutine ist sonos2mqtt die mit zwei Parametern aufgerufen wird. <code>{sonos2mqtt($NAME,$EVENT)}</code><br />
<br />
Die Optik des Players wird mit der Routine <code>sonos2mqtt_devStateIcon</code> bestimmt.<br />
<br />
Man kann die Player mittels <code>attr a:model=sonos2mqtt_speaker webCmd volume</code> mit einem Slider in der Übersicht ausstatten.<br />
<br />
Ändert man die Sonoslandschaft, kann man auch alles einreißen und neu erzeugen lassen. Zunächst alles löschen (für die FHEM Kommandozeile):<syntaxhighlight lang="perl"><br />
{fhem("delete a:model=sonos2mqtt_speaker;;delete FileLog_MQTT2_RINCON.*");;qx(rm ./log/MQTT2_RINCON_*);;return ""}<br />
</syntaxhighlight>Danach muss man sonos2mqtt einfach neu starten: pm2 start ... bzw den docker container neu starten.<br />
<br />
== Befehle nachrüsten ==<br />
Um Befehle in der setList / getList / readingList nachzurüsten gibt es die Routine <code>sonos2mqtt_mod_list(devspec,attrName,line)</code> <br />
<br />
Vorhandenen Zeilen werden ersetzt. Identifiziert wird nur der erste Teil bis zum ":". Beispiel für die Komandozeile: <br />
<br />
<code>{sonos2mqtt_mod_list('a:model=sonos2mqtt_bridge','readingList','sonos/RINCON_([0-9A-Z]+)/Reply:.* Reply')}</code> <br />
<br />
== Sprachausgabe ==<br />
Man hat zwei Möglichkeiten, dies umzusetzen: <br />
# Text2Speech FHEM intern<br />
# Mit dem sonos text to speech Server https://svrooij.io/sonos2mqtt/<br />
<br />
=== Text2Speech Variante einrichten ===<br />
Zwei zusätzliche Geräte sind notwendig:<br />
* [[Text2Speech]] im Servermodus, erzeugt mp3 Dateien im cache Verzeichnis und legt einen Link im Reading httpName ab.<br />
* Ein HTTP Server stellt die Dateien im gleichen Verzeichnis bereit<br />
'''Hinweis''': Für die vollständige Funktion und Installation von Text2Speech ist die Commandref zu beachten! Für das unten im Beispiel verwendete Feature UseMP3Wrap muss das Tool mp3wrap installiert werden (z.B. <code>apt install mp3wrap</code>). Dies ist bei längeren Texten und bei der Verwendung von eingebetteten festen Sounds existenziell!<br />
<br />
Für die Funktion ist wichtig, dass das Sonos System den Host im Link zur Datei richtig auflösen kann. Deshalb wird der Hostname und Port des Servers im Reading host des TTS Device als Name oder IP Adresse abgelegt! Dies kann entweder mit dem hier gezeigten Befehl oder vollständig manuell erfolgen. Für FHEM innerhalb Docker muss man die Adresse des Docker Host angeben.<br />
<syntaxhighlight lang="perl"><br />
defmod SonosTTS Text2Speech none<br />
attr SonosTTS TTS_UseMP3Wrap 1<br />
attr SonosTTS TTS_Language Deutsch<br />
attr SonosTTS userReadings httpName:lastFilename.* {'http://'.ReadingsVal($name,'host','set host:port first').'/fhem/'.ReadingsVal($name,'lastFilename','')}<br />
attr SonosTTS TTS_CacheFileDir cache<br />
setreading SonosTTS host {(qx(hostname -s|tr -d '\n').':'.InternalVal('WEB','PORT','8083'))}<br />
#setreading SonosTTS host {((split(' ', qx(hostname -I)))[0].':'.InternalVal('WEB','PORT','8083'))}<br />
#setreading SonosTTS host <hostname>:<port><br />
<br />
defmod SonosSpeakWeb HTTPSRV cache cache SonosSpeakWeb<br />
</syntaxhighlight><br />
Der Sprachausgabe Befehle im Player Device läuft in 3 Schritten:<br />
# mit dem TTS Gerät wird die mp3 Datei erzeugt,<br />
# mit dem sleep wird auf die Fertigstellung gewartet,<br />
# die Datei wird mit <code>set Player notify volume uri</code> abgespielt.<br />
Durch den "sonos2mqtt notify" Befehl wird die laufende Umgebung wiederhergestellt.<br />
* Wird der Sprachbefehl an den Gruppenmaster gesendet wird die mp3 Datei in der gesamten Gruppe gespielt. <br />
* Wird der Sprachbefehl an ein Mitglied einer Gruppe gesendet (nicht den Master) wird die Gruppe aufgetrennt und später wieder hergestellt.<br />
Es sind zwei Befehle zur Sprachausgabe eingebaut: <br />
<br />
=== sayText Befehl ===<br />
Dieser Befehl orientiert sich an den FHEM [[DevelopmentGuidelinesAV|DevelopmentGuidelines]] und sammelt "gleichzeitig" eintreffende Sprachnachrichten, damit nichts verloren geht. Informationen im Forum dazu in {{Link2Forum|Topic=111711|Message=1100112|LinkText=diesem Beitrag}}.<br />
<br />
Die Lautstärke wird separat in SonosTTS gesetzt: <code>setreading SonosTTS vol 15</code>, ebenso die Sprache (einmalig bei der Einrichtung oder bei Bedarf zwischendurch) <code>attr SonosTTS TTS_Language Deutsch</code> <br />
<br />
''Hinweis: Der Befehl <code>set SonosTTS volume xx</code> hat im Servermodus des Devices keine Wirkung!''<br />
=== Speak Befehl ===<br />
Dieser Befehl ist ähnlich wie der in der FHEM-Sonos Umgebung:<br />
:<code>set Player speak <volume> text</code><br />
<br />
Verwendet man diesen Syntax (mit Sprache und Stimme am Anfang), wird automatisch der speak Befehl an die sonos-tts abgesetzt. Die sonos-tts muss man separat installieren/integrieren!<br />
<br />
<code>set EG.KU.Sonos speak de-DE Vicki 25 Test</code><br />
<br />
Will man keine laufenden Sendung unterbrechen sondern einfach eine Ansage machen und danach etwas starten, kann man so vorgehen:<br />
<syntaxhighlight lang="perl"><br />
set SonosTTS tts Hier steht die Ansage;sleep SonosTTS:playing:.0 ; set alias=PlayerAlias playUri [SonosTTS:httpName]<br />
</syntaxhighlight><br />
<br />
=== Volume Befehl ===<br />
Der Befehl akzeptiert einen zweiten Wert als Startwert d.h. set volume 25 10 setzt sofort auf 10 und startet dann fading auf 25. Ein zweiter Wert -1 erzeugt ein fading vom aktuellen Wert auf den angegebenen.<br />
<br />
==== Spiele feste Sounds ====<br />
Generell kann man feste mp3 Dateien (Klingeltöne, Klänge usw.) auch im cache Verzeichnis ablegen und direkt mit dem Link starten. <br />
<br />
Es gibt zahlreiche Soundquellen im Internet, ist der gewünschte Sound dabei, kann man ihn innerhalb FHEM herunterladen und an Ort und Stelle platzieren. (Beispiel ohne und mit Umbennung)<br />
<syntaxhighlight lang="perl"><br />
"wget -qP ./cache https://cdn.smartersoft-group.com/various/pull-bell-short.mp3"<br />
"wget -qO ./cache/KlingelTon.mp3 https://cdn.smartersoft-group.com/various/pull-bell-short.mp3"<br />
</syntaxhighlight><br />
Vergewissern ob der gewünschte Sound auch da ist: {qx(ls -lha ./cache)}<br />
<br />
Mit set magic kann man dabei einfach Teile aus anderen Readings holen.<br />
<syntaxhighlight lang="perl"><br />
set alias=Büro notify 25 {('http://[SonosTTS:host]/fhem/cache/KlingelTon.mp3')}<br />
</syntaxhighlight><br />
Man kann auch den setter im Gerät erweitern <code>{sonos2mqtt_mod_list('a:model=sonos2mqtt_speaker','setList',q(playSound:textField ....))}</code> :<br />
<syntaxhighlight lang="perl"><br />
playSound:textField {my $tts="SonosTTS";my ($cmd,$vol,$file)=split(' ', $EVENT,3);$file=($file=~m/.*\.mp3$/)?"$file":"$file.mp3";fhem("set $NAME notify $vol http://[$tts:host]/fhem/[a:$tts:TTS_CacheFileDir]/$file")}<br />
</syntaxhighlight><br />
Damit sind dann dieser Syntax möglich:<br />
<syntaxhighlight lang="perl"><br />
set alias=Büro playSound 40 KlingelTon.mp3<br />
</syntaxhighlight><br />
oder ohne Dateiendung (wird auf mp3 gesetzt)<br />
<syntaxhighlight lang="perl"><br />
set alias=Büro playSound 40 KlingelTon<br />
</syntaxhighlight><br />
<br />
=== SonosBridge ===<br />
Die SonsoBridge enthält bereits ein paar zentrale Funktionen und Readings, z.B. wird beim Laden der Favoritenliste ein Reading favlist und grouplist erzeugt, welches zur Erweiterung der Player mit Auswahllisten dienen kann.<br />
<br />
=== Player mit Favoritenliste und Gruppenliste ausstatten ===<br />
Wenn nicht schon geschehen muss man jetzt die Favoriten zum ersten Mal einlesen: get SonosBridge Favorites<br />
<br />
Nachdem die SonosBridge "aufgerüstet" ist, kann man allen Playern die Favoritenliste zum Auswählen eintragen. Beide Zeile sind für die FHEM Kommandozeile und verwenden die Routine aus der 99_sonos2mqttUtils.<br />
<syntaxhighlight lang="perl"><br />
{sonos2mqtt_mod_list('a:model=sonos2mqtt_speaker','setList','joinGroup:'.ReadingsVal((devspec2array('a:model=sonos2mqtt_bridge'))[0],'grouplist','').q( {sonos2mqtt($NAME,$EVENT)}))}<br />
{sonos2mqtt_mod_list('a:model=sonos2mqtt_speaker','setList','playFav:'.ReadingsVal((devspec2array('a:model=sonos2mqtt_bridge'))[0],'favlist','').q( {sonos2mqtt($NAME,$EVENT)}))}<br />
</syntaxhighlight><br />
Man kann den playFav Befehl auch im set Befehl mit einem Teil des Favoriten Namen verwenden. Enthält die Favoritenliste z.B. Radio Leipzig würde der auch mit diesem Befehl angesteuert werden:<syntaxhighlight lang="perl"><br />
set alias=Bad playFav leipzig<br />
</syntaxhighlight><br />
<br />
=== Listen der Favoriten Radios und Playlist erstellen ===<br />
Im Sonos System kann man an (mindestens) drei Stellen Favoriten hinterlegen: Sonos-Favoriten, Sonos-Playlisten, TuneIn: Meine Radiosender<br />
<br />
Diese drei Listen kann man einlesen und für die einfache Suche und Auswahl verwenden. Der play befehl akzeptiert dazu den Syntax und sucht in den entsprechenden Listen.<br />
<br />
Diese Play Befehle starten nicht sofort sondern erst nach einem folgenden set ... play. Damit kann man etwas vorbereiten und gezielt starten.<br />
<br />
<code>set alias=Büro play Favorite Deutschlandfunk</code><br />
<br />
<code>set alias=Büro play Radio HitRadio</code><br />
<br />
<code>set alias=Büro play Playlist Meine Hits</code><br />
<br />
Die Listen dazu muss man einmalig (bzw. bei Veränderungen) einlesen:<br />
<pre><br />
get SonosBridge Reply Playlists;sleep SonosBridge:Reply.*;setreading SonosBridge Playlists [SonosBridge:Reply]<br />
get SonosBridge Reply Favorites;sleep SonosBridge:Reply.*;setreading SonosBridge Favorites [SonosBridge:Reply]<br />
get SonosBridge Reply Radios;sleep SonosBridge:Reply.*;setreading SonosBridge Radios [SonosBridge:Reply]<br />
</pre><br />
<br />
Beispiel für ein Guten Morgen Radio:<br />
<pre><br />
set alias=BadWanne,alias=Kueche joinGroup Bad;<br />
set alias=BadWanne,alias=Bad volume 13 6;<br />
set alias=Bad play Favorite Deutschlandfunk.Kultur.RP;<br />
set alias=Kueche volume 18 8;<br />
sleep 0.2;set alias=Bad play<br />
</pre><br />
<br />
=== Radioliste durchtasten ===<br />
Will man eine Liste von bestimmten Radiostation mit einem Taster "durchtasten" kann man das wie folgt tun:<br />
<br />
Eine eigene Radio Liste in ein Reading schreiben (Die Namen müssen zumindest in Teilen mit den Favoriten Titeln übereinstimmen)<br />
<syntaxhighlight lang="perl"><br />
setreading model=sonos2mqtt_bridge favRadios Deutschlandfunk Kultur,Radio Leipzig,Radio Station 3 <br />
</syntaxhighlight><br />
Im Template wird durch ein userReading die Liste beim Auslesen der Favoriten vorbelegt.<br />
<br />
Der Befehl zum weiterschalten. Jedesmal wenn dieser Befehl ausgeführt wird, wird der nächste Favorit gestartet.<br />
<br />
Wird eine Radiosender gespielt wird bei einem set ... next auf den nächsten Sender in dieser Liste geschaltet und der transportState wird beibehalten.<br />
<br />
=== Weitere Ideen ===<br />
Will man vor dem Radiostart noch die Ansage des Senders haben, geht das zwar auch mit dem speak Befehl, die direkte Ausgabe ohne Restore der Umgebung (sonos2mqtt notify) ist aber effektiver.<br />
<br />
Damit das funktioniert müssen wir die Events einschränken: <br />
<syntaxhighlight lang="perl"><br />
attr model=sonos2mqtt_speaker event-on-change-reading .*<br />
{my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];;my $r=Each($dev,ReadingsVal($dev,'favRadios',''));;my $play = (devspec2array('alias=Büro'))[0];;my $tts="SonosTTS";;fhem("set $tts tts Es folgt $r;;sleep $tts:playing:.0;;set $play playUri [$tts:httpName];;sleep $play:play;;sleep $play:PLAYING;;sleep $play:STOPPED;;set $play playFav $r")}<br />
</syntaxhighlight><br />
Kurze Erklärung zum Code <br />
* ermittelt den nächsten Radiosender in der Liste,<br />
* erzeugt die Ansage "Es folgt SenderXY",<br />
* wenn die mp3 Datei fertig erzeugt ist wird sie mit dem Befehl playUri an den Player gesendet,<br />
* es wird eine Eventfolge abgewartet -> play / PLAYING / STOPPED,<br />
* danach wird der Radiosender gestartet.<br />
Der Code ist so einfach und relativ "steif" für die Kommandozeile. Man kann das auch in einen Setter packen:<br />
<syntaxhighlight lang="perl"><br />
toggleRadio:noArg {my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];my $r=Each($dev,ReadingsVal($dev,'favRadios',''));my $tts="SonosTTS";fhem("set $tts tts Es folgt $r;sleep $tts:playing:.0;set $NAME playUri [$tts:httpName];sleep $NAME:play;sleep $NAME:PLAYING;sleep $NAME:STOPPED;set $NAME playFav $r")}<br />
</syntaxhighlight><br />
<br />
== Dokumentationen und weitere Entwicklungen ==<br />
ToDo<br />
<br />
Erweiterung um Alarmhandling siehe [https://forum.fhem.de/index.php/topic,111711.msg1162031.html#msg1162031 Forum]<br />
<br />
[[Kategorie:MQTT]]</div>Otto123http://wiki.fhem.de/w/index.php?title=HM-MOD-RPI-PCB_HomeMatic_Funkmodul_f%C3%BCr_Raspberry_Pi&diff=37258HM-MOD-RPI-PCB HomeMatic Funkmodul für Raspberry Pi2022-02-22T19:11:06Z<p>Otto123: /* Variante mit ser2net */ ser2net Version 4 eingearbeitet</p>
<hr />
<div>{{Infobox Hardware<br />
|Bild=HM-MOD-RPI-PCB.jpg<br />
|Bildbeschreibung=HomeMatic Funkmodul für Raspberry Pi <br />
|HWProtocol=HomeMatic<br />
|HWType=Gateway<br />
|HWCategory=HomeMatic<br />
|HWComm=868,3/869,525 MHz<br />
|HWChannels=n/a<br />
|HWVoltage=1,8–3,6 V&nbsp;DC<br />
|HWPowerConsumption=50 mA max.<br />
|HWPoweredBy=RasPi<br />
|HWSize=19x41x14mm<br />
|HWDeviceFHEM=[[HMUARTLGW]]<br />
|HWManufacturer=ELV / eQ-3 <br />
}}<br />
Das [[HM-MOD-RPI-PCB HomeMatic Funkmodul für Raspberry Pi]] ist eine Platine, die auf die GPIO-Schnittstelle des [[Raspberry Pi]] aufgesteckt werden und damit als [[Interface]] zu [[HomeMatic]] Geräten dienen kann. <br />
<br />
== Aufbau, Einsatz und grundsätzliche Funktionsweise ==<br />
Das Modul besteht aus zwei Teilplatinen, die von eQ-3 über den Internetshop von ELV (als Bausatz ab etwa 20€, fertig montiert ab etwa 30€) verkauft werden. <br />
<br />
Das eigentliche Funkmodul wird mit HM-MOD-RPI-UART bezeichnet (und trägt den Aufdruck UART, im obigen Bild hinten teilweise verdeckt und mit der umrandeten 7 versehen), sie hat fünf einpolige Buchsen mit dem Rastermaß 2mm. Die Zusatzplatine zum Anschluss an die GPIO wird mit TRX1 bezeichnet (im obigen Bild vorn sichtbar mit dem Aufdruck HM-MOD-RPI-PCB), sie hat zwei sechspolige Buchsen mit dem Rastermaß 2,54mm. Die Zusatzplatine enthält im Wesentlichen Stützkondensatoren und erlaubt einen direkten Anschluss an die GPIO eines Raspberry Pi.<br />
* Der vorgesehene Einsatz als Aufsteckmodul auf den GPIO Port des Raspberry erfordert eine Modell abhängige Konfiguration. Diese wird im Setupbereich des Wiki Artikel zum [[Raspberry_Pi]] beschrieben.<br />
<br />
{{Randnotiz|RNText=Neben der hier beschriebenen Option das HM-MOD-RPI-PCB zu verwenden, besteht auch die Möglichkeit, damit auf demselben Raspberry eine virtuelle CCU zu betreiben, welche dann mit [[HMCCU]] eingebunden werden kann. Hierfür stehen mehrere Virtualisierungsvarianten zur Verfügung; eine kurze Darstellung, wie das mittels YAHM funktioniert, ist in diesem {{Link2Forum|Topic=79670|Message=718289|Forenbeitrag}} zu finden.}}Mit dieser Platine in Verbindung mit dem FHEM-Modul [[HMUARTLGW]] ist nur der Betrieb von BidCoS-Geräten möglich. Zur Einbindung von Geräten, die HM-IP verwenden, ist derzeit (Stand Juni 2018) noch zwingend eine (ggf. virtualisierte) CCU2 oder neuer erforderlich.<br />
<br />
Das Funkmodul stellt auf dem 868MHz-Frequenzband eine Verbindung zu Homematic-Geräten her. Das Modul wird über die serielle Schnittstelle an ein Gerät gekoppelt, dass diese serielle Schnittstelle auswerten und die Information dann weiterverarbeiten kann. Hier kommen beispielsweise in Frage: Raspberry Pi, WeMos mini, ESP8266-Module, USB-serielle Adapter. Bereits das UART-Funkmodul erlaubt eine serielle Anbindung (die entsprechenden Schnittstellen Tx und Rx sind vorhanden, sie basieren auf 3,3V), es kann aber auch die zusätzliche TRX1-Platine seriell verbunden werden. Des weiteren gibt es im Forum ein {{Link2Forum|Topic=56606}}, in dem PeMue eine eigene Platinenversion (Schaltplan, Stückliste und vieles mehr) vorstellt.<br />
<br />
=== Platine 1 -PCB-Modul ===<br />
[[Datei:Hm-uart trx1.png|thumb|right|200px|Verkabelung beim HM-MOD-PCB]]<br />
Am einfachsten ist es sicherlich, das kombinierte PCB-Modul (also beide Platinen UART und TRX1 durch eine Pfostenleiste miteinander verlötet) direkt auf die GPIO des Raspberry Pi aufzustecken. Das Bild rechts zeigt die entsprechende Verkabelung. Dabei ist zu beachten, dass sich nicht zwei Module die GPIO teilen können. Steckt schon ein Modul im Raspberry Pi, muss der Anschluss per USB, in einem zweiten Raspberry Pi oder per WLAN gewählt werden.<br />
<br clear="all"><br />
<br />
=== Platine 2 -UART-Modul ===<br />
[[Datei:Verkabelung-HM-MOD-uart.png|thumb|right|200px|Verkabelung beim HM-MOD-UART]]<br />
Will man das TRX1-Modul nicht verwenden, so kann man auch das UART-Modul direkt mit Rx/Tx des Raspberry Pi verbinden. Das Bild rechts zeigt die entsprechende Verkabelung. Hier sollten allerdings Stützkondensatoren an die Stromversorgung des UART angebracht werden, da Spannungsschwankungen sonst zu schwer interpretierbaren Fehlern führen können. Die Anschlüsse sind dem nachstehenden Bild zu entnehmen, allerdings ist hier nicht die UART-Platine, sondern das TRX1-Gegenstück zu sehen!<br />
<br />
Sowohl serielle Schnittstelle des Raspberry Pi als auch das UART-Modul arbeiten mit 3,3V arbeitet, so dass man keine Spannungsteiler benötigt. Mehr Informationen zu den GPIOs findet man unter diesem [http://www.netzmafia.de/skripten/hardware/RasPi/RasPi_GPIO.html Link].<br />
<br />
=== Zusammenbau und Verwendung ===<br />
Man sollte die Antenne aus dem Gehäuse schauen lassen oder gar eine externe Antenne anbringen. Idealerweise sollte das Ende der Drahtantenne mit einem Klecks Heißkleber oder ähnlichem isoliert werden; eine Berührung vor allem mit dem Innenleben des Raspberry Pi muss vermieden werden!<br />
<br />
Beide Platinen können zusammengebaut oder auch nur das UART Modul getrennt verwendet werden. <br />
[[Datei:HM-MOD-UART-Unten.jpg|thumb|left|200px|Montage des Moduls HM-MOD-UART unten]]<br />
[[Datei:HM-MOD-UART-Oben.jpg|thumb|right|200px|Montage des Moduls HM-MOD-UART oben]]<br />
Die originale Montage in der Anleitung von eq3 sieht den Zusammenbau PCB Modul unten und UART Modul oben vor (Bild rechts). Damit schließen die kleineren Pi-Gehäuse nicht richtig: das Gesamtmodul klemmt am Deckel.<br />
<br />
Man kann ohne weiteres das UART-Modul unter dem PCB-Modul montieren (Bild links), damit wird die Gesamthöhe geringer und es passt problemlos in jedes Gehäuse. Bitte vorher die genaue Situation prüfen: Es kann sein, dass damit Kühlkörper oder ähnliches seitens der Pi-Platine stören.<br />
<br />
Man kann auch das PCB Modul kürzen und das UART Modul mit kurzen Drähten in einer Ebene verbinden (kein Bild).<br />
<br />
Bitte auf die richtige Lage (Bilder) beim Zusammenbau und auf Lötzinnbrücken achten. Da die Anschlüsse durchkontaktiert sind, bewirkt eine falsche Positionierung des UART-Moduls im schlimmsten Fall einen Kurzschluss. Man erkennt auf beiden Bildern, dass beim UART-Modul die Pinleiste einmal auf der einen und ein andermal auf der anderen Seite des Moduls angelötet werden muss! <br />
<br />
<br clear="all"><br />
== Verwendung ==<br />
Das Modul muss, um verwendet zu werden, mit einer Hardware verbunden werden. Hier kommen mehrere Möglichkeiten in Betracht, die jeweils vor und Nachteile aufweisen. Sie werden jetzt nacheinander präsentiert. <br />
<br />
=== Anbindung an die GPIO im Raspberry ===<br />
==== Installation ====<br />
Man kann das HM-MOD-RPI-PCB Modul direkt in die GPIOs eines Raspberry stecken. Das hat den Vorteil, dass das Gerät (mehr oder weniger) sofort betriebsbereit ist, aber den Nachteil, dass am RPi vorher mehrere Installationen zu erfolgen haben. <br />
<br />
Die '''<big>notwendige Konfiguration der Schnittstelle</big>''' ist hier beschrieben: [[Raspberry_Pi#Verwendung_UART_f.C3.BCr_Zusatzmodule|Verwendung UART für Zusatzmodule]].<br />
* Der Einsatz in FHEM für CUL_HM erfolgt mit dem Modul [[HMUARTLGW]]<br />
* Die automatische Erkennung der USB Geräte muss deaktiviert werden: <br />
::<code>attr initialUsbCheck disable 1</code><br />
: Nach dem Setzen des Attributes muss die Änderung gespeichert werden (siehe [[save]])!<br />
<br />
=== Anbindung über das Netzwerk===<br />
Wenn das HM-MOD-RPI-PCB Modul an einen RPi angeschlossen ist, kann man dieses Modul danach auch im Netzwerk verfügbar machen. Dieser Pi kann beliebige Aufgaben erledigen, nur das HM-MOD-RPI-PCB Modul selbst darf nicht lokal verwendet werden. Somit kann man bei einem Umzug des FHEM Servers das HM-MOD-RPI-PCB Modul einfach weiterhin nutzen oder einen vorhandene RaspberryPi zum "HMLAN" umbauen. Sollte man aber ausschließlich Zugriff auf das HM-MOD-RPI-PCB Modul im Netzwerk benötigen, empfiehlt sich auch aus Kostengründen (Stromverbrauch) eine andere Lösung.<br />
<br />
Achtung! Auch über das Netzwerk darf immer '''nur eine Instanz auf das freigegebene Modul zugreifen'''!<br />
<br />
Die Konfiguration der Schnittstelle ist in jedem Fall gleich: [[Raspberry Pi#Verwendung UART für Zusatzmodule|Verwendung UART für Zusatzmodule]]. <br />
<br />
Die [[HM-MOD-RPI-PCB HomeMatic Funkmodul für Raspberry Pi#Definition in FHEM 2|Definition in FHEM]] erfolgt dann mit dem Parameter <code>uart:// .</code><br />
<br />
===== Variante mit ser2net =====<br />
[https://forum.fhem.de/index.php/topic,124384.0.html '''Achtung!''' Mit der Version 4 hat sich die Konfiguration geändert!]<br />
<br />
Diese Installation auf dem Pi mit dem HM-MOD-RPI-PCB Modul bitte im Kontext <code>sudo su</code> ausführen. <br />
<br />
Bis zur ser2net '''Version 3'''<br />
<br />
<pre>apt-get install ser2net<br />
echo "4000:raw:0:/dev/ttyAMA0:115200 NONE 1STOPBIT 8DATABITS HANGUP_WHEN_DONE" >> /etc/ser2net.conf<br />
# Den Dienst neu starten<br />
systemctl restart ser2net</pre>Ab der ser2net '''Version 4''' erfolgt die Konfiguration mit im anderen Format /etc/ser2net.yaml. [https://man.archlinux.org/man/community/ser2net/ser2net.yaml.5.en manpage]<syntaxhighlight lang="bash"><br />
cp /etc/ser2net.yaml /etc/ser2net.yaml.sav<br />
cat <<EOI > /etc/ser2net.yaml<br />
%YAML 1.1<br />
---<br />
# HM_MOD-RPI-PCB<br />
connection: &con01<br />
accepter: tcp,4000<br />
connector: serialdev,<br />
/dev/ttyAMA0,<br />
115200n81,local<br />
EOI<br />
</syntaxhighlight>In der Service unit müssen Abhängigkeiten eingefügt werden, sonst startet der Dienst nach einem System reboot nicht:<br />
<br />
<code>systemctl edit --full ser2net</code> siehe auch [[Fhem.service (systemd unit file)|Wiki (systemd unit file)]]<syntaxhighlight lang="bash"><br />
[Unit]<br />
Description=Serial port to network proxy<br />
Documentation=man:ser2net(8)<br />
After=network-online.target<br />
Wants=network-online.target<br />
<br />
[Service]<br />
EnvironmentFile=-/etc/default/ser2net<br />
ExecStart=/usr/sbin/ser2net -n -c $CONFFILE -P /run/ser2net.pid<br />
Type=exec<br />
Restart=on-failure<br />
<br />
[Install]<br />
WantedBy=multi-user.target<br />
</syntaxhighlight><br />
<br />
===== Variante mit socat =====<br />
Installation auf dem Pi wo das Modul steckt bitte so installieren. <br />
:<code>sudo apt-get install socat</code><br />
Zum Test kann man socat in der Kommandozeile starten<br />
:<code>sudo socat TCP4-LISTEN:2000,fork,reuseaddr /dev/ttyAMA0,raw,echo=0,b115200 </code><br />
<br />
Für den dauerhaften Betrieb muss der Start von socat automatisch erfolgen. <br />
Auf einem Debian Jessie mit systemd legt man z.B. einen Dienst durch folgende Datei an:<br />
/etc/systemd/system/hmlangw.service<br />
<syntaxhighlight lang="Text"><br />
[Install]<br />
WantedBy=multi-user.target<br />
Type=forking<br />
<br />
[Service]<br />
ExecStart=/usr/bin/socat TCP4-LISTEN:2000,fork,reuseaddr /dev/ttyAMA0,raw,echo=0,b115200<br />
User=root<br />
Restart=always<br />
RestartSec=10<br />
</syntaxhighlight><br />
Dann kann mit <br />
:<code>sudo systemctl enable hmlangw </code><br />
der Service zum Autostart konfiguriert werden.<br />
<br />
=== Anbindung mit USB-Adapter ===<br />
{{Randnotiz|RNTyp=r|RNText=Bitte beachten: Es sind immer wieder Exemplare mit [[CP2102]] im Umlauf, die mehr als 3.3V Spannung liefern! Vor dem Verbinden mit dem HM-Modul sollte daher geprüft werden, ob der interne Spannungswandler ordnungsgemäß funktioniert und wirklich nur 3.3V liefert. Bei den blauen Micro-Modulen kann man den Fehler nach dieser Anleitung beheben: [https://www.silabs.com/community/interface/forum.topic.html/cp2102_3_3v_outputi-EaVr Beitrag von PBudmark vom 08.07.2017].}}<br />
[[Datei:PL2102 Modul.png|200px|thumb|right|Mod zur Herstellung der korrekten Spannung]]<br />
Das UART-Modul kann ebenfalls mit einem USB-Adapter an ein USB-fähiges Gerät angeschlossen werden. Allerdings ist hier wieder auf den Spannnungspegel zu achten, unbedingt einen USB-Adapter mit 3,3 Volt Pegel nehmen! Der Vorteil ist hier, dass hohe Geschwindigkeiten möglich sind und nicht wie bei WLAN Latenzen auftreten, aber es muss eben ein USB-Anschluss verfügbar sein.<br />
<br />
Grundsätzlich bewährt haben sich z.B. Modelle mit einem [[CP2102]], der auch ausreichend Stromreserven zum Betrieb des Moduls bietet. Dabei ist die serielle Schnittstelle wie üblich zu kreuzen, also<br />
<br />
'''Verschaltung'''<br />
3.3V <-> 3.3V<br />
GND <-> GND<br />
Rx <-> Tx<br />
Tx <-> Rx<br />
<br />
=== Anbindung mit ESP8266 ===<br />
Hier ist der Vorteil, dass vor Ort nur WLAN verfügbar sein muss. Nachteilig kann sich auswirken, dass WLAN hohe Latenzen aufweisen kann und daher manchmal der Eindruck entsteht, das Modul sei gerade abwesend. <br />
<br />
Zum Anschluss kann ein beliebiger ESP8266 verwendet werden. Mit einigen Versionen (Beispiele im Forum: {{Link2Forum|Topic=102141|Message=956606|LinkText=ESP07}} sowie {{Link2Forum|Topic=102141|LinkText=Wemos mini pro}}) ist eine Anbindung anscheinend nicht oder nur schwer möglich - wobei dies auch an nicht funktionsfähigen Clonen liegen kann oder beim Wemos daran, dass dort die USB-Schnittstelle mit Tx/Rx nicht kalkulierbare Störungen auslöst. Beim ESP8266 gibt es zwei verschiedene Firmware-Möglichkeiten: ESPLink oder ESPEasy. <br />
<br />
[https://github.com/jeelabs/esp-link ESPLink] ist eine sehr stabile und nicht mehr aktiv weiterentwickelte Firmware, die die serielle Schnittstelle direkt mit WLAN verbindet und ohne größere Schwierigkeiten eingerichtet werden kann und funktioniert. Sie nutzt die serielle Schnittstelle des ESP. Allerdings erlaubt ESPLink nicht die Nutzung anderer GPIOs, so können beispielsweise keine anderen Sensoren mit angeschlossen bzw. ausgelesen werden. Verwendet man ESP-Link, so muss neben der WLAN Konfiguration nur das Pin Assignment konfiguriert werden. Alle Pins auf disabled stellen.<br />
<br />
[https://www.letscontrolit.com/wiki/index.php/ESPEasy ESPEasy] (neue Version: ESPMega) wird beständig weiterentwickelt und gestattet es, weitere Sensoren anzuschließen und deren Werte auszulesen. Insbesondere kann man mit ESPEasy auch zwei weitere Pins nutzen, um eine serielle Schnittstelle zu simulieren (so genannter ''serieller Server''). Man spricht auch von einer ''swapped'' Schnittstelle. Die {{Link2Forum|Topic=62651|LinkText=Platine von amunra}} nutzt eine solche Schnittstelle. <br />
Allerdings gibt es mit einigen ESP8266-Geräten Schwierigkeiten, diese serielle Schnittstelle zu nutzen. So ist etwa ein serieller Server mit neueren ESP-Versionen anscheinend nicht lauffähig (siehe dazu {{Link2Forum|Topic=75422|LinkText=diesen Thread}}). Es gibt eine ältere Firmware-Version von PeMue, die unmittelbar funktionsfähig scheint, siehe dazu {{Link2Forum|Topic=86592|LinkText=diesen Forenthread}}. <br />
<br />
[[Datei:Esp-pin Konfiguration HMUART.png|200px|mini|esp-link Pin-Konfiguration beim swapped Server]]<br />
Bei der seriellen Schnittstelle (da die ESP auf 3,3V laufen, sind keine Spannungsteiler erforderlich) findet man die Verschaltung unten. Bei der ''swapped'' Schnittstelle wird auf die digitalen Pins D7/D8 zurückgegriffen (siehe auch unten). Die letztere Verschaltung erfordert eine entsprechende Implementierung der Schnittstelle in der Firmware selbst, die beispielsweise bei ESPEasy unter Umständen nicht gegeben ist oder selbst kompiliert werden muss. <br />
<br />
'''Verschaltung bei einem WeMos D1 mini'''<br />
(UART) <-> (Wemos swapped) <-> (Wemos seriell)<br />
3.3V <-> 3.3V <-> 3.3V<br />
GND <-> GND <-> GND<br />
Rx <-> D8 <-> Tx (D10 oder Tx)<br />
Tx <-> D7 <-> Rx (D9 oder Rx)<br />
<br />
Es gibt eine ausführliche Erläuterung für die Software unter [https://forum.fhem.de/index.php?action=dlattach;topic=56606.0;attach=68630], siehe auch [https://www.esp8266.com/viewtopic.php?f=32&t=18669 diese Grafik der Pins des Wemos]<br />
<br />
Im Forum gibt es mehr Informationen zu diesen Adaptern, zum Beispiel {{Link2Forum|Topic=62651|LinkText="(amunra)-Platine für HM-MOD-UART-RPI..."}} oder {{Link2Forum|Topic=79559|LinkText="3. Sammelbestellung - Homematic WLAN Gateway"}}.<br />
<br />
[[Datei:HM-CFG-WLAN-k.jpeg|thumb|left|200px|Anschluß an Wemos]]<br />
Auf dem linken Foto ist der Anschluss des gesamten Moduls (Rastermaß 2,54mm statt 2mm!) an den Wemos zur Wifi-Einbindung abgebildet.<br />
<br />
=== Betrieb mit einem LAN-TTL-Wandler ===<br />
[[Datei:Hm-uart und usr-tcp232-T2.png|thumb|right|400px|Anschluß an die gängige Variante USR-TCP232-T2]]Auf gängigen Marktplätzen sind für etwas weniger als 10 Euro Module erhältlich, die einen seriellen Anschluss im LAN bereitstellen können. Nähere Hinweise sind in den Artikeln [[Serial TTL to Ethernet Module]] sowie [[1W-IF-ETH]] zu finden.<br />
<br />
Die Module melden sich per DHCP<ref>jedenfalls neuere firmware-Versionen</ref> im Netzwerk an, die Konfiguration erfolgt je nach Variante über ein Web-Interface, ein Windows-Tool oder eine Management-Software.<br />
<br />
=== Betrieb mit MapleCUx ===<br />
Auch die seriellen Schnittstellen, die ein MapleCUL oder [[MapleCUN]] bereitstellen, können zum Anschluß des Moduls verwendet werden. Der MapleCUN stellt beide seriellen Schnittstellen je unter einem eigenen Port ins Netz.<br />
<br />
== Definition in FHEM ==<br />
Die Funktion in FHEM hängt ab von der verwendeten Hardware. Die eigentliche Funktion wird mit dem Modul [[HMUARTLGW]] hergestellt. Alle dortigen Hinweise zur Konfiguration sind zu beachten! Man sollte sich auch mit den Grundlagen der [[HomeMatic]] Kommunikation vertraut machen.<br />
<br />
Je nach physischem Anschluss erfolgt eine Anbindung in FHEM in unterschiedlicher Weise. Folgende Beispiele sind '''abweichend''' von der '''<big>[[HMUARTLGW#Define|Standardkonfiguration]]!</big>'''<br />
<br />
Wurde ein USB-Adapter auf dem FHEM-Gerät selbst verwendet, definiert man das Gerät in FHEM wie folgt.<br />
define USB_HmUART HMUARTLGW /dev/ttyUSBx<br />
Wurde dagegen das Gerät über WLAN oder LAN durch das UART-Modul angebunden, erfolgt die Einbindung in FHEM durch<br />
define WLAN_HmUART HMUARTLGW uart://<IP-Adresse>:<Portnummer><br />
Portnummern:<br />
*ser2net 4000 (bzw. entsprechend gewählter Einstellung)<br />
*socat 2000 (bzw. entsprechend gewählter Einstellung)<br />
*esp-link 23 <br />
*MapleCUN 2324 bzw. 2325 <br />
*USR-TCP232-T2 entspr. Konfiguration.<br />
<br />
=== Logbeispiel ===<br />
Typischerweise meldet sich das Modul beim Start so:<br />
2016.10.06 17:11:16 3: Opening myHmUART device /dev/ttyAMA0<br />
2016.10.06 17:11:16 3: Setting myHmUART serial parameters to 115200,8,N,1<br />
2016.10.06 17:11:16 3: myHmUART device opened<br />
2016.10.06 17:11:17 3: HMUARTLGW myHmUART currently running Co_CPU_BL<br />
2016.10.06 17:11:17 3: HMUARTLGW myHmUART currently running Co_CPU_App<br />
<br />
=== Verwendung AES in FHEM===<br />
Das Modul beherrscht AES.<br />
Für weitere Informationen gibt es einen separaten Wiki Eintrag [[AES Encryption]]<br />
<br />
=== Firmware Update des UART-Moduls mit FHEM ===<br />
Die Module werden mit einer Firmware 1.2.1 ausgeliefert. Dies Firmware ist nicht für einen stabilen Betrieb geeignet, die Firmware 1.4.1 ist die minimal lauffähige Version.<br />
<br />
Bitte den Befehl zum download inklusive der Anführungszeichen in die FHEM Kommandozeile eingeben!<br />
<br />
'''Firmware herunterladen'''<br />
* Version 1.4.1<br />
<syntaxhighlight lang="text">"wget -qO ./FHEM/firmware/coprocessor_update.eq3 https://raw.githubusercontent.com/eq-3/occu/28045df83480122f90ab92f7c6e625f9bf3b61aa/firmware/HM-MOD-UART/coprocessor_update.eq3"</syntaxhighlight><br />
* Alternativ die aktuellste (für den Betrieb mit dem Modul HMUARTLGW '''NICHT''' empfohlen)<br />
<syntaxhighlight lang="text">"wget -qO ./FHEM/firmware/coprocessor_update.eq3 https://raw.githubusercontent.com/eq-3/occu/HEAD/firmware/HM-MOD-UART/coprocessor_update.eq3"</syntaxhighlight><br />
(Firmware neuer als 1.4.1 dient nur bei CCU-Klonen mit Mischbetrieb BidCOs, klassisch HomeMatic und HomeMatic IP, siehe {{Link2Forum|Topic=70752|LinkText=diesen Forenthread}}).<br />
<br />
'''Flashen der neuen Firmware''' <br />
<br />
Erstmal überzeugen das die Firmware da ist: Z.B. mit dem Befehl in der FHEM Kommandozeile, die Ausgabe erfolgt in der Weboberfläche!<br />
<syntaxhighlight lang="text">{qx(ls -lha ./FHEM/firmware)}</syntaxhighlight><br />
Wenn alles ok - Befehl zum flashen ausführen:<br />
<syntaxhighlight lang="text">set myHmUART updateCoPro /opt/fhem/FHEM/firmware/coprocessor_update.eq3</syntaxhighlight><br />
<br />
=== Firmware Update des UART-Moduls ohne FHEM ===<br />
Sollte das Update über FHEM nicht funktionieren oder FHEM nicht verfügbar sein, kann die Firmware auch wie folgt eingespielt werden (Quelle: [http://heinz-otto.blogspot.com/2016/07/raspberry-pi-homematic-modul.html Ottos Technik Blog])<br />
<br />
sudo su<br />
apt-get update && apt-get -y install libusb-1.0-0-dev build-essential git<br />
systemctl stop fhem<br />
git clone git://git.zerfleddert.de/hmcfgusb<br />
cd hmcfgusb/<br />
make<br />
# Firmware runterladen<br />
wget https://raw.githubusercontent.com/eq-3/occu/ee68faf77e42ed5e3641790b43a710a3301cea7e/firmware/HM-MOD-UART/coprocessor_update.eq3<br />
# eigentliches flashen:<br />
./flash-hmmoduart -U /dev/ttyAMA0 coprocessor_update.eq3<br />
<br />
=== Bekannte Probleme ===<br />
* Sollten beim Flashen der Firmware hartnäckige Probleme auftreten (kein Erfolg aber auch gar keine Fehlermeldungen) ist das Modul vom Strom zu trennen, ein Neustart des Pi reicht nicht!<br />
* Ein {{Link2Forum|Topic=41203|Message=340320|LinkText=Beitrag}} aus dem genannten Forenthread: ''Das Ding ist anscheinend wirklich einfach das Funkmodul aus der CCU2 (wird zumindest in der eQ-3 SW als CCU2 angesprochen) und spricht ein für FHEM vollkommen neues Protokoll.''<br />
* Beim Raspberry 4 gibt es eine Einstellung zur Temperaturkontrolle, die muss deaktiviert werden. Siehe diesen {{Link2Forum|Topic=123223|Message=1178032|LinkText=Beitrag im Forum}}.<br />
* Bei Verwendung mit einem USR TCP232-T2 Wandler kann es in der Default-Einstellung des Wandlers dazu kommen, dass obsolete Kommunikation gepuffert und nach einem Wiederverbinden unnötig an FHEM gesendet wird (siehe {{Link2Forum|Topic=123948|LinkText=dieses Foren-Thema}}). Im FHEM-Log gibt es in diesem Fall die Meldung "HMUART failed to enter App!" Abhilfe schafft das Aktivieren der Option "Buffer Data before connected" unter "Expand Function" im WebUI des TCP-232.<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=41203|LinkText=Forenthread}} mit Nachfrage zur Unterstützung dieses Geräts in FHEM<br />
* {{Link2Forum|Topic=54511|LinkText=Modul für HomeMatic UART-Modul (RPi) und HomeMatic LAN Gateway}}<br />
* [http://www.elv.de/homematic-funkmodul-fuer-raspberry-pi-bausatz.html Produktseite] bei ELV<br />
* {{DocLink|elv|/Assets/Produkte/10/1040/104029/Downloads/104029_lan_gateway_um.pdf Bedienungsanleitung}}<br />
* {{Link2Forum|Topic=56606|LinkText=Forenthread}} Hardware Thread mit vielen Varianten der Anbindung. In Post #26 gibt es die Detailbeschreibung in der angehängten PDF.<br />
:<hr /><br />
<references /><br />
<br />
[[Kategorie:HomeMatic Components]]<br />
[[Kategorie:Interfaces]]<br />
[[Kategorie:Raspberry Pi]]<br />
[[Kategorie:868MHz]]</div>Otto123http://wiki.fhem.de/w/index.php?title=HM-MOD-RPI-PCB_HomeMatic_Funkmodul_f%C3%BCr_Raspberry_Pi&diff=37208HM-MOD-RPI-PCB HomeMatic Funkmodul für Raspberry Pi2022-02-09T08:08:28Z<p>Otto123: /* Variante mit ser2net */ Link zum Forum eingefügt wegen Version 4 ser2net</p>
<hr />
<div>{{Infobox Hardware<br />
|Bild=HM-MOD-RPI-PCB.jpg<br />
|Bildbeschreibung=HomeMatic Funkmodul für Raspberry Pi <br />
|HWProtocol=HomeMatic<br />
|HWType=Gateway<br />
|HWCategory=HomeMatic<br />
|HWComm=868,3/869,525 MHz<br />
|HWChannels=n/a<br />
|HWVoltage=1,8–3,6 V&nbsp;DC<br />
|HWPowerConsumption=50 mA max.<br />
|HWPoweredBy=RasPi<br />
|HWSize=19x41x14mm<br />
|HWDeviceFHEM=[[HMUARTLGW]]<br />
|HWManufacturer=ELV / eQ-3 <br />
}}<br />
Das [[HM-MOD-RPI-PCB HomeMatic Funkmodul für Raspberry Pi]] ist eine Platine, die auf die GPIO-Schnittstelle des [[Raspberry Pi]] aufgesteckt werden und damit als [[Interface]] zu [[HomeMatic]] Geräten dienen kann. <br />
<br />
== Aufbau, Einsatz und grundsätzliche Funktionsweise ==<br />
Das Modul besteht aus zwei Teilplatinen, die von eQ-3 über den Internetshop von ELV (als Bausatz ab etwa 20€, fertig montiert ab etwa 30€) verkauft werden. <br />
<br />
Das eigentliche Funkmodul wird mit HM-MOD-RPI-UART bezeichnet (und trägt den Aufdruck UART, im obigen Bild hinten teilweise verdeckt und mit der umrandeten 7 versehen), sie hat fünf einpolige Buchsen mit dem Rastermaß 2mm. Die Zusatzplatine zum Anschluss an die GPIO wird mit TRX1 bezeichnet (im obigen Bild vorn sichtbar mit dem Aufdruck HM-MOD-RPI-PCB), sie hat zwei sechspolige Buchsen mit dem Rastermaß 2,54mm. Die Zusatzplatine enthält im Wesentlichen Stützkondensatoren und erlaubt einen direkten Anschluss an die GPIO eines Raspberry Pi.<br />
* Der vorgesehene Einsatz als Aufsteckmodul auf den GPIO Port des Raspberry erfordert eine Modell abhängige Konfiguration. Diese wird im Setupbereich des Wiki Artikel zum [[Raspberry_Pi]] beschrieben.<br />
<br />
{{Randnotiz|RNText=Neben der hier beschriebenen Option das HM-MOD-RPI-PCB zu verwenden, besteht auch die Möglichkeit, damit auf demselben Raspberry eine virtuelle CCU zu betreiben, welche dann mit [[HMCCU]] eingebunden werden kann. Hierfür stehen mehrere Virtualisierungsvarianten zur Verfügung; eine kurze Darstellung, wie das mittels YAHM funktioniert, ist in diesem {{Link2Forum|Topic=79670|Message=718289|Forenbeitrag}} zu finden.}}Mit dieser Platine in Verbindung mit dem FHEM-Modul [[HMUARTLGW]] ist nur der Betrieb von BidCoS-Geräten möglich. Zur Einbindung von Geräten, die HM-IP verwenden, ist derzeit (Stand Juni 2018) noch zwingend eine (ggf. virtualisierte) CCU2 oder neuer erforderlich.<br />
<br />
Das Funkmodul stellt auf dem 868MHz-Frequenzband eine Verbindung zu Homematic-Geräten her. Das Modul wird über die serielle Schnittstelle an ein Gerät gekoppelt, dass diese serielle Schnittstelle auswerten und die Information dann weiterverarbeiten kann. Hier kommen beispielsweise in Frage: Raspberry Pi, WeMos mini, ESP8266-Module, USB-serielle Adapter. Bereits das UART-Funkmodul erlaubt eine serielle Anbindung (die entsprechenden Schnittstellen Tx und Rx sind vorhanden, sie basieren auf 3,3V), es kann aber auch die zusätzliche TRX1-Platine seriell verbunden werden. Des weiteren gibt es im Forum ein {{Link2Forum|Topic=56606}}, in dem PeMue eine eigene Platinenversion (Schaltplan, Stückliste und vieles mehr) vorstellt.<br />
<br />
=== Platine 1 -PCB-Modul ===<br />
[[Datei:Hm-uart trx1.png|thumb|right|200px|Verkabelung beim HM-MOD-PCB]]<br />
Am einfachsten ist es sicherlich, das kombinierte PCB-Modul (also beide Platinen UART und TRX1 durch eine Pfostenleiste miteinander verlötet) direkt auf die GPIO des Raspberry Pi aufzustecken. Das Bild rechts zeigt die entsprechende Verkabelung. Dabei ist zu beachten, dass sich nicht zwei Module die GPIO teilen können. Steckt schon ein Modul im Raspberry Pi, muss der Anschluss per USB, in einem zweiten Raspberry Pi oder per WLAN gewählt werden.<br />
<br clear="all"><br />
<br />
=== Platine 2 -UART-Modul ===<br />
[[Datei:Verkabelung-HM-MOD-uart.png|thumb|right|200px|Verkabelung beim HM-MOD-UART]]<br />
Will man das TRX1-Modul nicht verwenden, so kann man auch das UART-Modul direkt mit Rx/Tx des Raspberry Pi verbinden. Das Bild rechts zeigt die entsprechende Verkabelung. Hier sollten allerdings Stützkondensatoren an die Stromversorgung des UART angebracht werden, da Spannungsschwankungen sonst zu schwer interpretierbaren Fehlern führen können. Die Anschlüsse sind dem nachstehenden Bild zu entnehmen, allerdings ist hier nicht die UART-Platine, sondern das TRX1-Gegenstück zu sehen!<br />
<br />
Sowohl serielle Schnittstelle des Raspberry Pi als auch das UART-Modul arbeiten mit 3,3V arbeitet, so dass man keine Spannungsteiler benötigt. Mehr Informationen zu den GPIOs findet man unter diesem [http://www.netzmafia.de/skripten/hardware/RasPi/RasPi_GPIO.html Link].<br />
<br />
=== Zusammenbau und Verwendung ===<br />
Man sollte die Antenne aus dem Gehäuse schauen lassen oder gar eine externe Antenne anbringen. Idealerweise sollte das Ende der Drahtantenne mit einem Klecks Heißkleber oder ähnlichem isoliert werden; eine Berührung vor allem mit dem Innenleben des Raspberry Pi muss vermieden werden!<br />
<br />
Beide Platinen können zusammengebaut oder auch nur das UART Modul getrennt verwendet werden. <br />
[[Datei:HM-MOD-UART-Unten.jpg|thumb|left|200px|Montage des Moduls HM-MOD-UART unten]]<br />
[[Datei:HM-MOD-UART-Oben.jpg|thumb|right|200px|Montage des Moduls HM-MOD-UART oben]]<br />
Die originale Montage in der Anleitung von eq3 sieht den Zusammenbau PCB Modul unten und UART Modul oben vor (Bild rechts). Damit schließen die kleineren Pi-Gehäuse nicht richtig: das Gesamtmodul klemmt am Deckel.<br />
<br />
Man kann ohne weiteres das UART-Modul unter dem PCB-Modul montieren (Bild links), damit wird die Gesamthöhe geringer und es passt problemlos in jedes Gehäuse. Bitte vorher die genaue Situation prüfen: Es kann sein, dass damit Kühlkörper oder ähnliches seitens der Pi-Platine stören.<br />
<br />
Man kann auch das PCB Modul kürzen und das UART Modul mit kurzen Drähten in einer Ebene verbinden (kein Bild).<br />
<br />
Bitte auf die richtige Lage (Bilder) beim Zusammenbau und auf Lötzinnbrücken achten. Da die Anschlüsse durchkontaktiert sind, bewirkt eine falsche Positionierung des UART-Moduls im schlimmsten Fall einen Kurzschluss. Man erkennt auf beiden Bildern, dass beim UART-Modul die Pinleiste einmal auf der einen und ein andermal auf der anderen Seite des Moduls angelötet werden muss! <br />
<br />
<br clear="all"><br />
== Verwendung ==<br />
Das Modul muss, um verwendet zu werden, mit einer Hardware verbunden werden. Hier kommen mehrere Möglichkeiten in Betracht, die jeweils vor und Nachteile aufweisen. Sie werden jetzt nacheinander präsentiert. <br />
<br />
=== Anbindung an die GPIO im Raspberry ===<br />
==== Installation ====<br />
Man kann das HM-MOD-RPI-PCB Modul direkt in die GPIOs eines Raspberry stecken. Das hat den Vorteil, dass das Gerät (mehr oder weniger) sofort betriebsbereit ist, aber den Nachteil, dass am RPi vorher mehrere Installationen zu erfolgen haben. <br />
<br />
Die '''<big>notwendige Konfiguration der Schnittstelle</big>''' ist hier beschrieben: [[Raspberry_Pi#Verwendung_UART_f.C3.BCr_Zusatzmodule|Verwendung UART für Zusatzmodule]].<br />
* Der Einsatz in FHEM für CUL_HM erfolgt mit dem Modul [[HMUARTLGW]]<br />
* Die automatische Erkennung der USB Geräte muss deaktiviert werden: <br />
::<code>attr initialUsbCheck disable 1</code><br />
: Nach dem Setzen des Attributes muss die Änderung gespeichert werden (siehe [[save]])!<br />
<br />
=== Anbindung über das Netzwerk===<br />
Wenn das HM-MOD-RPI-PCB Modul an einen RPi angeschlossen ist, kann man dieses Modul danach auch im Netzwerk verfügbar machen. Dieser Pi kann beliebige Aufgaben erledigen, nur das HM-MOD-RPI-PCB Modul selbst darf nicht lokal verwendet werden. Somit kann man bei einem Umzug des FHEM Servers das HM-MOD-RPI-PCB Modul einfach weiterhin nutzen oder einen vorhandene RaspberryPi zum "HMLAN" umbauen. Sollte man aber ausschließlich Zugriff auf das HM-MOD-RPI-PCB Modul im Netzwerk benötigen, empfiehlt sich auch aus Kostengründen (Stromverbrauch) eine andere Lösung.<br />
<br />
Achtung! Auch über das Netzwerk darf immer '''nur eine Instanz auf das freigegebene Modul zugreifen'''!<br />
<br />
Die Konfiguration der Schnittstelle ist in jedem Fall gleich: [[Raspberry Pi#Verwendung UART für Zusatzmodule|Verwendung UART für Zusatzmodule]]. <br />
<br />
Die [[HM-MOD-RPI-PCB HomeMatic Funkmodul für Raspberry Pi#Definition in FHEM 2|Definition in FHEM]] erfolgt dann mit dem Parameter <code>uart:// .</code><br />
<br />
===== Variante mit ser2net =====<br />
[https://forum.fhem.de/index.php/topic,124384.0.html '''Achtung!''' Mit der Version 4 hat sich die Konfiguration geändert!] <br />
<br />
Diese Installation auf dem Pi mit dem HM-MOD-RPI-PCB Modul bitte im Kontext <code>sudo su</code> ausführen.<br />
<br />
<pre>apt-get install ser2net<br />
echo "4000:raw:0:/dev/ttyAMA0:115200 NONE 1STOPBIT 8DATABITS HANGUP_WHEN_DONE" >> /etc/ser2net.conf<br />
# Den Dienst neu starten<br />
systemctl restart ser2net</pre><br />
<br />
===== Variante mit socat =====<br />
Installation auf dem Pi wo das Modul steckt bitte so installieren. <br />
:<code>sudo apt-get install socat</code><br />
Zum Test kann man socat in der Kommandozeile starten<br />
:<code>sudo socat TCP4-LISTEN:2000,fork,reuseaddr /dev/ttyAMA0,raw,echo=0,b115200 </code><br />
<br />
Für den dauerhaften Betrieb muss der Start von socat automatisch erfolgen. <br />
Auf einem Debian Jessie mit systemd legt man z.B. einen Dienst durch folgende Datei an:<br />
/etc/systemd/system/hmlangw.service<br />
<syntaxhighlight lang="Text"><br />
[Install]<br />
WantedBy=multi-user.target<br />
Type=forking<br />
<br />
[Service]<br />
ExecStart=/usr/bin/socat TCP4-LISTEN:2000,fork,reuseaddr /dev/ttyAMA0,raw,echo=0,b115200<br />
User=root<br />
Restart=always<br />
RestartSec=10<br />
</syntaxhighlight><br />
Dann kann mit <br />
:<code>sudo systemctl enable hmlangw </code><br />
der Service zum Autostart konfiguriert werden.<br />
<br />
=== Anbindung mit USB-Adapter ===<br />
{{Randnotiz|RNTyp=r|RNText=Bitte beachten: Es sind immer wieder Exemplare mit [[CP2102]] im Umlauf, die mehr als 3.3V Spannung liefern! Vor dem Verbinden mit dem HM-Modul sollte daher geprüft werden, ob der interne Spannungswandler ordnungsgemäß funktioniert und wirklich nur 3.3V liefert. Bei den blauen Micro-Modulen kann man den Fehler nach dieser Anleitung beheben: [https://www.silabs.com/community/interface/forum.topic.html/cp2102_3_3v_outputi-EaVr Beitrag von PBudmark vom 08.07.2017].}}<br />
[[Datei:PL2102 Modul.png|200px|thumb|right|Mod zur Herstellung der korrekten Spannung]]<br />
Das UART-Modul kann ebenfalls mit einem USB-Adapter an ein USB-fähiges Gerät angeschlossen werden. Allerdings ist hier wieder auf den Spannnungspegel zu achten, unbedingt einen USB-Adapter mit 3,3 Volt Pegel nehmen! Der Vorteil ist hier, dass hohe Geschwindigkeiten möglich sind und nicht wie bei WLAN Latenzen auftreten, aber es muss eben ein USB-Anschluss verfügbar sein.<br />
<br />
Grundsätzlich bewährt haben sich z.B. Modelle mit einem [[CP2102]], der auch ausreichend Stromreserven zum Betrieb des Moduls bietet. Dabei ist die serielle Schnittstelle wie üblich zu kreuzen, also<br />
<br />
'''Verschaltung'''<br />
3.3V <-> 3.3V<br />
GND <-> GND<br />
Rx <-> Tx<br />
Tx <-> Rx<br />
<br />
=== Anbindung mit ESP8266 ===<br />
Hier ist der Vorteil, dass vor Ort nur WLAN verfügbar sein muss. Nachteilig kann sich auswirken, dass WLAN hohe Latenzen aufweisen kann und daher manchmal der Eindruck entsteht, das Modul sei gerade abwesend. <br />
<br />
Zum Anschluss kann ein beliebiger ESP8266 verwendet werden. Mit einigen Versionen (Beispiele im Forum: {{Link2Forum|Topic=102141|Message=956606|LinkText=ESP07}} sowie {{Link2Forum|Topic=102141|LinkText=Wemos mini pro}}) ist eine Anbindung anscheinend nicht oder nur schwer möglich - wobei dies auch an nicht funktionsfähigen Clonen liegen kann oder beim Wemos daran, dass dort die USB-Schnittstelle mit Tx/Rx nicht kalkulierbare Störungen auslöst. Beim ESP8266 gibt es zwei verschiedene Firmware-Möglichkeiten: ESPLink oder ESPEasy. <br />
<br />
[https://github.com/jeelabs/esp-link ESPLink] ist eine sehr stabile und nicht mehr aktiv weiterentwickelte Firmware, die die serielle Schnittstelle direkt mit WLAN verbindet und ohne größere Schwierigkeiten eingerichtet werden kann und funktioniert. Sie nutzt die serielle Schnittstelle des ESP. Allerdings erlaubt ESPLink nicht die Nutzung anderer GPIOs, so können beispielsweise keine anderen Sensoren mit angeschlossen bzw. ausgelesen werden. Verwendet man ESP-Link, so muss neben der WLAN Konfiguration nur das Pin Assignment konfiguriert werden. Alle Pins auf disabled stellen.<br />
<br />
[https://www.letscontrolit.com/wiki/index.php/ESPEasy ESPEasy] (neue Version: ESPMega) wird beständig weiterentwickelt und gestattet es, weitere Sensoren anzuschließen und deren Werte auszulesen. Insbesondere kann man mit ESPEasy auch zwei weitere Pins nutzen, um eine serielle Schnittstelle zu simulieren (so genannter ''serieller Server''). Man spricht auch von einer ''swapped'' Schnittstelle. Die {{Link2Forum|Topic=62651|LinkText=Platine von amunra}} nutzt eine solche Schnittstelle. <br />
Allerdings gibt es mit einigen ESP8266-Geräten Schwierigkeiten, diese serielle Schnittstelle zu nutzen. So ist etwa ein serieller Server mit neueren ESP-Versionen anscheinend nicht lauffähig (siehe dazu {{Link2Forum|Topic=75422|LinkText=diesen Thread}}). Es gibt eine ältere Firmware-Version von PeMue, die unmittelbar funktionsfähig scheint, siehe dazu {{Link2Forum|Topic=86592|LinkText=diesen Forenthread}}. <br />
<br />
[[Datei:Esp-pin Konfiguration HMUART.png|200px|mini|esp-link Pin-Konfiguration beim swapped Server]]<br />
Bei der seriellen Schnittstelle (da die ESP auf 3,3V laufen, sind keine Spannungsteiler erforderlich) findet man die Verschaltung unten. Bei der ''swapped'' Schnittstelle wird auf die digitalen Pins D7/D8 zurückgegriffen (siehe auch unten). Die letztere Verschaltung erfordert eine entsprechende Implementierung der Schnittstelle in der Firmware selbst, die beispielsweise bei ESPEasy unter Umständen nicht gegeben ist oder selbst kompiliert werden muss. <br />
<br />
'''Verschaltung bei einem WeMos D1 mini'''<br />
(UART) <-> (Wemos swapped) <-> (Wemos seriell)<br />
3.3V <-> 3.3V <-> 3.3V<br />
GND <-> GND <-> GND<br />
Rx <-> D8 <-> Tx (D10 oder Tx)<br />
Tx <-> D7 <-> Rx (D9 oder Rx)<br />
<br />
Es gibt eine ausführliche Erläuterung für die Software unter [https://forum.fhem.de/index.php?action=dlattach;topic=56606.0;attach=68630], siehe auch [https://www.esp8266.com/viewtopic.php?f=32&t=18669 diese Grafik der Pins des Wemos]<br />
<br />
Im Forum gibt es mehr Informationen zu diesen Adaptern, zum Beispiel {{Link2Forum|Topic=62651|LinkText="(amunra)-Platine für HM-MOD-UART-RPI..."}} oder {{Link2Forum|Topic=79559|LinkText="3. Sammelbestellung - Homematic WLAN Gateway"}}.<br />
<br />
[[Datei:HM-CFG-WLAN-k.jpeg|thumb|left|200px|Anschluß an Wemos]]<br />
Auf dem linken Foto ist der Anschluss des gesamten Moduls (Rastermaß 2,54mm statt 2mm!) an den Wemos zur Wifi-Einbindung abgebildet.<br />
<br />
=== Betrieb mit einem LAN-TTL-Wandler ===<br />
[[Datei:Hm-uart und usr-tcp232-T2.png|thumb|right|400px|Anschluß an die gängige Variante USR-TCP232-T2]]Auf gängigen Marktplätzen sind für etwas weniger als 10 Euro Module erhältlich, die einen seriellen Anschluss im LAN bereitstellen können. Nähere Hinweise sind in den Artikeln [[Serial TTL to Ethernet Module]] sowie [[1W-IF-ETH]] zu finden.<br />
<br />
Die Module melden sich per DHCP<ref>jedenfalls neuere firmware-Versionen</ref> im Netzwerk an, die Konfiguration erfolgt je nach Variante über ein Web-Interface, ein Windows-Tool oder eine Management-Software.<br />
<br />
=== Betrieb mit MapleCUx ===<br />
Auch die seriellen Schnittstellen, die ein MapleCUL oder [[MapleCUN]] bereitstellen, können zum Anschluß des Moduls verwendet werden. Der MapleCUN stellt beide seriellen Schnittstellen je unter einem eigenen Port ins Netz.<br />
<br />
== Definition in FHEM ==<br />
Die Funktion in FHEM hängt ab von der verwendeten Hardware. Die eigentliche Funktion wird mit dem Modul [[HMUARTLGW]] hergestellt. Alle dortigen Hinweise zur Konfiguration sind zu beachten! Man sollte sich auch mit den Grundlagen der [[HomeMatic]] Kommunikation vertraut machen.<br />
<br />
Je nach physischem Anschluss erfolgt eine Anbindung in FHEM in unterschiedlicher Weise. Folgende Beispiele sind '''abweichend''' von der '''<big>[[HMUARTLGW#Define|Standardkonfiguration]]!</big>'''<br />
<br />
Wurde ein USB-Adapter auf dem FHEM-Gerät selbst verwendet, definiert man das Gerät in FHEM wie folgt.<br />
define USB_HmUART HMUARTLGW /dev/ttyUSBx<br />
Wurde dagegen das Gerät über WLAN oder LAN durch das UART-Modul angebunden, erfolgt die Einbindung in FHEM durch<br />
define WLAN_HmUART HMUARTLGW uart://<IP-Adresse>:<Portnummer><br />
Portnummern:<br />
*ser2net 4000 (bzw. entsprechend gewählter Einstellung)<br />
*socat 2000 (bzw. entsprechend gewählter Einstellung)<br />
*esp-link 23 <br />
*MapleCUN 2324 bzw. 2325 <br />
*USR-TCP232-T2 entspr. Konfiguration.<br />
<br />
=== Logbeispiel ===<br />
Typischerweise meldet sich das Modul beim Start so:<br />
2016.10.06 17:11:16 3: Opening myHmUART device /dev/ttyAMA0<br />
2016.10.06 17:11:16 3: Setting myHmUART serial parameters to 115200,8,N,1<br />
2016.10.06 17:11:16 3: myHmUART device opened<br />
2016.10.06 17:11:17 3: HMUARTLGW myHmUART currently running Co_CPU_BL<br />
2016.10.06 17:11:17 3: HMUARTLGW myHmUART currently running Co_CPU_App<br />
<br />
=== Verwendung AES in FHEM===<br />
Das Modul beherrscht AES.<br />
Für weitere Informationen gibt es einen separaten Wiki Eintrag [[AES Encryption]]<br />
<br />
=== Firmware Update des UART-Moduls mit FHEM ===<br />
Die Module werden mit einer Firmware 1.2.1 ausgeliefert. Dies Firmware ist nicht für einen stabilen Betrieb geeignet, die Firmware 1.4.1 ist die minimal lauffähige Version.<br />
<br />
Bitte den Befehl zum download inklusive der Anführungszeichen in die FHEM Kommandozeile eingeben!<br />
<br />
'''Firmware herunterladen'''<br />
* Version 1.4.1<br />
<syntaxhighlight lang="text">"wget -qO ./FHEM/firmware/coprocessor_update.eq3 https://raw.githubusercontent.com/eq-3/occu/28045df83480122f90ab92f7c6e625f9bf3b61aa/firmware/HM-MOD-UART/coprocessor_update.eq3"</syntaxhighlight><br />
* Alternativ die aktuellste (für den Betrieb mit dem Modul HMUARTLGW '''NICHT''' empfohlen)<br />
<syntaxhighlight lang="text">"wget -qO ./FHEM/firmware/coprocessor_update.eq3 https://raw.githubusercontent.com/eq-3/occu/HEAD/firmware/HM-MOD-UART/coprocessor_update.eq3"</syntaxhighlight><br />
(Firmware neuer als 1.4.1 dient nur bei CCU-Klonen mit Mischbetrieb BidCOs, klassisch HomeMatic und HomeMatic IP, siehe {{Link2Forum|Topic=70752|LinkText=diesen Forenthread}}).<br />
<br />
'''Flashen der neuen Firmware''' <br />
<br />
Erstmal überzeugen das die Firmware da ist: Z.B. mit dem Befehl in der FHEM Kommandozeile, die Ausgabe erfolgt in der Weboberfläche!<br />
<syntaxhighlight lang="text">{qx(ls -lha ./FHEM/firmware)}</syntaxhighlight><br />
Wenn alles ok - Befehl zum flashen ausführen:<br />
<syntaxhighlight lang="text">set myHmUART updateCoPro /opt/fhem/FHEM/firmware/coprocessor_update.eq3</syntaxhighlight><br />
<br />
=== Firmware Update des UART-Moduls ohne FHEM ===<br />
Sollte das Update über FHEM nicht funktionieren oder FHEM nicht verfügbar sein, kann die Firmware auch wie folgt eingespielt werden (Quelle: [http://heinz-otto.blogspot.com/2016/07/raspberry-pi-homematic-modul.html Ottos Technik Blog])<br />
<br />
sudo su<br />
apt-get update && apt-get -y install libusb-1.0-0-dev build-essential git<br />
systemctl stop fhem<br />
git clone git://git.zerfleddert.de/hmcfgusb<br />
cd hmcfgusb/<br />
make<br />
# Firmware runterladen<br />
wget https://raw.githubusercontent.com/eq-3/occu/ee68faf77e42ed5e3641790b43a710a3301cea7e/firmware/HM-MOD-UART/coprocessor_update.eq3<br />
# eigentliches flashen:<br />
./flash-hmmoduart -U /dev/ttyAMA0 coprocessor_update.eq3<br />
<br />
=== Bekannte Probleme ===<br />
* Sollten beim Flashen der Firmware hartnäckige Probleme auftreten (kein Erfolg aber auch gar keine Fehlermeldungen) ist das Modul vom Strom zu trennen, ein Neustart des Pi reicht nicht!<br />
* Ein {{Link2Forum|Topic=41203|Message=340320|LinkText=Beitrag}} aus dem genannten Forenthread: ''Das Ding ist anscheinend wirklich einfach das Funkmodul aus der CCU2 (wird zumindest in der eQ-3 SW als CCU2 angesprochen) und spricht ein für FHEM vollkommen neues Protokoll.''<br />
* Beim Raspberry 4 gibt es eine Einstellung zur Temperaturkontrolle, die muss deaktiviert werden. Siehe diesen {{Link2Forum|Topic=123223|Message=1178032|LinkText=Beitrag im Forum}}.<br />
* Bei Verwendung mit einem USR TCP232-T2 Wandler kann es in der Default-Einstellung des Wandlers dazu kommen, dass obsolete Kommunikation gepuffert und nach einem Wiederverbinden unnötig an FHEM gesendet wird (siehe {{Link2Forum|Topic=123948|LinkText=dieses Foren-Thema}}). Im FHEM-Log gibt es in diesem Fall die Meldung "HMUART failed to enter App!" Abhilfe schafft das Aktivieren der Option "Buffer Data before connected" unter "Expand Function" im WebUI des TCP-232.<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=41203|LinkText=Forenthread}} mit Nachfrage zur Unterstützung dieses Geräts in FHEM<br />
* {{Link2Forum|Topic=54511|LinkText=Modul für HomeMatic UART-Modul (RPi) und HomeMatic LAN Gateway}}<br />
* [http://www.elv.de/homematic-funkmodul-fuer-raspberry-pi-bausatz.html Produktseite] bei ELV<br />
* {{DocLink|elv|/Assets/Produkte/10/1040/104029/Downloads/104029_lan_gateway_um.pdf Bedienungsanleitung}}<br />
* {{Link2Forum|Topic=56606|LinkText=Forenthread}} Hardware Thread mit vielen Varianten der Anbindung. In Post #26 gibt es die Detailbeschreibung in der angehängten PDF.<br />
:<hr /><br />
<references /><br />
<br />
[[Kategorie:HomeMatic Components]]<br />
[[Kategorie:Interfaces]]<br />
[[Kategorie:Raspberry Pi]]<br />
[[Kategorie:868MHz]]</div>Otto123http://wiki.fhem.de/w/index.php?title=Fhem.service_(systemd_unit_file)&diff=37187Fhem.service (systemd unit file)2022-02-06T11:07:33Z<p>Otto123: /* Einstellungen dies und das */</p>
<hr />
<div>Die Datei fhem.service ist ein systemd unit file und wird bei der debian Installation von FHEM mit ausgeliefert. Änderungen an dieser Datei sind normalerweise nicht notwendig. Man sollte zumindest genau wissen was man tut! Der Artikel soll die Datei etwas beschreiben und ein paar Fälle behandeln die ein Anpassung notwendig machen.<br />
==Unit File - ein paar kurze Erklärung==<br />
Den aktuellen Inhalt kann man jederzeit anschauen:<syntaxhighlight lang="bash"><br />
systemctl cat fhem<br />
</syntaxhighlight>Stand Mai 2020 hat die Datei folgenden Inhalt:<br />
<br />
=== Inhalt /etc/systemd/system/fhem.service ===<br />
<syntaxhighlight lang="bash"><br />
# $Id: fhem.service 19235 2019-04-21 13:26:17Z betateilchen $<br />
<br />
[Unit]<br />
Description=FHEM Home Automation<br />
Wants=network.target<br />
After=network.target<br />
#Requires=postgresql.service<br />
#After=postgresql.service<br />
#Requires=mysql.service<br />
#After=mysql.service<br />
<br />
[Service]<br />
Type=forking<br />
User=fhem<br />
Group=dialout<br />
WorkingDirectory=/opt/fhem<br />
ExecStart=/usr/bin/perl fhem.pl fhem.cfg<br />
#ExecStart=/usr/bin/perl fhem.pl configDB<br />
Restart=always<br />
<br />
[Install]<br />
WantedBy=multi-user.target<br />
</syntaxhighlight><br />
<br />
=== Erklärung ausgewählter Parameter ===<br />
'''Wants=''' die angegebene Services werden benötigt, fhem startet aber trotzdem falls die Services nicht gestartet werden können.<br />
<br />
'''Requires=''' wenn der Service nicht gestartet werden kann, wird fhem nicht gestartet.<br />
<br />
'''After=''' bewirkt, dass fhem nach dem Service (der Gruppe) gestartet wird.<br />
<br />
Das ist wichtig damit Services die für fhem notwendig sind schon gestartet sind. Benötig fhem z.B. Datenbanken sind die entsprechenden Zeilen einzubauen oder durch entfernen des Kommentarzeichens (#) zu aktivieren.<br />
<br />
'''User=fhem''' bewirkt das der Services mit user fhem gestartet wird. Falls fhem mit dem user root gestartet wird, startet fhem.pl einen neuen Prozess unter dem User fhem.<br />
<br />
'''Group=dialout''' Es wird die Gruppe dialout zum Start benutzt.<br />
<br />
Beide Zeilen können für den normalen Start von FHEM auch auskommentiert werden.<br />
<br />
=== Zusätzlicher Parameter ===<br />
'''ExecStartPre=''' Hier kann ein Shell Befehl stehen, der vor dem Start des eigentlichen Service (ExecStart=) ausgeführt wird.<br />
<br />
=== unit file bearbeiten ===<br />
Dieser Befehl editiert die (fhem.service) unit Datei mit dem Standard Editor (z.B. nano) und führt zum Abschluss auch ein daemon-reload durch.<syntaxhighlight lang="bash"><br />
sudo systemctl edit --full fhem<br />
</syntaxhighlight>Tipp: Datei speichern '''ctrl+s''' und Editor verlassen '''ctrl+x'''<br />
<br />
== Prozesse vor dem FHEM Start ausführen ==<br />
Ziel ist es sicherzustellen, dass für den Start von FHEM alle Voraussetzungen erfüllt sind, z.B.<br />
* Hardware aktiviert ([[COC]], [[FHEM_auf_Raspberry_PI_mit_COC_betreiben]], {{Link2Forum|Topic=106060|Message=1003767|LinkText=SCC Busware}}, [[HM-CFG-USB USB Konfigurations-Adapter|HM-CFG-USB]])<br />
* Datenbank gestartet<br />
* Systemprozess läuft (z.B. {{Link2Forum|Topic=110716|LinkText=Bluetooth gestartet}} <br />
* eigenen Prozessen ist gestartet <br />
* [[DWD OpenData|Sprache einstellen]]<br />
Dazu gibt es mehrere Lösungswege:<br />
* die Datei fhem.service modifizieren<br />
* einen separaten Service implementieren<br />
* Abhängigkeiten definieren<br />
<br />
=== Ein Script mit separater service unit starten ===<br />
Wir erstellen quasi einen eigenen Service - Vorteil: Die fhem.service braucht man nicht verändern.<br />
<br />
'''1. Script bereitstellen'''<br />
<br />
Das Beispiel hier in einem allgemeinerem Pfad:<syntaxhighlight lang="bash"><br />
sudo nano /user/local/bin/EnableXX.sh<br />
</syntaxhighlight>Den Code (Beispiele am Ende) hier einfügen und die Datei speichern und Editor verlassen (ctrl+s ctrl+x).<br />
<br />
Hier kann meist der Original Scriptcode verwendet werden, der früher in das init.d Script eingefügt werden sollte.<br />
<br />
'''2. unit file erzeugen'''<br />
<br />
Man erstellt eine neues unit file.<syntaxhighlight lang="bash"><br />
sudo systemctl edit --full --force enablexx.service<br />
</syntaxhighlight>Mit folgendem Inhalt<syntaxhighlight lang="bash"><br />
[Unit]<br />
Description=EnableXX<br />
Before=fhem.service<br />
#After=network.target<br />
<br />
[Service]<br />
Type=oneshot<br />
ExecStart=bash /user/local/bin/EnableXX.sh<br />
StandardOutput=journal<br />
<br />
[Install]<br />
WantedBy=multi-user.target<br />
</syntaxhighlight>Die Zeile Before=fhem.service stellt sicher, dass der Start vor FHEM erfolgt.<br />
<br />
'''3. Service aktivieren'''<syntaxhighlight lang="bash"><br />
#sudo systemctl daemon-reload # nur notwendig wenn nicht systemctl edit verwendet wurde<br />
sudo systemctl enable enablexx<br />
sudo systemctl start enablexx<br />
</syntaxhighlight>Den Erfolg auch nach einem komplette Neustart testen!<br />
<br />
=== Ein Script zusammen mit FHEM starten ===<br />
'''1. Script bereitstellen'''<br />
<br />
Dazu wird eine Scriptdatei erzeugt, Beispiel:<syntaxhighlight lang="bash"><br />
sudo nano /opt/fhem/ExecStartPre.sh<br />
</syntaxhighlight>Den Code (Beispiele am Ende) hier einfügen und die Datei speichern und Editor verlassen (ctrl+s ctrl+x). <br />
<br />
'''2. ExecStartPre aktivieren'''<br />
<br />
Um ein Script mit root Rechten in der fhem.service unit auszuführen, müssen drei Zeilen in der Datei geändert werden ([[Fhem.service (systemd unit file)#unit file bearbeiten|siehe oben]]).<br />
<br />
Vor der Zeile ExecStart= wir diese Zeile eingefügt:<syntaxhighlight lang="bash"><br />
[Service]<br />
...<br />
ExecStartPre= bash /opt/fhem/ExecStartPre.sh<br />
ExecStart=...<br />
</syntaxhighlight><br />
Die beiden Zeilen User und Group muss man auskommentieren, da die Unit sonst mit dem User fhem ausgeführt wird.<br />
{{Randnotiz|RNTyp=Fehl|RNText=Achtung: Die Gruppenmitgliedschaft des Users fhem (z.B. gpio) ist beim Systemstart an der Stelle noch nicht wirksam.}}<br />
#User=fhem <br />
#Group=dialout<br />
<br />
<br />
'''3. Änderungen aktivieren'''<br />
<br />
Die Änderungen werden erst nach einem daemon-reload aktiv und nach einem restart wirksam.<syntaxhighlight lang="bash"><br />
#sudo systemctl daemon-reload # nur notwendig wenn nicht systemctl edit verwendet wurde<br />
sudo systemctl restart fhem<br />
</syntaxhighlight>Den Erfolg auch nach einem komplette Neustart testen!<br />
<br />
=== Start von anderen Services abhängig machen ===<br />
In der fhem.service unit kann man sicherstellen, dass ein Service fertig gestartet wurde bevor fhem startet. Dazu kann man im unit Abschnitt zwei Zeilen einfügen (bzw. Kommentar entfernen):<syntaxhighlight lang="bash"><br />
Wants=xxx.service <br />
After=xxx.service<br />
</syntaxhighlight>Man kann auch erzwingen, dass FHEM nicht startet falls die Voraussetzungen nicht erfüllt sind. Dafür muss anstatt Wants= Requires= verwendet werden.<br />
<br />
== Einstellungen dies und das ==<br />
<br />
=== Start verzögern ===<br />
Es ist immer besser eine direkte Abhängigkeit zu definieren. In unklaren Situationen oder als erste Abhilfe kann es notwendig sein, einfach den FHEM Start zu verzögern.<br />
<br />
Der default Wert für ''TimeoutStartSec='' liegt bei 90 sec. Anzeige mit <code>systemctl show fhem.service -p TimeoutStartUSec</code><br />
<br />
Soll die Startverzögerung länger sein, muss dieser Wert zusätzlich gesetzt werden. Ansonsten wird der Start mit einer Fehlermeldung abgebrochen.<br />
<syntaxhighlight lang="text"><br />
[Service]<br />
...<br />
ExecStartPre=/bin/sleep 10<br />
#TimeoutStartSec= # default 90, set for larger sleep time<br />
</syntaxhighlight><br />
<br />
=== Restart verzögern ===<br />
Sollte man z.B. bei einem Neustart über die FHEM Oberfläche (shutdown restart) zwei Starts innerhalb von 1 Sekunde im Logfile beobachten, kann man den Neustart im unit file mit einem Parameter um 2 - 10 Sekunden ({{Link2Forum|Topic=93870|Message=924833|LinkText=siehe auch diesen Forenbeitrag}}) verzögern:<br />
<syntaxhighlight lang="text"><br />
[Service]<br />
...<br />
Restart=...<br />
RestartSec=2<br />
...<br />
</syntaxhighlight><br />
<br />
== Hinweise und Tipps ==<br />
=== Startreihenfolge beeinflussen ===<br />
Wie man erzwingen kann, dass FHEM '''nach''' hciuart (Bluetooth Service) startet, ist in {{Link2Forum|Topic=110716|LinkText=diesem Forenbeitrag}} beschrieben.<br />
<br />
=== Ausgaben im Script ===<br />
Ausgaben mit echo landen im /var/log/syslog. Das Log kann man mit diesem Befehl anzeigen. Ist das Logfile zu unübersichtlich kann man sich auch z.B. nur 15 Zeilen nach systemd Ausgabe des unit files anzeigen lassen.<br />
<syntaxhighlight lang="bash"><br />
cat /var/log/syslog<br />
cat /var/log/syslog|grep -A 15 "FHEM Home"<br />
</syntaxhighlight><br />
<br />
=== Beispielcode ===<br />
Diese Codebeispiel ist auf dem Raspberry Pi ausführbar und lässt vor dem Start von FHEM die grüne LED (ACT) blinken.<br />
<br />
'''Beispiel 1: 3 mal kurz und 3 mal lang'''<syntaxhighlight lang="bash"><br />
# Lass die ACT LED (grün) am Pi 3 mal kurz und 3 mal lang blinken<br />
ANZAHL=3<br />
#Status (Standard [mmc0] )sichern<br />
trigger=$(cat /sys/class/leds/led0/trigger|grep -o "\[.*\]"|tr -d [+])<br />
#umschalten auf manuell<br />
echo "none" >/sys/class/leds/led0/trigger<br />
#blinken<br />
for ((i=1 ; i<=$(( $ANZAHL * 2 )) ; i++ )); do<br />
echo $(( $i % 2 )) >/sys/class/leds/led0/brightness<br />
sleep 0.3<br />
done<br />
for ((i=1 ; i<=$(( $ANZAHL * 2 )) ; i++ )); do<br />
echo $(( $i % 2 )) >/sys/class/leds/led0/brightness<br />
sleep 1<br />
done<br />
#Status wieder herstellen<br />
echo $trigger >/sys/class/leds/led0/trigger<br />
</syntaxhighlight></div>Otto123http://wiki.fhem.de/w/index.php?title=Fhem.service_(systemd_unit_file)&diff=37186Fhem.service (systemd unit file)2022-02-06T10:45:28Z<p>Otto123: /* Start verzögern */ TimeoutStartSec= eingefügt</p>
<hr />
<div>Die Datei fhem.service ist ein systemd unit file und wird bei der debian Installation von FHEM mit ausgeliefert. Änderungen an dieser Datei sind normalerweise nicht notwendig. Man sollte zumindest genau wissen was man tut! Der Artikel soll die Datei etwas beschreiben und ein paar Fälle behandeln die ein Anpassung notwendig machen.<br />
==Unit File - ein paar kurze Erklärung==<br />
Den aktuellen Inhalt kann man jederzeit anschauen:<syntaxhighlight lang="bash"><br />
systemctl cat fhem<br />
</syntaxhighlight>Stand Mai 2020 hat die Datei folgenden Inhalt:<br />
<br />
=== Inhalt /etc/systemd/system/fhem.service ===<br />
<syntaxhighlight lang="bash"><br />
# $Id: fhem.service 19235 2019-04-21 13:26:17Z betateilchen $<br />
<br />
[Unit]<br />
Description=FHEM Home Automation<br />
Wants=network.target<br />
After=network.target<br />
#Requires=postgresql.service<br />
#After=postgresql.service<br />
#Requires=mysql.service<br />
#After=mysql.service<br />
<br />
[Service]<br />
Type=forking<br />
User=fhem<br />
Group=dialout<br />
WorkingDirectory=/opt/fhem<br />
ExecStart=/usr/bin/perl fhem.pl fhem.cfg<br />
#ExecStart=/usr/bin/perl fhem.pl configDB<br />
Restart=always<br />
<br />
[Install]<br />
WantedBy=multi-user.target<br />
</syntaxhighlight><br />
<br />
=== Erklärung ausgewählter Parameter ===<br />
'''Wants=''' die angegebene Services werden benötigt, fhem startet aber trotzdem falls die Services nicht gestartet werden können.<br />
<br />
'''Requires=''' wenn der Service nicht gestartet werden kann, wird fhem nicht gestartet.<br />
<br />
'''After=''' bewirkt, dass fhem nach dem Service (der Gruppe) gestartet wird.<br />
<br />
Das ist wichtig damit Services die für fhem notwendig sind schon gestartet sind. Benötig fhem z.B. Datenbanken sind die entsprechenden Zeilen einzubauen oder durch entfernen des Kommentarzeichens (#) zu aktivieren.<br />
<br />
'''User=fhem''' bewirkt das der Services mit user fhem gestartet wird. Falls fhem mit dem user root gestartet wird, startet fhem.pl einen neuen Prozess unter dem User fhem.<br />
<br />
'''Group=dialout''' Es wird die Gruppe dialout zum Start benutzt.<br />
<br />
Beide Zeilen können für den normalen Start von FHEM auch auskommentiert werden.<br />
<br />
=== Zusätzlicher Parameter ===<br />
'''ExecStartPre=''' Hier kann ein Shell Befehl stehen, der vor dem Start des eigentlichen Service (ExecStart=) ausgeführt wird.<br />
<br />
=== unit file bearbeiten ===<br />
Dieser Befehl editiert die (fhem.service) unit Datei mit dem Standard Editor (z.B. nano) und führt zum Abschluss auch ein daemon-reload durch.<syntaxhighlight lang="bash"><br />
sudo systemctl edit --full fhem<br />
</syntaxhighlight>Tipp: Datei speichern '''ctrl+s''' und Editor verlassen '''ctrl+x'''<br />
<br />
== Prozesse vor dem FHEM Start ausführen ==<br />
Ziel ist es sicherzustellen, dass für den Start von FHEM alle Voraussetzungen erfüllt sind, z.B.<br />
* Hardware aktiviert ([[COC]], [[FHEM_auf_Raspberry_PI_mit_COC_betreiben]], {{Link2Forum|Topic=106060|Message=1003767|LinkText=SCC Busware}}, [[HM-CFG-USB USB Konfigurations-Adapter|HM-CFG-USB]])<br />
* Datenbank gestartet<br />
* Systemprozess läuft (z.B. {{Link2Forum|Topic=110716|LinkText=Bluetooth gestartet}} <br />
* eigenen Prozessen ist gestartet <br />
* [[DWD OpenData|Sprache einstellen]]<br />
Dazu gibt es mehrere Lösungswege:<br />
* die Datei fhem.service modifizieren<br />
* einen separaten Service implementieren<br />
* Abhängigkeiten definieren<br />
<br />
=== Ein Script mit separater service unit starten ===<br />
Wir erstellen quasi einen eigenen Service - Vorteil: Die fhem.service braucht man nicht verändern.<br />
<br />
'''1. Script bereitstellen'''<br />
<br />
Das Beispiel hier in einem allgemeinerem Pfad:<syntaxhighlight lang="bash"><br />
sudo nano /user/local/bin/EnableXX.sh<br />
</syntaxhighlight>Den Code (Beispiele am Ende) hier einfügen und die Datei speichern und Editor verlassen (ctrl+s ctrl+x).<br />
<br />
Hier kann meist der Original Scriptcode verwendet werden, der früher in das init.d Script eingefügt werden sollte.<br />
<br />
'''2. unit file erzeugen'''<br />
<br />
Man erstellt eine neues unit file.<syntaxhighlight lang="bash"><br />
sudo systemctl edit --full --force enablexx.service<br />
</syntaxhighlight>Mit folgendem Inhalt<syntaxhighlight lang="bash"><br />
[Unit]<br />
Description=EnableXX<br />
Before=fhem.service<br />
#After=network.target<br />
<br />
[Service]<br />
Type=oneshot<br />
ExecStart=bash /user/local/bin/EnableXX.sh<br />
StandardOutput=journal<br />
<br />
[Install]<br />
WantedBy=multi-user.target<br />
</syntaxhighlight>Die Zeile Before=fhem.service stellt sicher, dass der Start vor FHEM erfolgt.<br />
<br />
'''3. Service aktivieren'''<syntaxhighlight lang="bash"><br />
#sudo systemctl daemon-reload # nur notwendig wenn nicht systemctl edit verwendet wurde<br />
sudo systemctl enable enablexx<br />
sudo systemctl start enablexx<br />
</syntaxhighlight>Den Erfolg auch nach einem komplette Neustart testen!<br />
<br />
=== Ein Script zusammen mit FHEM starten ===<br />
'''1. Script bereitstellen'''<br />
<br />
Dazu wird eine Scriptdatei erzeugt, Beispiel:<syntaxhighlight lang="bash"><br />
sudo nano /opt/fhem/ExecStartPre.sh<br />
</syntaxhighlight>Den Code (Beispiele am Ende) hier einfügen und die Datei speichern und Editor verlassen (ctrl+s ctrl+x). <br />
<br />
'''2. ExecStartPre aktivieren'''<br />
<br />
Um ein Script mit root Rechten in der fhem.service unit auszuführen, müssen drei Zeilen in der Datei geändert werden ([[Fhem.service (systemd unit file)#unit file bearbeiten|siehe oben]]).<br />
<br />
Vor der Zeile ExecStart= wir diese Zeile eingefügt:<syntaxhighlight lang="bash"><br />
[Service]<br />
...<br />
ExecStartPre= bash /opt/fhem/ExecStartPre.sh<br />
ExecStart=...<br />
</syntaxhighlight><br />
Die beiden Zeilen User und Group muss man auskommentieren, da die Unit sonst mit dem User fhem ausgeführt wird.<br />
{{Randnotiz|RNTyp=Fehl|RNText=Achtung: Die Gruppenmitgliedschaft des Users fhem (z.B. gpio) ist beim Systemstart an der Stelle noch nicht wirksam.}}<br />
#User=fhem <br />
#Group=dialout<br />
<br />
<br />
'''3. Änderungen aktivieren'''<br />
<br />
Die Änderungen werden erst nach einem daemon-reload aktiv und nach einem restart wirksam.<syntaxhighlight lang="bash"><br />
#sudo systemctl daemon-reload # nur notwendig wenn nicht systemctl edit verwendet wurde<br />
sudo systemctl restart fhem<br />
</syntaxhighlight>Den Erfolg auch nach einem komplette Neustart testen!<br />
<br />
=== Start von anderen Services abhängig machen ===<br />
In der fhem.service unit kann man sicherstellen, dass ein Service fertig gestartet wurde bevor fhem startet. Dazu kann man im unit Abschnitt zwei Zeilen einfügen (bzw. Kommentar entfernen):<syntaxhighlight lang="bash"><br />
Wants=xxx.service <br />
After=xxx.service<br />
</syntaxhighlight>Man kann auch erzwingen, dass FHEM nicht startet falls die Voraussetzungen nicht erfüllt sind. Dafür muss anstatt Wants= Requires= verwendet werden.<br />
<br />
== Einstellungen dies und das ==<br />
<br />
=== Start verzögern ===<br />
Es ist immer besser eine direkte Abhängigkeit zu definieren. In unklaren Situationen oder als erste Abhilfe kann es notwendig sein, einfach den FHEM Start zu verzögern.<br />
<br />
Der default Wert für ''TimeoutStartSec='' liegt bei 90 sec. Soll die Startverzögerung länger sein, muss dieser Wert zusätzlich gesetzt werden. Ansonsten wird der Start mit einer Fehlermeldung abgebrochen.<br />
<syntaxhighlight lang="text"><br />
[Service]<br />
...<br />
ExecStartPre=/bin/sleep 10<br />
#TimeoutStartSec= # default 90, set for larger sleep time<br />
</syntaxhighlight><br />
<br />
=== Restart verzögern ===<br />
Sollte man z.B. bei einem Neustart über die FHEM Oberfläche (shutdown restart) zwei Starts innerhalb von 1 Sekunde im Logfile beobachten, kann man den Neustart im unit file mit einem Parameter um 2 - 10 Sekunden ({{Link2Forum|Topic=93870|Message=924833|LinkText=siehe auch diesen Forenbeitrag}}) verzögern:<br />
<syntaxhighlight lang="text"><br />
[Service]<br />
...<br />
Restart=...<br />
RestartSec=2<br />
...<br />
</syntaxhighlight><br />
<br />
== Hinweise und Tipps ==<br />
=== Startreihenfolge beeinflussen ===<br />
Wie man erzwingen kann, dass FHEM '''nach''' hciuart (Bluetooth Service) startet, ist in {{Link2Forum|Topic=110716|LinkText=diesem Forenbeitrag}} beschrieben.<br />
<br />
=== Ausgaben im Script ===<br />
Ausgaben mit echo landen im /var/log/syslog. Das Log kann man mit diesem Befehl anzeigen. Ist das Logfile zu unübersichtlich kann man sich auch z.B. nur 15 Zeilen nach systemd Ausgabe des unit files anzeigen lassen.<br />
<syntaxhighlight lang="bash"><br />
cat /var/log/syslog<br />
cat /var/log/syslog|grep -A 15 "FHEM Home"<br />
</syntaxhighlight><br />
<br />
=== Beispielcode ===<br />
Diese Codebeispiel ist auf dem Raspberry Pi ausführbar und lässt vor dem Start von FHEM die grüne LED (ACT) blinken.<br />
<br />
'''Beispiel 1: 3 mal kurz und 3 mal lang'''<syntaxhighlight lang="bash"><br />
# Lass die ACT LED (grün) am Pi 3 mal kurz und 3 mal lang blinken<br />
ANZAHL=3<br />
#Status (Standard [mmc0] )sichern<br />
trigger=$(cat /sys/class/leds/led0/trigger|grep -o "\[.*\]"|tr -d [+])<br />
#umschalten auf manuell<br />
echo "none" >/sys/class/leds/led0/trigger<br />
#blinken<br />
for ((i=1 ; i<=$(( $ANZAHL * 2 )) ; i++ )); do<br />
echo $(( $i % 2 )) >/sys/class/leds/led0/brightness<br />
sleep 0.3<br />
done<br />
for ((i=1 ; i<=$(( $ANZAHL * 2 )) ; i++ )); do<br />
echo $(( $i % 2 )) >/sys/class/leds/led0/brightness<br />
sleep 1<br />
done<br />
#Status wieder herstellen<br />
echo $trigger >/sys/class/leds/led0/trigger<br />
</syntaxhighlight></div>Otto123http://wiki.fhem.de/w/index.php?title=MQTT2-Module_-_Praxisbeispiele&diff=37151MQTT2-Module - Praxisbeispiele2022-01-23T11:35:05Z<p>Otto123: /* Setup in FHEM */ Define SonosBridge alte Beschreibung entfernt und korrigiert</p>
<hr />
<div>== Einführung: MQTT bzw. MQTT2 in FHEM ==<br />
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT verwenden, beachten Sie bitte, dass der MQTT2_CLIENT die ursprüngliche Herkunft der über MQTT verteilten Informationen nicht kennt. Daher ergeben sich in der Anwendung kleinere Unterschiede, zu deren Verständnis die diesbezüglichen [[MQTT2_CLIENT#Anwendung|Hinweise zu MQTT2_CLIENT]] bekannt sein sollten.}}Zur Einbindung von Geräten, welche zur Nutzung des MQTT-Protokols konfiguriert werden können und darüber mit einem MQTT-Server (früher: Broker) kommunizieren, stehen unter FHEM verschiedene Optionen zur Verfügung, wobei nicht alle Module beliebig miteinander verwendet werden können. Details hierzu sind dieser [[MQTT|Übersicht]] zu entnehmen. <br />
<br />
Im Rahmen dieses Artikels wird für die eigentlichen Geräte [[MQTT2 DEVICE|MQTT2_DEVICE]] verwendet, damit wird als IO-Device entweder {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} oder [[MQTT2 CLIENT|MQTT2_CLIENT]] benötigt, mit einem IO-Device des Typs [[MQTT (Modul)|MQTT]] funktioniert die nachfolgende Darstellung dagegen nicht<ref>Allerdings können die Konfigurationen in der Regel recht einfach auf die bisherige MQTT-Implementierung übertragen werden</ref>. MQTT2_DEVICE unterstützt u.a. auch die ''setExtensions'' direkt, also z.B. ''on-for-timer<ref>Beachten Sie bei mehrkanaligen Geräten, dass jeweils nur ein Hauptkanal mittels setExtensions verwaltet werden kann! U.a. aus diesen Grund ist es meist sinnvoller, die ''split''-Varianten der attrTemplate-Einrichtung zu verwenden.</ref>'' sowie ''[[MQTT2-Module - Praxisbeispiele#attrTemplate_2|attrTemplate]]''<ref>Auch MQTT_DEVICE unterstützt SetExtensions, allerdings muss dies dort per Attribut eingeschaltet werden</ref>.<br />
<br />
=== Allgemeine Einstellungen und Hinweise ===<br />
{{Randnotiz|RNTyp=r|RNText=Beachten Sie, dass für [[autocreate]] in Verbindung mit MQTT2_SERVER '''zwingend''' jeder über MQTT kommunizierende Client eine ClientID angeben muss. Passen Sie daher ggf. die Einstellungen Ihres Geräts an. Manche Geräte verwenden auch "Wegwerf"-ClientID's. Für diese empfiehlt es sich, ggf. dann die durch autocreate erstellten Geräte nachzubearbeiten und die ClientID-Angabe v.a. aus den Inhalten des readingList-Attributs zu entfernen.}}Die nachfolgenden Beispiele gelingen am einfachsten mit '''MQTT2_SERVER als Server ("Broker")''', für diesen sollte dabei ''autocreate'' '''nicht deaktiviert''' sein, damit die erforderlichen MQTT2_DEVICES soweit möglich automatisiert erstellt werden<ref>Dabei wird vorausgesetzt, dass ein allgemeines {{Link2CmdRef|Anker=autocreate|Lang=en|Label=autocreate}}-Device (''TYPE=autocreate'') ebenfalls aktiv ist.</ref> . <br />
<br />
Beispiel<ref>MQTT2_SERVER verwendet als default-Einstellung für ''autocreate'' ''simple'', ohne dass ein entsprechendes Attribut gesetzt werden müsste. Die Einstellung ''complex'' empfiehlt sich in der Regel nicht; diese ist jedoch dann zu empfehlen, wenn das Device entweder verschachtelte JSON-Array-Strukturen liefert oder bestimmte Readings nicht gefüllt werden sollen.</ref>:<br />
define MQTT2_FHEM_Server MQTT2_SERVER 1883 global<br />
<br />
Falls der MQTT Broker mit Hilfe von [[allowed]] abgesichert wurde, muss in den Geräten ebenfalls User bzw. Passwort eingetragen werden, damit eine MQTT Kommunikation möglich ist.<br />
<br />
{{Hinweis|Die Code-Darstellung in diesem Beitrag entspricht jeweils dem RAW-Format zum [[Import von Code Snippets]]. Wer die Attribute direkt und einzeln bearbeitet, muss ggf. die "\" entfernen!}}<br />
<br />
=== MQTT-Einstellungen in den Geräten ===<br />
Die Beispiele gehen davon aus, dass die einzubindenden Geräte '''''mit den default-Einstellungen''''' für MQTT betrieben werden, wenn man von den Angaben zum Server und ggf. der Gerätekennung absieht. Es sollten also insbesondere '''keine Veränderungen der topic-Pfade''' vorgenommen werden.<br />
<br />
{{Hinweis|Einige der hier beschriebenen Einstellungen haben Änderungen der sich durch die jeweiligen Automatismen eigentlich jeweils ergebenden Standard-Werte zur Folge, insbesondere, was Reading-Namen und von den Geräten gesendete Werte angeht. Sie sollten daher zunächst die Konfiguration des jeweiligen MQTT2-DEVICE-Geräts abschließen, und erst anschließend die weitere Integration mit Event-Handlern, logging usw. vornehmen. }}<br />
<br />
=== auto-Konfigurations-features ===<br />
Viele firmwares und Dienste bieten Möglichkeiten an, einer Controller-Software (insbesondere homeassistant) Hilfsdaten zur automatisierten Konfiguration bereitzustellen. Da FHEM diese Daten nicht zu ihrem ursprünglichen Zweck verwenden kann, werden hierdurch lediglich zusätzliche Readings erzeugt, mit denen man als User in der Regel wenig anfangen kann. Es wird daher empfohlen, derartige features '''abzuschalten'''. Wo dies nicht möglich ist, sollte man eine passende [[MQTT2_CLIENT#ignoreRegexp|ignoreRegexp]] setzen bzw. diese passend erweitern!<br />
<br />
=== Schritt für Schritt ===<br />
Hier werden in der Regel fertige Konfigurationen für häufige Anwendungsfälle (beispielhaft) dargestellt. In [[MQTT2_DEVICE - Schritt für Schritt]] ist etwas mehr über die Vorgehensweise bei der Zusammenstellung der verschiedenen Attribute und deren Zusammenwirken zu erfahren.<br />
<br />
== zigbee2mqtt ==<br />
[[Bild:MQTT2_zigbee2mqtt_Bulbs.png|400px|thumb|Darstellung in FHEMWEB]]<br />
[https://www.zigbee2mqtt.io zigbee2mqtt] ist ein open-source Projekt, mit dem zigbee-Geräte über MQTT direkt angesprochen werden können, ohne dass hierfür eine Bridge eines Herstellers benötigt wird.<br />
<br />
Einzelheiten zur Vorgehensweise sind auf der Detailseite [[Zigbee2mqtt|zigbee2mqtt]] zu finden.<br />
<br />
== Tasmota ==<br />
{{Randnotiz|RNTyp=r|RNText=Bitte beachten Sie, dass versicherungsrechtliche Probleme entstehen können, wenn die herstellereigene Firmware ersetzt wird!}}[https://github.com/arendst/Sonoff-Tasmota Tasmota] ('''T'''heo '''A'''rends '''S'''onoff '''M'''QTT '''O'''ver '''T'''he '''A'''ir - einer offenen Firmware von [https://github.com/arendst arendst]) ist eine open-source Software für ESP8266-Geräte, die z.B. statt der originalen Firmware für Sonoff-Geräte und andere ESP8266-basierte WLAN-Steckdosen usw. verwendet werden kann. <br />
{{Hinweis|[[Datei:Tasmota mqtt config.png|120px|thumb|right]]Vor allem, aber nicht nur bei Verwendung des MQTT2_CLIENT als IO, ist es empfehlenswert, in der MQTT-Konfiguration der tasmota-Geräte für den Parameter ''<nowiki>topic = %topic% (tasmota)</nowiki>'' ebenfalls die dynamisch aus der Chip-ID erzeugte Kennung ''DVES_%06X'' zu verwenden. (Kopieren Sie einfach diese Zeichenkette aus dem Eingabefeld für ''"client ..."'', siehe nebenstehende Abbildung). Die eigentliche Umbenennung zu einem "sprechenden Namen" kann dann innerhalb von FHEM - mittels ''rename'' oder ggf. mit einem ''alias'' - erfolgen.}}<br />
=== MQTT2_DEVICE ===<br />
Dieses sollte bei aktiviertem ''autocreate'' am MQTT2_SERVER-Device automatisch angelegt werden, sobald das betreffende Gerät eingesteckt oder neu gestartet oder an einem evtl. vorhandenen Taster geschalten wird. Bislang wurden Tasmota version(en) ab 6.1.1 bis min. 8.1.0 getestet, dies auf verschiedener Hardware, zunächst mit Sonoff Touch und S20, zwischenzeitlich mit einer Vielzahl von Geräten, die per USB-Adapter oder mit der Methode aus dem [https://www.heise.de/ct/artikel/Tuya-Convert-IoT-Geraete-ohne-Loeten-vom-Cloud-Zwang-befreien-4283623.html Tuya-Convert]-Projekt des heise-Verlags auf Tasmota umgeflasht wurden.<br />
<br />
=== Manuelle Anpassungen - Schalter ===<br />
Die RAW-Definition kann dann beispielsweise wie folgt ergänzt werden: <br />
<syntaxhighlight lang="perl"><br />
defmod MQTT2_DVES_9B01BD MQTT2_DEVICE DVES_9B01BD<br />
attr MQTT2_DVES_9B01BD IODev m2server<br />
attr MQTT2_DVES_9B01BD devStateIcon on:FS20.on:off off:FS20.off:on<br />
attr MQTT2_DVES_9B01BD readingList DVES_9B01BD:tele/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:tele/DVES_9B01BD/LWT:.* LWT\<br />
DVES_9B01BD:tele/DVES_9B01BD/UPTIME:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:tele/DVES_9B01BD/SENSOR:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:tele/DVES_9B01BD/INFO1:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:tele/DVES_9B01BD/INFO2:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:tele/DVES_9B01BD/INFO3:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:stat/DVES_9B01BD/RESULT:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:stat/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }<br />
attr MQTT2_DVES_9B01BD room MQTT2_DEVICE<br />
attr MQTT2_DVES_9B01BD setList on cmnd/DVES_9B01BD/POWER on\<br />
off cmnd/DVES_9B01BD/POWER off\<br />
reboot cmnd/DVES_9B01BD/Restart 1<br />
attr MQTT2_DVES_9B01BD webCmd on:off:reboot<br />
</syntaxhighlight><br />
<br />
=== Manuelle Anpassungen - Dimmer ===<br />
{{Randnotiz|RNTyp=r|RNText=Dieses Beispiel ist nur bedingt zur Nachahmung zu empfehlen: Prinzipiell kann man Readings und setter in MQTT2_DEVICE fast nach Belieben benennen. Wählt man allerdings <i>FHEM-typische</i> Namen, kann dies sehr zur Vereinfachung beitragen. Z.B. wird eine Sprachssteuerung bei einem Dimmer üblicherweise automatisch korrekt eingestellt werden, wenn der für die Helligkeit zuständige setter z.B. <i>pct</i> (oder <i>brightness</i>) heißt, oder eine abzufragende Temperatur <i>temperature</i>. Entsprechendes gilt im Rahmen von <i>devspec-Abfragen</i>.}}Bei einem Dimmer sind einige zusätzliche Anpassungen vorzunehmen. Ein Dimmer wird über '''POWER''' geschaltet und über '''Dimmer''' gedimmt. Damit das funktioniert, müssen ein stateFormat und devStateIcon zusammenarbeiten:<br />
<syntaxhighlight lang="perl"><br />
attr MQTT2_DVES_2DF34D devStateIcon 10\d.*:dim100%@orange:off 1\d.*:dim12%@orange:off 2\d.*:dim18%@orange:off 3\d.*:dim31%@orange:off 4\d.*:dim43%@orange:off 5\d.*:dim50%@orange:off 6\d.*:dim62%@orange:off 7\d.*:dim68%@orange:off 8\d.*:dim81%@orange:off 9\d.*:dim93%@orange:off 0:FS20.off:on .*:FS20.off@orange:off<br />
attr MQTT2_DVES_2DF34D stateFormat {if(ReadingsVal($name,"POWER",0)eq"off"){0}else{ReadingsVal($name,"Dimmer",0)}}<br />
</syntaxhighlight><br />
Nun kann man über das Icon ein- und ausschalten und der Zustand des Dimmers wird korrekt angezeigt.<br />
<br />
Es fehlt noch ein Slider, um auch dimmen zu können. Zusätzlich muss setList noch um Dimmer erweitert werden:<br />
<syntaxhighlight lang="text"><br />
attr MQTT2_DVES_2DF34D setList on cmnd/dimmer/POWER on\<br />
off cmnd/dimmer/POWER off\<br />
Dimmer cmnd/dimmer/Dimmer<br />
attr MQTT2_DVES_2DF34D webCmd Dimmer<br />
attr MQTT2_DVES_2DF34D widgetOverride Dimmer:slider,0,1,100<br />
</syntaxhighlight><br />
<br />
=== attrTemplate ===<br />
===== Allgemeines =====<br />
Für gängige Tasmota-Geräte stehen ''templates'' bereit, mit denen sich diese schnell konfigurieren lassen. <br />
Beachten Sie dazu den Abschnitt ''attrTemplate'' in [[MQTT2 DEVICE#attrTemplate|MQTT2_DEVICE]]. Bei Anwendung eines template mit "split" im Namen werden dabei weitere Geräte angelegt und konfiguriert.{{Hinweis|Bitte attrTemplates nicht verwechseln mit templates, die auf den Tasmota- bzw. Blackadder-Seiten angeboten werden, welche zur Konfiguration der firmware genutzt werden können! Es sollte zunächst die firmware korrekt eingerichtet werden, so dass das Gerät selbst direkt auf dessen Web-Interface korrekt bedient werden kann.}}<br />
<br />
===== Kein passendes attrTemplate vorhanden? =====<br />
Exisitert (noch) kein passendes attrTemplate, ist zu empfehlen, zunächst das "''tasmota_basic''" anzuwenden. Dieses führt einige Basiskonfigurationen durch, die für FHEM hilfreich sind, z.B. wird die firmware so eingestellt, dass Schaltzustände in Kleinschreibung übermittelt werden, statt der defaults "ON" bzw. "OFF".<br />
<br />
Allerdings stellt dieses das ''autocreate'' an dem MQTT2_DEVICE auf 0, was dann nicht optimal ist, wenn man weitere Readings aus dem Gerät erwartet, etwa, weil zusätzliche Sensoren vorhanden sind. In diesem Fall empfiehlt es sich, das ''autocreate''-Attribut an dem MQTT2_DEVICE zu löschen, damit alle weiteren Informationen verarbeitet werden und ggf. im ''jsonMap''-Attribut nur die Angabe "''POWER1:state''" zu belassen.<br />
<br />
=== on-for-timer ===<br />
Um z.B. ein Relais nur für einen Zeitraum anzuschalten, kann man bei Tasmota-Geräten zwischen mehrere Varianten wählen. Ohne speziellen ''setter'' in der ''setList'' werden die '''SetExtensions''' verwendet. Timer laufen damit innerhalb FHEM. Da diese intern als temporäres [[at]] ausgeführt werden, sind diese auch noch nach einem FHEM-Neustart vorhanden, sofern FHEM ordnungsgemäß beendet und neu gestartet wird.<br />
<br />
Die Tasmota-firmware bietet ergänzend dazu zwei Möglichkeiten an, bei denen der Timer direkt auf dem ESP-Microcontroller verwaltet wird:<br />
<br />
==== delay ==== <br />
Zeile zur Erweiterung der ''setList'' (Attributeingabe via FHEMWEB!):<br />
on-for-timer {my $duration = $EVTPART1*10; 'cmnd/DVES_575127/Backlog POWER1 1; delay '.$duration.'; POWER1 0'}<br />
<br />
Ohne Auswirkungen auf alles, was danach kommt, hat aber den Nachteil, dass die möglichen Zeitspannen auf 3600 1/10 Sekunden begrenzt sind (siehe [https://tasmota.github.io/docs/Commands/#delay Commands - Tasmota Delay]), also 6 Minuten.<br />
<br />
====pulseTime ====<br />
Zeile zur Erweiterung der ''setList'' (s.o.):<br />
on-for-timer {my $duration = $EVTPART1 < 11.2 ? $EVTPART1*10 : $EVTPART1+100; 'CMNDTOPIC/Backlog pulseTime1 '.$duration.'; POWER1 1'}<br />
Auch hier sind die möglichen längsten Einschaltdauern begrenzt, allerdings ist diese mit 18h deutlich länger als mit ''delay''. Diese Implementierung hat den Nachteil, dass der ESP-Microcontroller die jeweils letzte pulseTime auch für alle weiteren "normalen" Einschaltvorgänge berücksichtigt, das Relais also ebenfalls nach Ablauf der übermittelten pulseTime abgeschaltet wird; dies gilt allerdings ohne explizites ''save'' nur bis zum nächsten reboot des Microcontrollers.<br />
<br />
=== zigbee2tasmota ===<br />
[https://tasmota.github.io/docs/Zigbee/ zigbee2tasmota] ist eine Erweiterung der Tasmota-firmware für Microcontroller, insbesondere dem ESP8266 (und ESP32)(link), über die einige ZigBee-Chipsätze (insbesondere TI CC2530) als [[ZigBee#Koordinator_.28ZigBee_coordinator.2C_ZC.29|Coordinator]] eingebunden werden können, um ein ZigBee-Netzwerk aufzubauen.<br />
{{Hinweis|Stand 08/2020 war die Einbindung anderer Chipsätze erst in einem Alpha-Stadium; die Zahl der über einen CC2530 einbindbaren ZigBee-Geräte ist daher derzeit relativ begrenzt (ca. 16)!}}<br />
Auch für diese Lösung stehen einige ''attrTemplate'' zur Verfügung. Nähere Informationen hierzu sind dem Artikel [[Zigbee2Tasmota-MQTT]] zu entnehmen.<br />
<br />
== ESPurna ==<br />
ESPurna ist eine weitere alternative firmware für ESP8266-basierte Geräte, Details sind der [https://github.com/xoseperez/espurna/wiki Projektseite] zu entnehmen.<br />
<br />
Das Format, in dem ESPurna Daten sendet, unterscheidet sich v.a. darin, dass bool'sche Werte als 0 oder 1 gesendet werden, und nicht wie sonst üblich als "on" oder "off" oä.. Es stehen einige Mustertemplates zur Verfügung, um diese Art der Payload in FHEM-konforme Werte zu überführen.<br />
<br />
== Shelly ==<br />
=== Vorbemerkung ===<br />
Auch für Shelly-Geräte steht eine Auswahl an [[MQTT2-Module - Praxisbeispiele#attrTemplate_2|templates]] bereit.<br />
Beachten Sie auch hier, dass uU. bei Anwendung eines template mit "split" im Namen weitere Geräte angelegt und konfiguriert werden.<br />
<br />
Standardmäßig senden die Shelly-Geräte ihren kompletten Status alle 30 Sekunden. Dies kann man über den Parameter ''mqtt_update_period'' in den ''settings'' ändern, allerdings ist dieser nur über die HTTP-Schnittstelle des Shelly verfügbar. Um diese Statusupdates abzustellen, kann über den Browser folgender Befehl verwendet werden:<br />
http://<ip-des-shelly>/settings?mqtt_update_period=0, <br />
Soweit bekannt, werden dann nur statische updates ausgeschaltet, z.B. für das Relay bzw. angeschlossene Taster oder Schalter; insbesondere Verbrauchswerte werden dennoch aktualisiert.<br />
<br />
=== Shelly1 ===<br />
<br />
=== Shellybulb ===<br />
Zunächst muss man einen Statusupdate des Shellybulb erzwingen (Aus- und Einschalten, physikalisch oder per Web-UI), damit das Gerät bei eingeschaltetem autocreate angelegt wird. Dies sieht zunächst so aus:<br />
Internals:<br />
CFGFN <br />
CID shellybulb_3CC533<br />
DEF shellybulb_3CC533<br />
DEVICETOPIC MQTT2_shellybulb_3CC533<br />
IODev MQTT2_FHEM_Server<br />
NAME MQTT2_shellybulb_3CC533<br />
NR 246<br />
STATE ???<br />
TYPE MQTT2_DEVICE<br />
READINGS:<br />
2018-12-12 19:28:08 status_blue 0<br />
2018-12-12 19:28:08 status_brightness 61<br />
2018-12-12 19:28:08 status_effect 0<br />
2018-12-12 19:28:08 status_gain 26<br />
2018-12-12 19:28:08 status_green 0<br />
2018-12-12 19:28:08 status_ison true<br />
2018-12-12 19:28:08 status_mode color<br />
2018-12-12 19:28:08 status_red 255<br />
2018-12-12 19:28:08 status_temp 3250<br />
2018-12-12 19:28:08 status_white 0<br />
Attributes:<br />
IODev MQTT2_FHEM_Server<br />
readingList shellybulb_3CC533:shellies/shellybulb-3CC533/color/0/status:.* { json2nameValue($EVENT, 'status_') }<br />
room MQTT2_DEVICE<br />
[[Bild:MQTT2 Shellybulb.png|400px|thumb|Darstellung in FHEMWEB nach Anwendung des template]]Dann bei den set-Anweisungen das attrTemplate "shellybulb" auswählen und setzen. Es erscheint eine Abfrage, ob die vorhandenen Readings gelöscht werden sollen. Diese bitte bestätigen und die Seite neu laden. Danach einmal An- und Ausschalten, damit die Readings auch durch einen neuen Status initialisiert werden und die Seite im Browser neu laden.<br />
<br />
=== Shelly Plug S ===<br />
Über die Leistungsmessung des Shelly Plug S lässt sich sehr einfach auch eine Erkennung des Betriebszustandes des angeschlossenen Gerätes realisieren. Dazu stellt man zuerst fest, wieviel Leistung das Gerät in jedem Betriebszustand verbraucht und kann dann z.B. für einen angeschlossenen Fernseher, der im Standby 1 Watt und im Betrieb > 100 Watt verbraucht, den Zustand erkennen und als on/off Status anzeigen. Dazu wird das state Reading wie folgt definiert:<br />
attr readingList shellies/shellyplug-s-123456/relay/0/power:.* { { state => $EVTPART0<100?"off":"on" } }<br />
Der Status des MQTT2 Devices zeigt dann bei <100W "off" und sonst "on" an.<br />
<br />
=== HTTP-Commands ===<br />
In diesem {{Link2Forum|Topic=102369|LinkText=Forumsbeitrag}} wird eine Lösung vorgestellt, um über [[99 myUtils anlegen|myUtils-Code]] weitere Kommandos bereitzustellen, die sonst nur direkt über das Web-Interface zu erreichen sind.<br />
<br />
== OpenMQTTGateway ==<br />
Um verschiedene Systeme wie BLE usw. auf MQTT zu bringen bietet sich [https://github.com/1technophile/OpenMQTTGateway OpenMQTTGateway] an, z.B. wird für das Auslesen vieler BLE-Seonsoren lediglich ein ESP32-Board ohne Zusatzhardware (ab ca. 5,- Euro in Fernost erhältlich) benötigt, auf das dann eine vorkompilierte firmware geflasht wird (hierfür wird ein USB-seriell-Wandler benötigt).<br />
<br />
Nähere Details sind im Artikel [[OpenMQTTGateway]] zu finden.<br />
<br />
== 8-Port-Ethernet Board ==<br />
<gallery><br />
datei:8-relais-ethernetboard closed.jpg|mit Gehäuse<br />
datei:8-Port-MQTT-Relais-Board.jpg|ohne Gehäuse<br />
</gallery><br />
In diesem {{Link2Forum|Topic=107536|Message=1016379|LinkText=Forenbeitrag}} bzw. dem betreffenden Thread wurde ein Relais-Board vorgestellt, mit dem 8 Relais über Ethernetkabel verbunden werden, die Kommunikation erfolgt dann über MQTT. Über die verwendete Software ist wenig bekannt, es könnte jedoch sein, dass diese Art der Einbindung auch bei weiteren Boards funktioniert, die einen bestimmten Ethernet-Chipset von TI (DP83848) und eine Cortex M3 MCU verwenden.<br />
<br />
== Milight-Bridge ==<br />
=== Vorbemerkung ===<br />
Der [https://github.com/sidoh/esp8266_milight_hub esp8266_milight_hub] ist ein open source- Projekt, mit dem auf Basis von ''openmili'' eine Vielzahl von MiLight-Geräten gesteuert werden können. Der MiLight-Hub erstetzt dabei eine beliebige Zahl von Milight-Bridges und ist auch zu verschiedenen Versionen des MiLight-Protokols kompatibel.<br />
Neben MQTT kann dieser auch mit HTTPMOD oder Wifilight (bzw. den MiLight-Modulen) gesteuert werden. Die Hardware entspricht dabei im Wesentlichen einem MySensors-Wifi-Gateway<ref>Es wird lediglich ein anderer CS-PIN genutzt. Dies kann einfach in der Web-Oberfläche der Firmware umgestellt werden.</ref>.<br />
Hier wird vorausgesetzt, dass eine funktionierende Bridge vorhanden ist.<br />
Der Vorteil der MQTT-Lösung liegt darin, dass man bei kompatiblen Fernbedienungen auch direkt Informationen über Schaltvorgänge erhält, die mit der Fernbedienung ausgelöst werden.<br />
<br />
=== Einstellungen am MiLight-Hub ===<br />
Die zum FHEM-Server bzw. dem MQTT2_SERVER passenden Vorgaben sind im Web-Interface des Hub einzustellen. Gegebenenfalls passen Sie die vom Hub zurückzugebenden Elemente im Web-Interface des Hub an.<br />
Die Einstellungen für ''MQTT topic pattern'' usw. können auf den default-Werten<ref>Diese sind: <br>''milight/:device_id/:device_type/:group_id'' für "topic pattern"<br>''milight/updates/:hex_device_id/:device_type/:group_id'' für "update topic pattern"<br>''milight/states/:hex_device_id/:device_type/:group_id'' für "state topic pattern". Der Autor hat derzeit folgende Infotypen zum Senden markiert: "status, brightness, hue, color, mode, color_temp, bulb_mode, computed_color, hex_color" (enthält eventuell zu viele Angaben. Bei einem Eventhandler muss man uU. darauf achten, dass kurz hintereinander zweimal dasselbe Event kommen kann (für ON/OFF)).</ref> belassen werden, für die seit Mitte 2019 vorhandene Option, eine LWT-Message zu senden (''MQTT Client Status Topic''), tragen Sie ''milight/LWT'' ein und aktivieren ''Detailed''.<br />
<br />
=== FHEM-Devices ===<br />
[[Bild:MQTT2 MiLight.png|400px|thumb|Milight: Darstellung in FHEMWEB]]<br />
==== Bridge ====<br />
Wird nun über den Hub oder eine von diesem erkannte Fernbedienung ein vorhandenes Leuchtmittel geschaltet, wird bei eingeschaltetem autocreate ein erstes Device erstellt, die zunächst erstellte Definition sieht typischerweise etwa so aus:<br />
defmod MQTT2_milight_hub_1370325 MQTT2_DEVICE milight_hub_1370325<br />
attr MQTT2_milight_hub_1370325 IODev MQTT2_FHEM_Server<br />
attr MQTT2_milight_hub_1370325 readingList milight_hub_1370325:milight/updates/0xBE59/rgbw/1:.* { json2nameValue($EVENT, '1_', $JSONMAP) }<br />
attr MQTT2_milight_hub_1370325 room MQTT2_DEVICE<br />
<br />
Auf dieses Device wird nun das ''template'' '''esp_milight_hub_bridge''' angewandt.<br />
<br />
==== Einzelne Leuchtmittel ====<br />
<br />
Wird nun nochmals das oben verwendete Leuchtmittel geschaltet, erstellt autocreate ein weiteres Device:<br />
defmod MQTT2_milight_0xBE59_1 MQTT2_DEVICE milight_0xBE59_1<br />
attr MQTT2_milight_0xBE59_1 IODev MQTT2_FHEM_Server<br />
attr MQTT2_milight_0xBE59_1 readingList milight/states/0xBE59/rgbw/1:.* { json2nameValue($EVENT, '1_', $JSONMAP) }<br />
attr MQTT2_milight_0xBE59_1 room MQTT2_DEVICE<br />
<br />
Auf dieses wird nun eines der Bulb-templates angewendet. Wählt man das template X_01_esp_milight_hub_rgbw_bulb, wird eine einfache Variante erstellt, die neben einem toggelnden Icon nur Regler für Helligkeit, die Farbe und zwei Schaltflächen für den Weiß- und Nachtmodus enthält. Wer mehr oder andere Steuerelemente erhalten möchte, verwendet ein anderes template. Nicht benötigte Elemente kann man dabei einfach aus der Definition löschen.<br />
<br />
Alle weiteren Devices werden genauso erstellt. <br />
<br />
Um ein Device zu erhalten, mit dem sich alle Kanäle gleichzeitig steuern lassen, kann das template ''X_01a_esp_milight_hub_make_rgbw_group'' verwendet werden. Dieses verändert nicht das aktuelle Device, sondern erstellt '''eine Kopie''', die dann modifiziert wird. Diese Kopie ist unter dem Namen ''milight_<RemoteID>_0'' im selben Raum zu finden wie das Ausgangsgerät und kann ebenfalls an die eigenen Wünsche angepasst werden. <br />
<br />
Weitere Beispiele:<br />
Beispiel für ein RGB-CCT-Device:<br />
defmod Licht_Wz_all MQTT2_DEVICE<br />
attr Licht_Wz_all IODev MQTT2_Broker<br />
attr Licht_Wz_all eventMap /set_white:Weiss/night_mode:Nacht/white_mode:white/on:on/off:off/ON:on/OFF:off/next_mode:Mode/mode_speed_up:Up/mode_speed_down:Down/<br />
attr Licht_Wz_all group Licht<br />
attr Licht_Wz_all icon light_control<br />
attr Licht_Wz_all readingList milight/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\<br />
milight/updates/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\<br />
milight/states/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\<br />
<br />
attr Licht_Wz_all room Wohnzimmer<br />
attr Licht_Wz_all setList on milight/0x5D02/rgb_cct/0 {"status":"ON"}\<br />
off milight/0x5D02/rgb_cct/0 {"status":"OFF"}\<br />
level milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
hue:colorpicker,HUE,0,1,359 milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
command:uzsuSelectRadio,Weiss,Nacht,Mode,Up,Down milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
brightness:colorpicker,BRI,0,1,255 milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
next_mode milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
mode_speed_up milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
mode_speed_down milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
saturation:colorpicker,BRI,0,1,100 milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
color_temp:colorpicker,CT,153,1,370 milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
device_id milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
effect milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
mode milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
commands milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}<br />
attr Licht_Wz_all sortby 1<br />
attr Licht_Wz_all webCmd command:brightness:saturation:color_temp:hue<br />
attr Licht_Wz_all webCmdLabel command\ <br />
:brightness:saturation\<br />
:color_temp:hue<br />
==== Ein Leuchtmittel, mehrere Fernbedienungen ====<br />
Pairt man mehrere Fernbedienungen mit einem Leuchtmittel, sollten auch alle entsprechenden Fernbedienungscodes in das readingList-Attribut übernommen werden. Dazu übernimmt man am einfachsten die Einträge aus den zusätzlichen MQTT2_DEVICEs. Benötigt man das zusätzliche Device nicht separat, um z.B. eine getrennte Gruppenschaltung zu realisieren, kann man dieses löschen. Beispiel-readingList für ein Device, das auf zwei Fernbedienungscodes und zwei Gruppen "hört":<br />
<br />
attr Licht_Wz_all readingList milight/states/0x1234/rgbw/2:.* {json2nameValue($EVENT) }\<br />
milight/updates/0x1234/rgbw/2:.* { json2nameValue($EVENT) }\<br />
milight/states/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\<br />
milight/updates/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\<br />
milight/states/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\<br />
milight/updates/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\<br />
milight/states/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }\<br />
milight/updates/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }<br />
<br />
==== Fernbedienung als Input-Device nutzen ====<br />
In diesem {{Link2Forum|Topic=103493|LinkText=Thread}} ist dargestellt, wie man eine Fernbedingung des Typs FUT089 dazu verwenden kann, einen [[MPD]] oder Rollladenaktoren zu steuern, oder diese Fernbedienung für [[Hue#HUE-Device|HUEDevice]]-Leuchtmittel zu nutzen.<br />
Um hier nur Differenz-Meldungen direkt an die betreffende myUtils-Funktion zu übergeben und doppelte Events zu verhindern, sollte hier die readingList so angepasst werden, dass nur Messages aus dem "updates"-Zweig ausgewertet werden: <br />
defmod MiLight_RC1_0 MQTT2_DEVICE milight_0xABCD_0<br />
attr MiLight_RC1_0 readingList milight/states/0xABCD/fut089/[0-8]:.* {}<br />
milight/updates/0xABCD/fut089/0:.* { FHEM::attrT_MiLight_Utils::MPDcontrol('myMPD',$EVENT, 'Yamaha_Main') }\<br />
milight/updates/0x5D47/fut089/1:.* { FHEM::attrT_MiLight_Utils::FUT_to_RGBW('Licht_Stehlampe_links',$EVENT) }\<br />
milight/updates/0x5D47/fut089/2:.* { FHEM::attrT_MiLight_Utils::FUT_to_RGBW('Licht_Stehlampe_rechts',$EVENT) }\<br />
milight/updates/0x5D47/fut089/3:.* { FHEM::attrT_MiLight_Utils::four_Lights_matrix($EVENT, 'Licht_WoZi_Vorn_Aussen', 'Licht_WoZi_Vorn_Mitte', 'Licht_WoZi_Hinten_Aussen', 'Licht_WoZi_Hinten_Mitte') }\<br />
milight/updates/0x5D47/fut089/4:.* { FHEM::attrT_MiLight_Utils::shuttercontrol('Jalousie_WZ',$EVENT) }\<br />
milight/updates/0x5D47/fut089/5:.* { FHEM::attrT_MiLight_Utils::shuttercontrol('Rollladen_WZ_SSO',$EVENT) }\<br />
milight/updates/0x5D47/fut089/6:.* { FHEM::attrT_MiLight_Utils::shuttercontrol('Rollladen_WZ_SSW',$EVENT) }\<br />
milight/updates/0x5D47/fut089/7:.* {}\<br />
milight/updates/0x5D47/fut089/8:.* {}<br />
attr MiLight_RC_WZ stateFormat CommandSet<br />
<br />
<br />
== eBus ==<br />
An dieser Stelle sollen lediglich die Grundzüge erläutert werden, eine ausführliche Anleitung über die Konfiguration des [[EBUS-MQTT2|eBus mit MQTT2 gibt es hier]].<br />
<br />
=== Vorbereitung und Definition am eBus ===<br />
Vorausgesetzt wird ein laufender eBus-Dämon. Dessen Einrichtung wird im Artikel [[EBUS#Software|EBUS]] beschrieben.<br />
In der Konfiguration des Dämons ( /etc/default/ebusd ) ist die Kommunikation über MQTT zu aktivieren und die Topic-Struktur festzulegen, z.B. ''ebusd/%circuit/%name''.<br />
--accesslevel=* --mqttport=1883 --mqttjson --mqtthost=IpAdresseMQTTSERVER --mqtttopic=ebusd/%circuit/%name<br />
{{Hinweis|Nachfolgend wird davon ausgegangen, dass als Vorgabe für mqtttopic ''ebusd'' verwendet wurde. Dies kann geändert werden, es wird aber dringend empfohlen, das mqtttopic in jedem Fall mit ''ebus...'' zu beginnen!}}<br />
<br />
=== Vorbereitung und Definition in FHEM ===<br />
Unabhängig von dem konkret genutzten IO-Modul (MQTT2_SERVER oder MQTT2_CLIENT) sollte an diesem '''''vor''''' den nachfolgenden Schritten zunächst das autocreate ausgeschaltet werden. Weiter sollte geprüft werden, ob es bereits MQTT2_DEVICE-Geräte gibt, die Einträge in der ''readingList'' enthalten, die vom ebus stammen. Da wir die ''readingList'' anschließend mit erweiterten JSON-Optionen erstellen wollen, müssen zumindest sämtliche ''readingList''-Attribute entsprechend bereinigt oder gelöscht werden; in der Regel ist es einfacher, diese Geräte nach dem Deaktivieren des autocreate am IO zu löschen.<br />
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT als IO nutzen, sollte für das weitere Vorgehen eine Kopie des MQTT2-"Sammeldevices" genutzt werden, und dessen ''CID'' auf ''ebusd'' geändert werden. Nach Anwendung des ebusd-splitter-templates müssen dann alle den ebus betreffenden Einträge aus der ''readingList'' des "Sammeldevices" gelöscht werden oder diese ganz gelöscht.}}Ist der ebus-Dämon lauffähig und für MQTT konfiguriert, sendet dieser regelmäßige Messages. <br />
<br />
Sind die Vorbereitungen abgeschlossen, aktivieren wir ''autocreate'' wieder, allerdings wählen wir als autocreate-Methode ''complex'' aus, da der eBus-Dämon teilweise<ref>Dies betrifft vorrangig die Statusmeldungen</ref> eine weiter verschachtelte JSON-Struktur zum Versenden der Informationen verwendet als üblich. Danach wird wie bei den anderen o.g. Geräten automatisch ein neues MQTT2_DEVICE angelegt<ref>Bei Verwendung des MQTT2_CLIENT wird dann die ''readingList'' am bereits definierten MQTT2_DEVICE aus der Kopie des "Sammeldevice" automatisch wieder erstellt bzw. gefüllt.</ref><br />
<br />
==== "ebus-Bridge" ====<br />
Auf das von ''autocreate'' erstellte MQTT2_DEVICE wird nunmehr das template ''eBus_daemon_splitter'' angewendet. Nach einiger Zeit sollte sowohl die readingList an diesem Device erweitert worden sein, wie auch ein oder mehrere neue MQTT2_DEVICE-Geräte angelegt. <br />
Dieses Device liefert zukünftig Readings zum Dämon selbst, wie dessen ''uptime'', alle weiteren am eBus angeschlossenen Teilnehmer werden dagegen zweckmäßigerweise durch ein oder mehrere weitere MQTT2_DEVICE-Geräte dargestellt. <br />
<br />
Das ''attrTemplate'' läd eine weitere ''attrTemplate''-file und [[99 myUtils anlegen|99_myUtils-Code]] vom FHEM-Server nach. Beides steht dann auch unmittelbar zur Nutzung zur Verfügung. <br />
==== "ebusd_bai" und weitere Geräte ====<br />
{{Hinweis|Der eBus-Dämon sendet nicht alle Informationen zu allen am eBus angeschlossenen Geräte automatisch. Diese müssen teilweise erst aktiv angefragt werden. Wie das im einzelnen erfolgen kann, ist dem o.g. Detailartikel zu entnehmen.}}<br />
Funktioniert die Kommunikation zwischen dem eBus-Dämon und FHEM, sollte nach einigen Minuten zumindest ein weiteres Gerät namens ''MQTT2_ebus_bai'' angelegt worden sein.<br />
<br />
== Sonos2Mqtt ==<br />
Aus einem Versuch heraus ist ein {{Link2Forum|Topic=111711|LinkText=kleines Projekt}} geworden: Die Sonos Umgebung mit Hilfe von sonos2mqtt als generisches MQTT2_DEVICE komfortabel in FHEM einzubinden.<br />
<br />
Mit Hilfe von ein paar Templates ist die grundlegende Einbindung in FHEM nach einer kleinen Installation auf Systemebene schnell erledigt. Es läuft derzeit noch zahlreiche Entwicklung und Ideenfindung, die Fortschritte sind live im Thread oder [[Sonos2mqtt|konsolidiert im Wiki]] zu finden.<br />
<br />
=== Setup im System ===<br />
Für dies Funktion wird der nodejs Server [https://github.com/svrooij/sonos2mqtt sonos2mqtt] benötigt. Entweder installiert man den lokal, irgendwo im Netzwerk oder nutzt den [[MQTT2-Module - Praxisbeispiele#Verwendung des Docker Containers|Docker Container.]]<br />
<br />
Der nodejs Server sonos2mqtt kann aus Sicht von FHEM irgendwo im Netzwerk stehen - aber er muss im gleichen Netzwerk wie die Sonosplayer stehen. Das UPNP Sonosnetzwerk funktioniert nicht über Netzwerksegmente hinweg.<br />
<br />
Eine Beschreibung aller Startparameter für sonos2mqtt findet man [https://svrooij.io/sonos2mqtt/getting-started.html in der offiziellen Doku].<br />
<br />
Erreicht der nodejs Server sonos2mqtt den MQTT Server nicht über - default: localhost, Port 1883, keine Anmeldung" - muss der Parameter --mqtt gesetzt werden! <br />
<br />
Beispiele:<br />
:<code>--mqtt mqtt://myuser:the_secret_password@192.168.0.3:1800</code> # alles gesetzt<br />
:<code>--mqtt mqtt://192.168.0.3:1800</code> # IP Adresse und Port gesetzt, keine Anmeldung am MQTT Server<br />
:<code>--mqtt mqtt://192.168.0.3</code> # IP Adresse gesetzt, Port ist Standard 1883<br />
<br />
Erfolgt der Start mit pm2, werden die Parameter mit einem ''zusätzlichen'' doppelten Bindestrich (--) hinter dem nodejs Modul übergeben.<br />
<br />
Beispiel:<br />
<syntaxhighlight lang="perl"><br />
pm2 start sonos2mqtt -- --mqtt mqtt://myuser:the_secret_password@192.168.0.3:1800<br />
</syntaxhighlight><br />
<br />
'''Lokales Setup'''<br />
<br />
Voraussetzung: nodejs und pm2 ist installiert und für alle Benutzer verfügbar. <syntaxhighlight lang="bash"><br />
sudo npm install -g sonos2mqtt<br />
</syntaxhighlight><br />
Je nach Entwicklungsstand sind auch Betaversionen verfügbar. Für aktuelle Betaversionen wird dieser Zusatz beim Setup verwendet. -> sonosmqtt@3.1.0-beta.1<br />
<br />
Wird der sonos2mqtt Server auf einer anderen Maschine eingerichtet, ist der Start entsprechend diesem Absatz [[MQTT2-Module - Praxisbeispiele#Autostart von sonos2mqtt im System mit pm2 .28Alternative.29|Autostart von Sonos2mqtt im System mit pm2]] einzurichten.<br />
<br />
=== Setup in FHEM ===<br />
Man definiert lediglich ein Bridge Device, der Rest wird automatisch erledigt.<br />
<br />
Voraussetzung: <br />
* autocreate im System ist aktiv. <br />
* Der verwendete MQTT2_SERVER steht auf '''autocreate simple''' (default/Standard).<br />
* Templates aktuell - FHEM uptodate oder bei Bedarf in der FHEM Kommandozeile aktualisieren:<br />
<pre><br />
{ Svn_GetFile("FHEM/lib/AttrTemplate/mqtt2.template", "FHEM/lib/AttrTemplate/mqtt2.template", sub(){ AttrTemplate_Initialize() }) }<br />
</pre><br />
Bei der Anwendung des Templates für die Bridge wird das Attribut devicetopic ausgelesen oder auf default sonos gesetzt! <br />
<br />
Wird ein anderer Devicetopic verwendet, muss der bei der Anlage der Bridge gesetzt werden!<br />
<br />
Diese Zeilen einzeln in der FHEM Kommandozeile oder als Block in der Raw Definition. <syntaxhighlight lang="perl"><br />
define SonosBridge MQTT2_DEVICE<br />
attr SonosBridge room MQTT2_DEVICE<br />
set SonosBridge attrTemplate sonos2mqtt_bridge_comfort<br />
</syntaxhighlight><br />
Das Template sonos2mqtt_bridge_comfort:<br />
* setzt das Template sonos2mqtt_bridge auf das Device,<br />
* lädt die Datei 99_sonos2mqttUtils.pm aus dem contrib Ordner nach,<br />
* definiert ein notify, dies erledigt im weiteren Betrieb die automatische Konfiguration der automatisch erzeugten MQTT2_DEVICEs. <br />
** mit dem Template sonos2mqtt_speaker (das Template kann auch manuell auf vorhandene Player angewendet werden, die automatische Erzeugung der Player wird aber empfohlen)<br />
** Ermittelt Detailinformation des jeweiligen Players (vor allem IP Adresse und Modelnumber)<br />
** Lädt die Sonosgeräte Icons von den UPNP Devices herunter<br />
** erweitert das setList input Kommando um den TV Eingang (HDMI, spdif) bzw. Line_IN Eingang falls vorhanden (Modelnumber)<br />
* Die Player werden automatisch einzeln erzeugt wenn sie mqtt Nachrichten senden (Play/Stop) oder (alle sofort) wenn der sonos2mqtt Server gestartet wird. <br />
<br />
==== Wozu dient die Bridge? ====<br />
Sie stellt ein paar wesentliche Funktionen zu Verfügung<br />
# Auffangen von nicht benötigten MQTT Nachrichten.<br />
# Erzeugung/Weiterleitung von Nachrichten für die einzelnen Player - damit auch die Erzeugung von separaten Playern nach dem Schema MQTT2_RINCON12345678901234567.<br />
# Statusanzeige sonos2mqtt als Reading connected (0 offline, 1 connected, 2 Player connected).<br />
Sie kann zusätzlich als zentrales Device verwendet werden, um die Sonos Umgebung abzubilden, z.B. Readings für Favoriten u.ä.<br />
<br />
==== Start sonos2mqtt lokal ====<br />
Der Start / Stop des sonos2mqtt Servers innerhalb von FHEM ist nur lokal simpel möglich. Ist der Server irgendwo im Netzwerk oder im Docker Container, muss man andere Möglichkeiten finden. Der Neustart aus FHEM ist zwar praktisch, aber nicht erforderlich. <br />
<br />
Wird eine existierenden Sonos Landschaft inhaltlich verändert (Player dazu/weg), muss der Server neu gestartet werden. Werden Player temporär abgeschaltet, merkt das der Server nach einer Zeit selbst, oder man forciert dies mit einem CheckSubscription an der Bridge.<br />
<br />
Soll das Modul sonos2mqtt mit seinen default Einstellungen gestartet werden, genügt dieser kurze Befehl (in der FHEM Kommandozeile):<br />
<syntaxhighlight lang="bash"><br />
"pm2 start sonos2mqtt"<br />
</syntaxhighlight><br />
Tipp: Verwendet man anstatt "Befehl" den Syntax {qx(Befehl)} in der FHEM Kommandozeile, wirkt der Befehl zwar blockierend aber die Ausgabe erfolgt im Browser und nicht im Logfile. Mit dem Parameter -s erfolgt keine Ausgabe.<br />
<br />
==== Autostart von sonos2mqtt mit FHEM ====<br />
Der Code startet sowohl das sonso2mqtt Modul sofort und implementiert ein notify für den zukünftigen automatischen Start beim Start von FHEM.<br />
<syntaxhighlight lang="perl"><br />
define n_pm2_sonos notify global:INITIALIZED|n_pm2_sonos:start "pm2 -s start sonos2mqtt"<br />
trigger n_pm2_sonos start<br />
</syntaxhighlight> <br />
<br />
=== Autostart von sonos2mqtt im System mit pm2 (Alternative) ===<br />
Der obige Code startet das sonos2mqtt nodejs Modul mit pm2 beim Start von FHEM. Sollte das nicht funktionieren oder nicht ins gesamte Konzept passen (weil z.B. mehrere nodejs Module geladen werden) kann der automatische Start direkt im System erfolgen. Zunächst dafür das oben eventuell schon definierte notify löschen!<syntaxhighlight lang="perl"><br />
delete n_pm2_sonos<br />
</syntaxhighlight>Der Start des Modul muss nicht mit erhöhten Rechten geschehen! Im Terminal folgendes eingeben (unter dem angemeldeten Benutzer wird sonos2mqtt später immer gestartet):<syntaxhighlight lang="bash"><br />
pm2 start sonos2mqtt<br />
pm2 startup<br />
</syntaxhighlight><br />
Der letzte Befehl "redet", d.h. es gibt eine Ausgabe in der Art:<br />
<syntaxhighlight lang="bash"><br />
[PM2] To setup the Startup Script, copy/paste the following command:<br />
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi<br />
</syntaxhighlight><br />
Man tut einfach genau das, was dasteht: die letzte Zeile kopieren und wieder einfügen und ausführen. Danach muss man die Konfiguration von pm2 noch sichern:<br />
<syntaxhighlight lang="bash"><br />
pm2 save<br />
</syntaxhighlight><br />
<br />
=== Verwendung des Docker Containers ===<br />
Beim Container findet die Konfiguration der Verbindung zum FHEM in den Environment Variablen statt:<br />
<syntaxhighlight lang="perl"><br />
environment:<br />
- SONOS2MQTT_DEVICE=192.168.56.207 # hier muss einer der Sonos Lautsprecher stehen<br />
- SONOS2MQTT_MQTT=mqtt://192.168.56.121:1883 # mqtt2_server FHEM, erweiterter Syntax siehe oben<br />
- SONOS_LISTENER_HOST=192.168.56.121 # Docker host IP<br />
</syntaxhighlight><br />
<br />
=== Sonos2mqtt mit mehr Komfort ===<br />
Im Wiki Artikel [[Sonos2mqtt]] geht es weiter.<br />
<br />
== Owntracks GPS Tracking in FHEM ==<br />
Das hier gezeiget Beispiel verwendet eine MQTT Instanz im Internet, die mit einem MQTT2_CLIENT angebunden wird. Da wenig Traffic benötigt wird, genügt z.B. eine kostenfreie Instanz z.B. bei myqtthub (Stand. Dezember 2020)<br />
<br />
Alternativ kann man einen MQTT2_SERVER auch direkt verfügbar machen, wenn man sich sicher ist was man da tut! Siehe {{Link2Forum|Topic=99666|Message=1028576|LinkText=diesen Forenbeitrag}}. Das Bridge Device wird dabei genau so benötigt, nur der IODev ist dann der MQTT2_SERVER.<br />
<br />
=== owntracks auf dem Smartphone konfigurieren ===<br />
Menü / Einstellung / Verbindung <br />
<br />
Dort sind insgesamt 4 Registerkarten mit Werten zu füllen (Beispiel):<br />
* Modus -> MQTT<br />
* Hostname -> <br />
** Hostnamen: host.cloud.com <br />
** Port: 8883 <br />
** ClientID: ID vom Provider <br />
** WebSockets (nicht nutzen)<br />
* Identifikation -> <br />
** Benutzername: user-name <br />
** Passwort: user-password <br />
** GeräteID: mi6 (erscheint in FHEM im Device Namen verwendet)<br />
** TrackerID: hk (nur zweistellig, erscheint als ID in der owntracks Karte)<br />
* Sicherheit -> TLS aktivieren<br />
=== Definition in FHEM ===<br />
Der MQTT2_CLIENT wird so eingerichtet, man braucht eine andere ClientID als auf dem Smartphone! Stimmt alles sollte das Gerät sofort open anzeigen.<syntaxhighlight lang="perl"><br />
MQTT2_CLIENT einrichten, autocreate simpel<br />
define mqtt2Cloud MQTT2_CLIENT host.cloud.com:8883<br />
attr mqtt2Cloud SSL 1<br />
attr mqtt2Cloud autocreate simple<br />
attr mqtt2Cloud clientId fhem1<br />
attr mqtt2Cloud room MQTT2_IO<br />
attr mqtt2Cloud username user-name<br />
set mqtt2Cloud password user-password<br />
</syntaxhighlight>Für die automatische Erzeugung der Trackergeräte in FHEM richtig man zuerst ein Bridge Device ein:<syntaxhighlight lang="perl"><br />
define MQTT2_Cloud_bridge MQTT2_DEVICE<br />
attr MQTT2_Cloud_bridge IODev mqtt2Cloud<br />
attr MQTT2_Cloud_bridge autocreate 1<br />
attr MQTT2_Cloud_bridge room MQTT2_DEVICE<br />
</syntaxhighlight>Dies wird entweder mit dem Template allgemein konfiguriert<syntaxhighlight lang="perl"><br />
set MQTT2_Cloud_bridge attrTemplate MQTT2_CLIENT_general_bridge<br />
</syntaxhighlight>oder manuell nur für owntracks eingerichtet<syntaxhighlight lang="perl"><br />
attr MQTT2_Cloud_bridge bridgeRegexp owntracks/[^/]+/([^/:]+).* "owntracks_$1"<br />
</syntaxhighlight>MQTT2 Geräte für owntracks werden jetzt automatisch mit dem Namen MQTT2_owntracks_<GeräteID> erzeugt. Diese werden einfach mit dem Template owntracks_device fertig konfiguriert. Bei einem IOS Gerät kann man danach noch das Template owntracks_device_IOS als Erweiterung anwenden.<br />
<br />
==== Anwesenheitserkennung ====<br />
Die Anwesenheit kann im owntracks Device direkt für die selbst definierten Plätze abgelesen werden: entweder steht im reading place der jeweilige Ort oder away. Um hier noch eine gewisse Einheitlichkeit in der Verwendung zu bekommen kann man ein PRESENCE Device verwenden: <syntaxhighlight lang="perl"><br />
define OT_Mi6 PRESENCE event MQTT2_owntracks_mi6:place:.away MQTT2_owntracks_mi6:place:.<Home><br />
</syntaxhighlight>Im Move Modus erfolgt die Erkennung sehr schnell und damit einige Sekunden eher als eine BT Erkennung im Haus - der Akkuverbrauch steigt enorm. Im Significant Modus kann es schon mal ein paar Minuten dauern - ein relevanter Akku Verbrauch ist nicht erkennbar.<br />
<br />
== Allgemeine Hinweise ==<br />
=== MQTT2_SERVER und MQTT2_CLIENT für Debugging nutzen ===<br />
Nutzt man das rawEvents-Attribut am MQTT2-IO<ref>z.B. <code>attr MQTT2_FHEM_Server rawEvents .*</code>, der regex-Filter kann wie üblich angepasst werden</ref>, kann man den Datenverkehr des Servers am Event-Monitor mitschneiden. Dies ist insbesondere für unbekannte Geräte nützlich, deren Topic- und Payload-Struktur noch nicht bekannt ist.<br />
Um den kompletten MQTT Datenaustausch mitzuschneiden, kann man mit <code>attr mqtt2_server verbose 5</code> auch alles ins FHEM-Log schreiben lassen.<br />
<br />
=== autocreate funktioniert anscheinend nicht? ===<br />
In der Regel wird bei neu eingehenden MQTT-Messages über ''autocreate'' ein neues Device erstellt, wenn Nachrichten von einem bisher unbekannten Gerät kommen. Geschieht dies nicht, sollten folgende Punkte geprüft werden:<br />
# (nur bei MQTT2_SERVER:) Der Client muss eine ClientID angeben, diese darf nicht den defaults von ''mosquito_sub'' entsprechen.<br />
# Ein allgemeines {{Link2CmdRef|Anker=autocreate|Lang=en|Label=autocreate}}-Device (''TYPE=autocreate'') muss vorhanden und aktiv sein.<br />
# ''autocreate'' am IO muss eingeschaltet sein, was für MQTT2_SERVER bedeutet, dass es nicht auf "0" stehen darf (hier ist dann ''simple'' die aktive Voreinstellung), für MQTT2_CLIENT sollte ebenfalls ''simple'' verwendet werden; dies muss hier allerdings explizit gesetzt werden.<br />
<br />
Wird dann immer noch kein Device erstellt, gibt es in aller Regel ein Device, das bereits einen entsprechenden Eintrag in der readingList enthält, oder es sind keine Nachrichten eingegangen. Überprüfen Sie daher dann ggf. die Einstellungen am Client-Gerät (z.B. im Web-Interface des Shelly oder Tasmota-geflashten ESP8266).<br />
<br />
Das ''autocreate'' am Device schließlich bestimmt, ob die ''readingsList'' erweitert werden darf, wenn Informationen über bisher nicht über die readingList abgedeckte Topics empfangen werden und vom MQTT2-IO als zu diesem Device/ClientID gehörend identifiziert wurden.<br />
<br />
=== attrTemplate ===<br />
{{Randnotiz|RNTyp=Info|RNText=Die per attrTemplate jeweils erzeugten Konfigurationen sind Einrichtungsbeispiele, die v.a. eine in sich konsistenze Zusammenstellung der verschiedenen Attribute enthalten. Es steht jedem User frei, diese Ausgangsbasis dann nach seinem Belieben zu ändern. Spätere Änderungen des verwendeten attrTemplate wirken sich nicht automatisch auf die durch frühere Versionen oder den User nachkonfigurierte Geräte aus! Da es vorkommen kann, dass sich die per MQTT übermittelten Daten und Topics ändern, wenn z.B. eine firmware aktualisiert wurden, kann dies Anpassungen am jeweiligen Template erforderlich machen. Grundsätzlich sollen die per attrTemplate für MQTT2_DEVICE verfügbaren attrTemplate jeweils für die aktuellste verfügbare stabile firmware-Version passen.}}<br />
Zur Konfiguration von MQTT2_DEVICE-Geräten kann die Funktion ''[[AttrTemplate|attrTemplate]]'' genutzt werden. <br />
Die Anwendung für MQTT2_DEVICE ist [[MQTT2 DEVICE#attrTemplate|hier]] beschrieben.<br />
<br />
<br />
{{Hinweis|In einigen Fällen kann es vorkommen, dass die template-Bezeichnung zwischenzeitlich geändert wurde. Seit 21.09.2019 erfolgt die Sortierung der auswählbaren templates nicht mehr nur nach den Namen, so dass die entsprechenden Namensbestandteile entfallen sind, die einer besseren Sortierung dienten.}}<br />
<br />
=== attrTemplate: Es werden nicht alle templates angezeigt ===<br />
Siehe Beitrag [[AttrTemplate#Warum finde ich das Template xyz nicht.3F|AttrTemplate: Warum finde ich das Template xyz nicht.]]<br />
<br />
=== attrTemplate und Sprachsteuerung ===<br />
Konfiguriert man MQTT2_DEVICE-Geräte mit attrTemplate, werden in der Regel auch direkt die für die Sprachsteuerung der Geräte erforderlichen Attribute mit gesetzt. Weiterführende Hinweise sind auch zu diesem Teilaspekt von ''[[AttrTemplate|attrTemplate]]'' dem betreffenden Hauptartikel zu entnehmen.<br />
<br />
=== bridgeRegexp ===<br />
[[Datei:Mqtt2 server.png|300px|thumb|left|Logische Verortung der bridgeRegexp-Angaben]]{{Randnotiz|RNTyp=y|RNText=Beachten Sie, dass aufgrund des geschilderten Prinzips eine Änderung einer bridgeRegexp bei einem Gerät auch dazu führt, dass alle Readings eines Geräts und alle readingList-Einträge gelöscht werden.}}Üblicherweise werden alle Informationen, die aus einer Quelle stammen auch '''''einem''''' ''MQTT2_DEVICE'' zugeordnet, wobei im Falle des dort nicht aktivierten autocreate-Attributs entsprechende readingList-Einträge erzeugt werden. In dem nebenstehenden Schaubild wären dies die Geräte ''A'' bis ''D''. Das '''Attribut''' ''bridgeRegexp'' kann dazu genutzt werden, um neue, bisher unbekannte Topic-Strukturen im Rahmen des autocreate-Vorgangs anders zu strukturieren. Diese werden dabei im Ergebnis einem '''anderen Device''' (das ggf. erst erstellt wird) zugeschlagen, sollte eine zu der topic-Struktur passende regex in diesem Attribut gesetzt sein. Für dessen CID und die Bildung des Names wird die im 2. Teil jedes Eintrags als ''newClientId'' hinterlegte Angabe verwendet. In nebenstehendem Schaubild ist dies exemplarisch für die Gerätegruppe ''D'' mit dem ''bridge''-Device ''D'' und dessen ''Satelliten'' ''D1'' bis ''D4'' dargestellt.<br />
Dementsprechend sind in den hier aufgeführten Beispielen ''bridgeRegexp''-Attribute immer dort zu finden, wo ein Gerät oder Dienst dazu dient, mit weiteren, ggf. auf andere Weise kommunizierende Geräte oder Baugruppen zu kommunizieren, wie z.B. für über hier dargestellten ''zigbee2mqtt'' oder ''zigbee2tasmota''. Ein Sonderfall hierbei ist das template ''MQTT2_CLIENT_general_bridge'' zur Verwendung mit dem [[MQTT2_CLIENT#Anwendung|MQTT2_CLIENT]], denn aus dessen Sicht stammen alle Informationen aus derselben Quelle, nämlich z.B. dem ''mosquitto''-Server und würden sonst alle einem einem MQTT2_DEVICE zugewiesen.<br />
<br />
=== Ständig neue Devices? ===<br />
MQTT2_SERVER kann zwischen verschiedenen Geräten auch anhand der ClientID unterscheiden. Für jedes neu erkannte Gerät wird auch ein eigenes MQTT2_DEVICE angelegt. Abhilfemaßnahmen:<br />
==== Vergabe einer ClientID ====<br />
Die meisten MQTT-fähigen Geräte enthalten Optionen zur Vergabe einer eindeutigen ClientID (siehe das Beispiel des zigbee2mqtt-Dienstes oben). <br />
Wird keine ClientID vergeben, verwenden manche Clients für jede Verbindung wieder neue ID's. Es wird empfohlen, möglichst von diesen Einstelloptionen Gebrauch zu machen.<br />
<br />
==== Löschen der ClientID aus der readingList usw. ====<br />
Ist dies nicht möglich oder erwünscht, kann man auch die ClientID aus den readingList-, setList- und getList-Attributen entfernen. Dies ist jedenfalls solange unschädlich als nicht mehrere Geräte identische Topic-Pfade verwenden (daher die Empfehlung, insbesondere bei Tasmota-Geräten den ''default'' "sonoff" zu ändern).<br />
Beispielsweise wäre <code>attr Milight_Bridge readingList milight_hub_1370325:milight/LWT:.* {json2nameValue($EVENT) }</code> zu ändern in <code>attr Milight_Bridge readingList milight/LWT:.* {json2nameValue($EVENT) }</code><br />
Die über ''attrTemplate'' verfügbaren Konfigurationen verwenden in der Regel keine ClientID's bzw. entfernen diese.<br />
<br />
=== Wildcards in readingList und setList ===<br />
Auch in readingList und in setList sollten sich sog. wildcards verwenden lassen. Die Vorgehensweise ist jedoch unterschiedlich:<br />
<br />
In ''readingList'' werden normale regex-Ausdrücke verwendet. Ein Punkt steht daher z.B. für ein beliebiges Zeichen, alles zwischen zwei Topic-Tree-Elementen (getrennt typischerweise durch einen "/") kann man so schreiben: "[^/]+" (entspricht: "Mindestens ein Zeichen, das kein Schrägstrich ist"). Ergänzender Hinweis: Will man z.B. Informationen aus einem beliebigen Teil des Topic-trees extrahieren und als Reading-Namen verwenden, kann dies im Rahmen eines Perl-Aufrufs geschehen. Beispiele aus der mqtt2.template-file: OpenMQTTGateway_BT_scanner und OpenMQTTGateway_BT_gtag (letzteres überführt die Information, über welches Gateway bestimmte Informationen eingegangen ist jeweils in eigene Readings pro Gateway).<br />
<br />
In ''setList'' gelten dagegen die wildcard-Konventionen aus der MQTT-Welt. Dort steht "+" für einen austauschbaren Teil des Topic-Trees (zwischen zwei Schrägstrichen). Anmerkung: Bitte vorher prüfen, ob es wirklich sinnvoll ist, derart unspezifische Publishes vorzunehmen. Meist gibt es "Gruppen-Topics", auf die mehrere Geräte eines bestimmten Typs hören bzw. man kann dies dort (in der firmware bzw. auf den Konfigurationsseiten der Geräte) einstellen.<br />
<br />
=== Die JSON-Daten sollen ausnahmsweise nicht ausgepackt werden ===<br />
In manchen Fällen ist das automatische Auspacken der JSON-Payload nicht erwünscht. In diesen Fällen kann man einfach den gewünschten Reading-Namen in die readingList eintragen, statt der Anweisung, den JSON an json2NameValue() zu übergeben. Aus<br />
<pre><br />
attr MQTT_OwnTracks readingList owntracks/clouduser/mi6:.* { json2nameValue($EVENT) }\<br />
owntracks/clouduser/mi6/waypoints:.* { json2nameValue($EVENT) }\<br />
owntracks/clouduser/mi6/event:.* { json2nameValue($EVENT) }<br />
</pre><br />
wird dann:<br />
<pre><br />
attr MQTT_OwnTracks readingList owntracks/clouduser/mi6:.* json_mi6\<br />
owntracks/clouduser/mi6/waypoints:.* json_waypoints\<br />
owntracks/clouduser/mi6/event:.* json_event<br />
</pre><br />
Erforderlichenfalls kann man die Einträge auch doppelt erstellen, um sowohl den JSON wie auch die ausgepackten Readings zu erhalten.<br />
<br />
=== Die JSON-Daten vor dem auspacken manipulieren ===<br />
Aus diversen Gründen kann es zweckmäßig sein, einen bestimmten Wert der JSON-Payload zu ignorieren.<br />
Z.B. sendet ein Client statt eines Messwertes die Info "bad". Dieser Fehlerwert soll aus der JSON-Payload "ausgefiltert" werden:<br />
<pre><br />
attr DEVICE readingList <your topic>:.* { my $rets = json2nameValue($EVENT,'',$JSONMAP);; my %cleaned = map { $_,$rets->{$_} } grep { 'bad' ne $rets->{$_} } keys %{$rets};; return \%cleaned }<br />
</pre><br />
<br />
Oder auch einen Wert umzubenennen wenn die JSON-Payload nur ein Objekt beinhaltet:<br />
<pre><br />
attr DEVICE readingList <your topic>:.* {my %h=(0=>'SofortLaden',1=>'MinPV',2=>'NurPV',3=>'Stop',4=>'Standby');; return {ChargeMode=>$h{$EVENT}}}<br />
</pre><br />
<br />
=== Unnötige Konfigurationsinformationen verwerfen ===<br />
Siehe Einleitung und den [[MQTT2_CLIENT#ignoreRegexp|ignoreRegexp-Abschnitt zu MQTT2_CLIENT]].<br />
<br />
=== Weiterführende Themen ===<br />
==== Verbinden mehrerer FHEM-Instanzen über MQTT ====<br />
Wie im Hauptartikel zu [[MQTT#Kommunikation zu sonstigen FHEM-Geräten über MQTT|MQTT]] erläutert, gibt es mehrere Varianten, wie man mit Hilfe von FHEM aus Events an beliebigen Geräten MQTT-Messages erzeugen kann. So kann man z.B. Messdaten eines Systems über ein ''notify'' iVm. einer einfachen ''publish''-Anweisung an ein zweites FHEM schicken, das diese Daten dann z.B. mit Hilfe der MQTT2-Module auswerten kann.<br />
Damit dabei Nachrichten unterschiedlicher Quellen auch als getrennte Readings bzw. ggf. auch gesonderten MQTT2_DEVICE-Instanzen zugeordnet werden, sollte man entsprechende Topic-Strukturen wählen, die dann auch mit Hilfe einer geeigneten ''bridgeRegexp'' automatisiert ausgewertet werden kann, siehe z.B. dieser {{Link2Forum|Topic=107145|LinkText=Forumsthread}}:<br />
attr MQTT2_myMqttServer bridgeRegexp \<br />
SmartHome/MqttGenericBridge2/([A-Za-z0-9]*)/.*:.* "mgb2_$1"<br />
Dabei werden die betreffenden Informationen der entfernten FHEM-Instanz alle nach dem Schema ''SmartHome/MqttGenericBridge2/<Device-Name>/<Reading-Name>'' versendet.<br />
<br />
==== Umstellung von MQTT_DEVICE (und Derivaten wie XiaomiMQTTDevice) zu MQTT2_DEVICE ====<br />
Wer beabsichtigt, von der Implementierung MQTT+MQTT_DEVICE zu MQTT2-IO und MQTT2_DEVICE zu wechseln, sollte einige Punkte beachten. Viele diesbezügliche Fragen sind vor allem in {{Link2Forum|Topic=103762|LinkText=diesem Foren-Thread}}<br />
<br />
näher erläutert.<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=91394|LinkText=Thread, aus dem diese Anleitung ursprünglich entstanden ist}}<br />
* {{Link2Forum|Topic=91807|LinkText=Thread zum Tasmota-Device}}<br />
* {{Link2Forum|Topic=97989|LinkText=Thread, aus dem diese Anleitung für den eBus ursprünglich entstanden ist}}<br />
* {{Link2Forum|Topic=94495|LinkText=Neue templates einreichen}}<br />
* {{Link2Forum|Topic=94494|LinkText=Fragen, Wünsche und Kritik zu mqtt2.template}}<br />
* {{Link2Forum|Topic=116162|LinkText=Der MQTT-Workshop für MQTT2-Module}}<br />
<br />
== Hinweise ==<br />
<references /><br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:MQTT]]<br />
[[Kategorie:IP Components|IP Komponenten]]<br />
[[Kategorie:Other Components]]<br />
[[Kategorie:Interfaces]]</div>Otto123http://wiki.fhem.de/w/index.php?title=ConBee&diff=37104ConBee2022-01-13T14:09:40Z<p>Otto123: /* Dokumentation und Setup */ Link ins Forum eingefügt</p>
<hr />
<div>{{Todo|Noch zu vervollständigen und zu verlinken}}<br />
[[ConBee]] ist ein [[ZigBee]] USB Gateway ([[Interface]]), mit dem herstellerübergreifend ZigBee-Geräte bedient werden können. Unter der Bezeichnung RaspBee ist auch eine Variante als [[Raspberry Pi]] Modul erhältlich. Beide Geräte sind als ''ConBee II'' und ''RaspBee II'' in einer aktualisierten Version erhältlich. Im folgenden werden alle Version als ''ConBee'' bezeichnet und die Ausführungen gelten auch RaspBee; sofern es relevante Unterschiede gibt, wird das ausdrücklich erwähnt.<br />
<br />
{{Infobox Hardware<br />
|Bild=ConBee_II.jpg<br />
|Bildbeschreibung=<br />
|HWProtocol=ZigBee<br />
|HWType=[[Interface]]<br />
|HWCategory=diverse Hersteller<br />
|HWComm=Funk 2.4 GHz<br />
|HWChannels=Zigbee Channel 11 15 20 25<br />
|HWVoltage=5V=<br />
|HWPowerConsumption=ca. 0,1 W<br />
|HWPoweredBy=USB<br />
|HWSize=40 x 17 x 8 (ohne USB Stecker)<br />
|HWDeviceFHEM=HUEBridge.pm, HUEDevice.pm<br />
|HWManufacturer=dresden elektronik, Vertrieb: [http://phoscon.de Phoscon] <br />
}}<br />
== Beschreibung ==<br />
Das ConBee Gateway benötigt/hat keine Cloud-Anbindung. Eine Liste der kompatiblen ZigBee Geräte und Hersteller findet sich [https://phoscon.de/de/conbee2/compatible hier].<br />
<br />
== Dokumentation und Setup ==<br />
* Offizielle deconz [https://phoscon.de/de/conbee/install Installationsanleitung]. Das Ergebnis der Installation ist vom verwendeten System abhängig.<br />
* Beschreibung der Parameter findet man versteckt im [https://github.com/dresden-elektronik/deconz-rest-plugin/wiki/deCONZ-command-line-parameters deconz Rest-Plugin Wiki]<br />
* Beschreibung der [https://github.com/marthoc/docker-deconz Containerinstallation] - aufschlussreich ist dort auch der Inhalt der start.sh.<br />
Das Setup erzeugt auf einem Pi mit PiOS Lite sieben Services, die bis auf zwei alle disabled sind (<code>systemctl list-unit-files|grep deconz</code>).<br />
<br />
Um den minimalen Dienst (deconz) in Betrieb zu nehmen, sind noch folgende Schritte notwendig:<br />
# Optionale Konfiguration (empfohlen): serielle Schnittstelle und WEB-Port (Standard: 80) einstellen (siehe [[#Problembehebung|Problembehebung]])<br />
# Start und Test: <code>sudo systemctl start deconz</code>, mit dem Browser Zugriff auf Phoscon App testen: http://gatewayIP:Portnummer<br />
# Funktioniert alles, kann man den Service dauerhaft aktivieren: <code>sudo systemctl enable deconz</code><br />
'''Hinweise''': <br />
* Das Programm deCONZ verwendet die Hardwareschnittstelle und kann nicht mehrfach gestartet werden und dabei die gleiche Hardwareschnittstelle verwenden! <br />
* Es gibt eine Ungereimtheit in der Beschreibung des Parameters ''platform'': es scheint aktuell (April 2021) egal zu sein, ob man <code>-platform minimal</code> oder <code>--platform minimal</code> verwendet. <br />
* Beim deCONZ Aufruf empfiehlt es sich generell, den --dev= Parameter anzuhängen (siehe [[#Problembehebung|Problembehebung]]). <br />
* deconz.service und deconz-gui.service sind alternative Aufrufe der gleichen Binary - es kann nur einer von beiden Diensten gestartet werden. <br />
* Alternativ (nicht empfohlen) kann man das deconz Setup auf einem Desktop System ausführen und den Dienst deconz-gui konfigurieren und aktivieren. Der Zugriff auf die GUI erfolgt dann mit einem VNC Viewer (RealVNC bietet eine portable Version). <br />
* Wer eine einfache Konfiguration möchte und sich mit docker auskennt, kann die docker Variante wählen. <br />
Mit der Phoscon Web-App kann man <br />
* Das Gateway verwalten: Firmware, Backup/Restore, Zeitzone, Sprache<br />
* ZigBee Geräte anmelden und verknüpfen, Szenen einrichten ...<br />
* Applikationen mit dem Gateway verbinden, dazu zählt auch das HUEBridge Device von FHEM<br />
* Zugriff auf die alte WebApp erhalten (Hilfe Seite)<br />
Mit der deCONZ GUI kann man<br />
* Die Firmware der Geräte aktualisieren (OTA Plugin)<br />
* Das Zigbee Netzwerk visualisieren<br />
* EIne direkte Kommunikation zwischen zwei Geräten - Binding - einrichten<br />
* ... (noch vervollständigen)<br />
Um den Zugriff auf die deCONZ GUI zu erhalten, kann man '''X11 Forwarding''' verwenden, dazu braucht man nur einen X11 Server (Linux Desktop oder Windows VcXsrv, Xming; beides auf SourceForge.net verfügbar).<br />
<br />
Sieh dazu auch den Beitrag im [https://forum.fhem.de/index.php/topic,117470.msg1200344.html#msg1200344 Forum]<br />
<br />
Einzeiler für Linux Desktop : <code>ssh -X <user>@<host> "sudo systemctl stop deconz; deCONZ --dev=/dev/ttyACM0;sudo systemctl start deconz"</code><br />
<br />
Einzeiler für Windows 10 : <code>ssh -X <user>@<host> "export DISPLAY=%COMPUTERNAME%:0.0;sudo systemctl stop deconz; deCONZ --dev=/dev/ttyACM0;sudo systemctl start deconz"</code><br />
<br />
'''Tipp für Windows Einsteiger:''' <br />
* Programme wie den X11 Server muss man herunterladen und installieren.<br />
* Beispiel: VcXsrv wird gestartet mit xlaunch - alles Standard lassen nur im letzten Fenster: "disable access control" aktivieren<br />
* CMD Box aufmachen mit: Windows Taste + r und dann CMD enter. <br />
* Funktionstest <code>ssh -X pi@raspberrypi "export DISPLAY=%COMPUTERNAME%:0.0;xcalc"</code> <br />
<br />
=== Problembehebung ===<br />
'''Service'''<br />
<br />
deCONZ verwendet offenbar beim Start auch per default die Schnittstelle /dev/ttyAMA0 (raspbee Modul). Die Kommunikation eines dort steckenden anderen Moduls wird dabei gestört, die GUI reagiert eine Zeit lang nicht.<br />
<br />
Hat man andere Module an AMA0 (UART GPIO) oder an den Standard USB Schnittstellen (ACM0 usw.), muss der deCONZ Aufruf mit den richtigen Schnittstellen Parametern konfiguriert werden. <br />
<br />
Am zuverlässigsten ist es, die Definition per ID einzutragen. Der richtige Eintrag kann mit leicht abgefragt werden:<br />
<br />
<code>ls -lha /dev/serial/by-id</code><br />
<br />
Die Konfiguration der Dienste erfolgt mit dem systemctl Editor:<br />
<br />
<code>sudo systemctl edit --full deconz</code><br />
<br />
und die Zeile ExecStart um diesen Parameter ergänzen (Beispiel): <br />
<br />
<code>--dev=/dev/serial/by-id/usb-dresden_elektronik_ingenieurtechnik_GmbH_ConBee_II_DE1234567-if00</code> <br />
<br />
Grundsätzlich ist diese Art der Einbindung auch für [[Mehrere USB-Geräte einbinden|alle seriellen Geräte]] in FHEM dringend anzuraten, wenn andere Services wie deconz auf demselben Server betrieben werden.<br />
<br />
'''Docker'''<br />
<br />
Im docker run Aufruf verändert man den device Parameter aus der [https://github.com/marthoc/docker-deconz Original Dokumentation] am Einfachsten wie folgt:<br />
<br />
<code>--device=/dev/serial/by-id/usb-dresden_elektronik_ingenieurtechnik_GmbH_ConBee_II_DE1234567-if00:/dev/ttyACM0</code><br />
<br />
docker-compose.yml<syntaxhighlight lang="docker"><br />
devices:<br />
- /dev/serial/by-id/usb-dresden_elektronik_ingenieurtechnik_GmbH_ConBee_II_DE1234567-if00:/dev/ttyACM0<br />
</syntaxhighlight>Damit wird der Stick vom Host eindeutig mit serial/by-id eingebunden und im Container an der Standard Schnittstelle ttyACM0 bereitgestellt. <br />
<br />
'''X11 Server'''<br />
<br />
Sollte bei der Verbindung zum X11 Server die Fehlermeldung ''Authorization required'' kommen, kann man beim Start des VcXsrv Server einfach den Haken bei ''disable access control'' setzen.<br />
<br />
== Update in Docker Umgebung ==<br />
Das Update der PhosCon App erfolgt durch ein update des docker containers (Image neu ziehen und Container neu machen -> run bzw. compose up). <br />
<br />
Das Update der Firmware funktioniert nach dieser [https://github.com/marthoc/docker-deconz#updating-conbeeraspbee-firmware offiziellen Beschreibung].<br />
<br />
== Unterstützung in FHEM ==<br />
{{Randnotiz|RNTyp=g|RNText=Alternativ kann man das Model ConBee II auch als Interface für [[Zigbee2mqtt|zigbee2mqtt]] verwenden und dann die ZigBee-Geräte als [[MQTT2_DEVICE]] in FHEM einbinden.}} <br />
ConBee wird über das Modul [[Hue|HUEBridge]] und über die deCONZ Software, die Wireless Light Control WebApp und die Phoscon WebApp (kommt zusammen mit deConz) in FHEM eingebunden.<br />
<br />
Sensoren werden nicht automatisch erzeugt und müssen manuell angelegt werden. <br />
<br />
Tipps:<br />
* Die HUEBridge funktioniert (noch undokumentiert) auch mit Portangaben, falls nicht Standard Port 80 verwendet wird.<br />
* Der SSL Port wird im Modul von der API abgefragt und kann in der HUEBridge nicht extra angegeben werden. Dazu darf der SSL Port nicht extern umgemappt werden, sondern der deconz Service muss wissen, auf welchem Port er läuft.<br />
* Die Bridge muss einmalig mit dem Gateway gepairt werden. Das FHEM Bridge Device erzeugt einen Key, in der Phoscon App muss man im Menüpunkt Gateway/erweitert/App die Funktion {{Taste|verbinden}} wählen.<br />
<br />
== Binding einrichten ==<br />
Um das Licht ohne "Umwege" direkt mit einem Taster/Schalter zu steuern, muss man beide direkt verbinden. Im Zigbee Umfeld wird dies Binding genannt. Beim ConBee Stick erfolgt das mit der deconz-gui.<br />
[[Datei:Deconz-binding-zeichnung.png|mini|Beispiel Binding Taster -> Lampe]]<br />
Die Binding Logik geht normalerweise vom steuernden (Taster) zum gesteuerten Device (Lampe).<br />
# Panel Bind Dropbox anhaken, Kartenreiter (unten!) wird damit angezeigt und muss in den Vordergrund gebracht werden.<br />
# Bei beiden Geräten die Home Automation Tabelle öffnen: linker grauer "Knopf" im Symbol.<br />
# Per drag&drop die gewünschte Zeile in der Tabelle (z.B. 006 on/off) in das jeweilige (linke oder rechte) Feld (Source -> Destination) fallen lassen. <br />
# Den Bind Knopf drücken.<br />
Voraussetzung zum Erfolg: Beide Geräte unterstützen ein Binding, damit kann man zumindest Grundfunktionen direkt ausführen.<br />
<br />
== bekannte Problembe ==<br />
Wenn alles gut aussieht, aber trotzdem scheinbar keine Kommunikation mit Zigbee Geräten stattfindet (Anlernen geht nicht, auch nicht mit Abstand von wenigen cm) sollte man den Stick mit einer USB Verlängerung (30-50 cm) anschließen.<br />
<br />
== Links ==<br />
* Internetseite des [http://www.dresden-elektronik.de Herstellers] und des [https://phoscon.de Vertreibers]<br />
* [https://phoscon.de/de/conbee2/compatible Liste der kompatiblen Hersteller / Geräte].<br />
<br />
[[Kategorie:Interfaces]]<br />
[[Kategorie:ZigBee]]</div>Otto123http://wiki.fhem.de/w/index.php?title=ConBee&diff=37098ConBee2022-01-12T20:54:31Z<p>Otto123: /* Dokumentation und Setup */</p>
<hr />
<div>{{Todo|Noch zu vervollständigen und zu verlinken}}<br />
[[ConBee]] ist ein [[ZigBee]] USB Gateway ([[Interface]]), mit dem herstellerübergreifend ZigBee-Geräte bedient werden können. Unter der Bezeichnung RaspBee ist auch eine Variante als [[Raspberry Pi]] Modul erhältlich. Beide Geräte sind als ''ConBee II'' und ''RaspBee II'' in einer aktualisierten Version erhältlich. Im folgenden werden alle Version als ''ConBee'' bezeichnet und die Ausführungen gelten auch RaspBee; sofern es relevante Unterschiede gibt, wird das ausdrücklich erwähnt.<br />
<br />
{{Infobox Hardware<br />
|Bild=ConBee_II.jpg<br />
|Bildbeschreibung=<br />
|HWProtocol=ZigBee<br />
|HWType=[[Interface]]<br />
|HWCategory=diverse Hersteller<br />
|HWComm=Funk 2.4 GHz<br />
|HWChannels=Zigbee Channel 11 15 20 25<br />
|HWVoltage=5V=<br />
|HWPowerConsumption=ca. 0,1 W<br />
|HWPoweredBy=USB<br />
|HWSize=40 x 17 x 8 (ohne USB Stecker)<br />
|HWDeviceFHEM=HUEBridge.pm, HUEDevice.pm<br />
|HWManufacturer=dresden elektronik, Vertrieb: [http://phoscon.de Phoscon] <br />
}}<br />
== Beschreibung ==<br />
Das ConBee Gateway benötigt/hat keine Cloud-Anbindung. Eine Liste der kompatiblen ZigBee Geräte und Hersteller findet sich [https://phoscon.de/de/conbee2/compatible hier].<br />
<br />
== Dokumentation und Setup ==<br />
* Offizielle deconz [https://phoscon.de/de/conbee/install Installationsanleitung]. Das Ergebnis der Installation ist vom verwendeten System abhängig.<br />
* Beschreibung der Parameter findet man versteckt im [https://github.com/dresden-elektronik/deconz-rest-plugin/wiki/deCONZ-command-line-parameters deconz Rest-Plugin Wiki]<br />
* Beschreibung der [https://github.com/marthoc/docker-deconz Containerinstallation] - aufschlussreich ist dort auch der Inhalt der start.sh.<br />
Das Setup erzeugt auf einem Pi mit PiOS Lite sieben Services, die bis auf zwei alle disabled sind (<code>systemctl list-unit-files|grep deconz</code>).<br />
<br />
Um den minimalen Dienst (deconz) in Betrieb zu nehmen, sind noch folgende Schritte notwendig:<br />
# Optionale Konfiguration (empfohlen): serielle Schnittstelle und WEB-Port (Standard: 80) einstellen (siehe [[#Problembehebung|Problembehebung]])<br />
# Start und Test: <code>sudo systemctl start deconz</code>, mit dem Browser Zugriff auf Phoscon App testen: http://gatewayIP:Portnummer<br />
# Funktioniert alles, kann man den Service dauerhaft aktivieren: <code>sudo systemctl enable deconz</code><br />
'''Hinweise''': <br />
* Das Programm deCONZ verwendet die Hardwareschnittstelle und kann nicht mehrfach gestartet werden und dabei die gleiche Hardwareschnittstelle verwenden! <br />
* Es gibt eine Ungereimtheit in der Beschreibung des Parameters ''platform'': es scheint aktuell (April 2021) egal zu sein, ob man <code>-platform minimal</code> oder <code>--platform minimal</code> verwendet. <br />
* Beim deCONZ Aufruf empfiehlt es sich generell, den --dev= Parameter anzuhängen (siehe [[#Problembehebung|Problembehebung]]). <br />
* deconz.service und deconz-gui.service sind alternative Aufrufe der gleichen Binary - es kann nur einer von beiden Diensten gestartet werden. <br />
* Alternativ (nicht empfohlen) kann man das deconz Setup auf einem Desktop System ausführen und den Dienst deconz-gui konfigurieren und aktivieren. Der Zugriff auf die GUI erfolgt dann mit einem VNC Viewer (RealVNC bietet eine portable Version). <br />
* Wer eine einfache Konfiguration möchte und sich mit docker auskennt, kann die docker Variante wählen. <br />
Mit der Phoscon Web-App kann man <br />
* Das Gateway verwalten: Firmware, Backup/Restore, Zeitzone, Sprache<br />
* ZigBee Geräte anmelden und verknüpfen, Szenen einrichten ...<br />
* Applikationen mit dem Gateway verbinden, dazu zählt auch das HUEBridge Device von FHEM<br />
* Zugriff auf die alte WebApp erhalten (Hilfe Seite)<br />
Mit der deCONZ GUI kann man<br />
* Die Firmware der Geräte aktualisieren (OTA Plugin)<br />
* Das Zigbee Netzwerk visualisieren<br />
* EIne direkte Kommunikation zwischen zwei Geräten - Binding - einrichten<br />
* ... (noch vervollständigen)<br />
Um den Zugriff auf die deCONZ GUI zu erhalten, kann man '''X11 Forwarding''' verwenden, dazu braucht man nur einen X11 Server (Linux Desktop oder Windows VcXsrv, Xming; beides auf SourceForge.net verfügbar).<br />
<br />
Einzeiler für Linux Desktop : <code>ssh -X <user>@<host> "sudo systemctl stop deconz; deCONZ --dev=/dev/ttyACM0;sudo systemctl start deconz"</code><br />
<br />
Einzeiler für Windows 10 : <code>ssh -X <user>@<host> "export DISPLAY=%COMPUTERNAME%:0.0;sudo systemctl stop deconz; deCONZ --dev=/dev/ttyACM0;sudo systemctl start deconz"</code><br />
<br />
'''Tipp für Windows Einsteiger:''' <br />
* Programme wie den X11 Server muss man herunterladen und installieren.<br />
* Beispiel: VcXsrv wird gestartet mit xlaunch - alles Standard lassen nur im letzten Fenster: "disable access control" aktivieren<br />
* CMD Box aufmachen mit: Windows Taste + r und dann CMD enter. <br />
* Funktionstest <code>ssh -X pi@raspberrypi "export DISPLAY=%COMPUTERNAME%:0.0;xcalc"</code> <br />
<br />
=== Problembehebung ===<br />
'''Service'''<br />
<br />
deCONZ verwendet offenbar beim Start auch per default die Schnittstelle /dev/ttyAMA0 (raspbee Modul). Die Kommunikation eines dort steckenden anderen Moduls wird dabei gestört, die GUI reagiert eine Zeit lang nicht.<br />
<br />
Hat man andere Module an AMA0 (UART GPIO) oder an den Standard USB Schnittstellen (ACM0 usw.), muss der deCONZ Aufruf mit den richtigen Schnittstellen Parametern konfiguriert werden. <br />
<br />
Am zuverlässigsten ist es, die Definition per ID einzutragen. Der richtige Eintrag kann mit leicht abgefragt werden:<br />
<br />
<code>ls -lha /dev/serial/by-id</code><br />
<br />
Die Konfiguration der Dienste erfolgt mit dem systemctl Editor:<br />
<br />
<code>sudo systemctl edit --full deconz</code><br />
<br />
und die Zeile ExecStart um diesen Parameter ergänzen (Beispiel): <br />
<br />
<code>--dev=/dev/serial/by-id/usb-dresden_elektronik_ingenieurtechnik_GmbH_ConBee_II_DE1234567-if00</code> <br />
<br />
Grundsätzlich ist diese Art der Einbindung auch für [[Mehrere USB-Geräte einbinden|alle seriellen Geräte]] in FHEM dringend anzuraten, wenn andere Services wie deconz auf demselben Server betrieben werden.<br />
<br />
'''Docker'''<br />
<br />
Im docker run Aufruf verändert man den device Parameter aus der [https://github.com/marthoc/docker-deconz Original Dokumentation] am Einfachsten wie folgt:<br />
<br />
<code>--device=/dev/serial/by-id/usb-dresden_elektronik_ingenieurtechnik_GmbH_ConBee_II_DE1234567-if00:/dev/ttyACM0</code><br />
<br />
docker-compose.yml<syntaxhighlight lang="docker"><br />
devices:<br />
- /dev/serial/by-id/usb-dresden_elektronik_ingenieurtechnik_GmbH_ConBee_II_DE1234567-if00:/dev/ttyACM0<br />
</syntaxhighlight>Damit wird der Stick vom Host eindeutig mit serial/by-id eingebunden und im Container an der Standard Schnittstelle ttyACM0 bereitgestellt. <br />
<br />
'''X11 Server'''<br />
<br />
Sollte bei der Verbindung zum X11 Server die Fehlermeldung ''Authorization required'' kommen, kann man beim Start des VcXsrv Server einfach den Haken bei ''disable access control'' setzen.<br />
<br />
== Update in Docker Umgebung ==<br />
Das Update der PhosCon App erfolgt durch ein update des docker containers (Image neu ziehen und Container neu machen -> run bzw. compose up). <br />
<br />
Das Update der Firmware funktioniert nach dieser [https://github.com/marthoc/docker-deconz#updating-conbeeraspbee-firmware offiziellen Beschreibung].<br />
<br />
== Unterstützung in FHEM ==<br />
{{Randnotiz|RNTyp=g|RNText=Alternativ kann man das Model ConBee II auch als Interface für [[Zigbee2mqtt|zigbee2mqtt]] verwenden und dann die ZigBee-Geräte als [[MQTT2_DEVICE]] in FHEM einbinden.}} <br />
ConBee wird über das Modul [[Hue|HUEBridge]] und über die deCONZ Software, die Wireless Light Control WebApp und die Phoscon WebApp (kommt zusammen mit deConz) in FHEM eingebunden.<br />
<br />
Sensoren werden nicht automatisch erzeugt und müssen manuell angelegt werden. <br />
<br />
Tipps:<br />
* Die HUEBridge funktioniert (noch undokumentiert) auch mit Portangaben, falls nicht Standard Port 80 verwendet wird.<br />
* Der SSL Port wird im Modul von der API abgefragt und kann in der HUEBridge nicht extra angegeben werden. Dazu darf der SSL Port nicht extern umgemappt werden, sondern der deconz Service muss wissen, auf welchem Port er läuft.<br />
* Die Bridge muss einmalig mit dem Gateway gepairt werden. Das FHEM Bridge Device erzeugt einen Key, in der Phoscon App muss man im Menüpunkt Gateway/erweitert/App die Funktion {{Taste|verbinden}} wählen.<br />
<br />
== Binding einrichten ==<br />
Um das Licht ohne "Umwege" direkt mit einem Taster/Schalter zu steuern, muss man beide direkt verbinden. Im Zigbee Umfeld wird dies Binding genannt. Beim ConBee Stick erfolgt das mit der deconz-gui.<br />
[[Datei:Deconz-binding-zeichnung.png|mini|Beispiel Binding Taster -> Lampe]]<br />
Die Binding Logik geht normalerweise vom steuernden (Taster) zum gesteuerten Device (Lampe).<br />
# Panel Bind Dropbox anhaken, Kartenreiter (unten!) wird damit angezeigt und muss in den Vordergrund gebracht werden.<br />
# Bei beiden Geräten die Home Automation Tabelle öffnen: linker grauer "Knopf" im Symbol.<br />
# Per drag&drop die gewünschte Zeile in der Tabelle (z.B. 006 on/off) in das jeweilige (linke oder rechte) Feld (Source -> Destination) fallen lassen. <br />
# Den Bind Knopf drücken.<br />
Voraussetzung zum Erfolg: Beide Geräte unterstützen ein Binding, damit kann man zumindest Grundfunktionen direkt ausführen.<br />
<br />
== bekannte Problembe ==<br />
Wenn alles gut aussieht, aber trotzdem scheinbar keine Kommunikation mit Zigbee Geräten stattfindet (Anlernen geht nicht, auch nicht mit Abstand von wenigen cm) sollte man den Stick mit einer USB Verlängerung (30-50 cm) anschließen.<br />
<br />
== Links ==<br />
* Internetseite des [http://www.dresden-elektronik.de Herstellers] und des [https://phoscon.de Vertreibers]<br />
* [https://phoscon.de/de/conbee2/compatible Liste der kompatiblen Hersteller / Geräte].<br />
<br />
[[Kategorie:Interfaces]]<br />
[[Kategorie:ZigBee]]</div>Otto123http://wiki.fhem.de/w/index.php?title=ConBee&diff=37097ConBee2022-01-12T20:49:45Z<p>Otto123: /* Dokumentation und Setup */ Tipps zu VcXsrv eingebaut</p>
<hr />
<div>{{Todo|Noch zu vervollständigen und zu verlinken}}<br />
[[ConBee]] ist ein [[ZigBee]] USB Gateway ([[Interface]]), mit dem herstellerübergreifend ZigBee-Geräte bedient werden können. Unter der Bezeichnung RaspBee ist auch eine Variante als [[Raspberry Pi]] Modul erhältlich. Beide Geräte sind als ''ConBee II'' und ''RaspBee II'' in einer aktualisierten Version erhältlich. Im folgenden werden alle Version als ''ConBee'' bezeichnet und die Ausführungen gelten auch RaspBee; sofern es relevante Unterschiede gibt, wird das ausdrücklich erwähnt.<br />
<br />
{{Infobox Hardware<br />
|Bild=ConBee_II.jpg<br />
|Bildbeschreibung=<br />
|HWProtocol=ZigBee<br />
|HWType=[[Interface]]<br />
|HWCategory=diverse Hersteller<br />
|HWComm=Funk 2.4 GHz<br />
|HWChannels=Zigbee Channel 11 15 20 25<br />
|HWVoltage=5V=<br />
|HWPowerConsumption=ca. 0,1 W<br />
|HWPoweredBy=USB<br />
|HWSize=40 x 17 x 8 (ohne USB Stecker)<br />
|HWDeviceFHEM=HUEBridge.pm, HUEDevice.pm<br />
|HWManufacturer=dresden elektronik, Vertrieb: [http://phoscon.de Phoscon] <br />
}}<br />
== Beschreibung ==<br />
Das ConBee Gateway benötigt/hat keine Cloud-Anbindung. Eine Liste der kompatiblen ZigBee Geräte und Hersteller findet sich [https://phoscon.de/de/conbee2/compatible hier].<br />
<br />
== Dokumentation und Setup ==<br />
* Offizielle deconz [https://phoscon.de/de/conbee/install Installationsanleitung]. Das Ergebnis der Installation ist vom verwendeten System abhängig.<br />
* Beschreibung der Parameter findet man versteckt im [https://github.com/dresden-elektronik/deconz-rest-plugin/wiki/deCONZ-command-line-parameters deconz Rest-Plugin Wiki]<br />
* Beschreibung der [https://github.com/marthoc/docker-deconz Containerinstallation] - aufschlussreich ist dort auch der Inhalt der start.sh.<br />
Das Setup erzeugt auf einem Pi mit PiOS Lite sieben Services, die bis auf zwei alle disabled sind (<code>systemctl list-unit-files|grep deconz</code>).<br />
<br />
Um den minimalen Dienst (deconz) in Betrieb zu nehmen, sind noch folgende Schritte notwendig:<br />
# Optionale Konfiguration (empfohlen): serielle Schnittstelle und WEB-Port (Standard: 80) einstellen (siehe [[#Problembehebung|Problembehebung]])<br />
# Start und Test: <code>sudo systemctl start deconz</code>, mit dem Browser Zugriff auf Phoscon App testen: http://gatewayIP:Portnummer<br />
# Funktioniert alles, kann man den Service dauerhaft aktivieren: <code>sudo systemctl enable deconz</code><br />
'''Hinweise''': <br />
* Das Programm deCONZ verwendet die Hardwareschnittstelle und kann nicht mehrfach gestartet werden und dabei die gleiche Hardwareschnittstelle verwenden! <br />
* Es gibt eine Ungereimtheit in der Beschreibung des Parameters ''platform'': es scheint aktuell (April 2021) egal zu sein, ob man <code>-platform minimal</code> oder <code>--platform minimal</code> verwendet. <br />
* Beim deCONZ Aufruf empfiehlt es sich generell, den --dev= Parameter anzuhängen (siehe [[#Problembehebung|Problembehebung]]). <br />
* deconz.service und deconz-gui.service sind alternative Aufrufe der gleichen Binary - es kann nur einer von beiden Diensten gestartet werden. <br />
* Alternativ (nicht empfohlen) kann man das deconz Setup auf einem Desktop System ausführen und den Dienst deconz-gui konfigurieren und aktivieren. Der Zugriff auf die GUI erfolgt dann mit einem VNC Viewer (RealVNC bietet eine portable Version). <br />
* Wer eine einfache Konfiguration möchte und sich mit docker auskennt, kann die docker Variante wählen. <br />
Mit der Phoscon Web-App kann man <br />
* Das Gateway verwalten: Firmware, Backup/Restore, Zeitzone, Sprache<br />
* ZigBee Geräte anmelden und verknüpfen, Szenen einrichten ...<br />
* Applikationen mit dem Gateway verbinden, dazu zählt auch das HUEBridge Device von FHEM<br />
* Zugriff auf die alte WebApp erhalten (Hilfe Seite)<br />
Mit der deCONZ GUI kann man<br />
* Die Firmware der Geräte aktualisieren (OTA Plugin)<br />
* Das Zigbee Netzwerk visualisieren<br />
* EIne direkte Kommunikation zwischen zwei Geräten - Binding - einrichten<br />
* ... (noch vervollständigen)<br />
Um den Zugriff auf die deCONZ GUI zu erhalten, kann man '''X11 Forwarding''' verwenden, dazu braucht man nur einen X11 Server (Linux Desktop oder Windows VcXsrv, Xming; beides auf SourceForge.net verfügbar).<br />
<br />
Einzeiler für Linux Desktop : <code>ssh -X <user>@<host> "sudo systemctl stop deconz; deCONZ --dev=/dev/ttyACM0;sudo systemctl start deconz"</code><br />
<br />
Einzeiler für Windows 10 : <code>ssh -X <user>@<host> "export DISPLAY=%COMPUTERNAME%:0.0;sudo systemctl stop deconz; deCONZ --dev=/dev/ttyACM0;sudo systemctl start deconz"</code><br />
<br />
'''Tipp für Windows Einsteiger:''' <br />
* Programme wie den X11 Server muss man herunterladen und installieren.<br />
* Beispiel: VcXsrv wird gestartet mit xlaunch. Alles Standard lassen nur im letzten Fenster: "disable access control" aktivieren<br />
* CMD Box aufmachen mit: Windows Taste + r und dann CMD enter. <br />
<br />
=== Problembehebung ===<br />
'''Service'''<br />
<br />
deCONZ verwendet offenbar beim Start auch per default die Schnittstelle /dev/ttyAMA0 (raspbee Modul). Die Kommunikation eines dort steckenden anderen Moduls wird dabei gestört, die GUI reagiert eine Zeit lang nicht.<br />
<br />
Hat man andere Module an AMA0 (UART GPIO) oder an den Standard USB Schnittstellen (ACM0 usw.), muss der deCONZ Aufruf mit den richtigen Schnittstellen Parametern konfiguriert werden. <br />
<br />
Am zuverlässigsten ist es, die Definition per ID einzutragen. Der richtige Eintrag kann mit leicht abgefragt werden:<br />
<br />
<code>ls -lha /dev/serial/by-id</code><br />
<br />
Die Konfiguration der Dienste erfolgt mit dem systemctl Editor:<br />
<br />
<code>sudo systemctl edit --full deconz</code><br />
<br />
und die Zeile ExecStart um diesen Parameter ergänzen (Beispiel): <br />
<br />
<code>--dev=/dev/serial/by-id/usb-dresden_elektronik_ingenieurtechnik_GmbH_ConBee_II_DE1234567-if00</code> <br />
<br />
Grundsätzlich ist diese Art der Einbindung auch für [[Mehrere USB-Geräte einbinden|alle seriellen Geräte]] in FHEM dringend anzuraten, wenn andere Services wie deconz auf demselben Server betrieben werden.<br />
<br />
'''Docker'''<br />
<br />
Im docker run Aufruf verändert man den device Parameter aus der [https://github.com/marthoc/docker-deconz Original Dokumentation] am Einfachsten wie folgt:<br />
<br />
<code>--device=/dev/serial/by-id/usb-dresden_elektronik_ingenieurtechnik_GmbH_ConBee_II_DE1234567-if00:/dev/ttyACM0</code><br />
<br />
docker-compose.yml<syntaxhighlight lang="docker"><br />
devices:<br />
- /dev/serial/by-id/usb-dresden_elektronik_ingenieurtechnik_GmbH_ConBee_II_DE1234567-if00:/dev/ttyACM0<br />
</syntaxhighlight>Damit wird der Stick vom Host eindeutig mit serial/by-id eingebunden und im Container an der Standard Schnittstelle ttyACM0 bereitgestellt. <br />
<br />
'''X11 Server'''<br />
<br />
Sollte bei der Verbindung zum X11 Server die Fehlermeldung ''Authorization required'' kommen, kann man beim Start des VcXsrv Server einfach den Haken bei ''disable access control'' setzen.<br />
<br />
== Update in Docker Umgebung ==<br />
Das Update der PhosCon App erfolgt durch ein update des docker containers (Image neu ziehen und Container neu machen -> run bzw. compose up). <br />
<br />
Das Update der Firmware funktioniert nach dieser [https://github.com/marthoc/docker-deconz#updating-conbeeraspbee-firmware offiziellen Beschreibung].<br />
<br />
== Unterstützung in FHEM ==<br />
{{Randnotiz|RNTyp=g|RNText=Alternativ kann man das Model ConBee II auch als Interface für [[Zigbee2mqtt|zigbee2mqtt]] verwenden und dann die ZigBee-Geräte als [[MQTT2_DEVICE]] in FHEM einbinden.}} <br />
ConBee wird über das Modul [[Hue|HUEBridge]] und über die deCONZ Software, die Wireless Light Control WebApp und die Phoscon WebApp (kommt zusammen mit deConz) in FHEM eingebunden.<br />
<br />
Sensoren werden nicht automatisch erzeugt und müssen manuell angelegt werden. <br />
<br />
Tipps:<br />
* Die HUEBridge funktioniert (noch undokumentiert) auch mit Portangaben, falls nicht Standard Port 80 verwendet wird.<br />
* Der SSL Port wird im Modul von der API abgefragt und kann in der HUEBridge nicht extra angegeben werden. Dazu darf der SSL Port nicht extern umgemappt werden, sondern der deconz Service muss wissen, auf welchem Port er läuft.<br />
* Die Bridge muss einmalig mit dem Gateway gepairt werden. Das FHEM Bridge Device erzeugt einen Key, in der Phoscon App muss man im Menüpunkt Gateway/erweitert/App die Funktion {{Taste|verbinden}} wählen.<br />
<br />
== Binding einrichten ==<br />
Um das Licht ohne "Umwege" direkt mit einem Taster/Schalter zu steuern, muss man beide direkt verbinden. Im Zigbee Umfeld wird dies Binding genannt. Beim ConBee Stick erfolgt das mit der deconz-gui.<br />
[[Datei:Deconz-binding-zeichnung.png|mini|Beispiel Binding Taster -> Lampe]]<br />
Die Binding Logik geht normalerweise vom steuernden (Taster) zum gesteuerten Device (Lampe).<br />
# Panel Bind Dropbox anhaken, Kartenreiter (unten!) wird damit angezeigt und muss in den Vordergrund gebracht werden.<br />
# Bei beiden Geräten die Home Automation Tabelle öffnen: linker grauer "Knopf" im Symbol.<br />
# Per drag&drop die gewünschte Zeile in der Tabelle (z.B. 006 on/off) in das jeweilige (linke oder rechte) Feld (Source -> Destination) fallen lassen. <br />
# Den Bind Knopf drücken.<br />
Voraussetzung zum Erfolg: Beide Geräte unterstützen ein Binding, damit kann man zumindest Grundfunktionen direkt ausführen.<br />
<br />
== bekannte Problembe ==<br />
Wenn alles gut aussieht, aber trotzdem scheinbar keine Kommunikation mit Zigbee Geräten stattfindet (Anlernen geht nicht, auch nicht mit Abstand von wenigen cm) sollte man den Stick mit einer USB Verlängerung (30-50 cm) anschließen.<br />
<br />
== Links ==<br />
* Internetseite des [http://www.dresden-elektronik.de Herstellers] und des [https://phoscon.de Vertreibers]<br />
* [https://phoscon.de/de/conbee2/compatible Liste der kompatiblen Hersteller / Geräte].<br />
<br />
[[Kategorie:Interfaces]]<br />
[[Kategorie:ZigBee]]</div>Otto123http://wiki.fhem.de/w/index.php?title=ConBee&diff=37096ConBee2022-01-12T19:59:08Z<p>Otto123: /* Dokumentation und Setup */ Bug Fix in der Beschreibung</p>
<hr />
<div>{{Todo|Noch zu vervollständigen und zu verlinken}}<br />
[[ConBee]] ist ein [[ZigBee]] USB Gateway ([[Interface]]), mit dem herstellerübergreifend ZigBee-Geräte bedient werden können. Unter der Bezeichnung RaspBee ist auch eine Variante als [[Raspberry Pi]] Modul erhältlich. Beide Geräte sind als ''ConBee II'' und ''RaspBee II'' in einer aktualisierten Version erhältlich. Im folgenden werden alle Version als ''ConBee'' bezeichnet und die Ausführungen gelten auch RaspBee; sofern es relevante Unterschiede gibt, wird das ausdrücklich erwähnt.<br />
<br />
{{Infobox Hardware<br />
|Bild=ConBee_II.jpg<br />
|Bildbeschreibung=<br />
|HWProtocol=ZigBee<br />
|HWType=[[Interface]]<br />
|HWCategory=diverse Hersteller<br />
|HWComm=Funk 2.4 GHz<br />
|HWChannels=Zigbee Channel 11 15 20 25<br />
|HWVoltage=5V=<br />
|HWPowerConsumption=ca. 0,1 W<br />
|HWPoweredBy=USB<br />
|HWSize=40 x 17 x 8 (ohne USB Stecker)<br />
|HWDeviceFHEM=HUEBridge.pm, HUEDevice.pm<br />
|HWManufacturer=dresden elektronik, Vertrieb: [http://phoscon.de Phoscon] <br />
}}<br />
== Beschreibung ==<br />
Das ConBee Gateway benötigt/hat keine Cloud-Anbindung. Eine Liste der kompatiblen ZigBee Geräte und Hersteller findet sich [https://phoscon.de/de/conbee2/compatible hier].<br />
<br />
== Dokumentation und Setup ==<br />
* Offizielle deconz [https://phoscon.de/de/conbee/install Installationsanleitung]. Das Ergebnis der Installation ist vom verwendeten System abhängig.<br />
* Beschreibung der Parameter findet man versteckt im [https://github.com/dresden-elektronik/deconz-rest-plugin/wiki/deCONZ-command-line-parameters deconz Rest-Plugin Wiki]<br />
* Beschreibung der [https://github.com/marthoc/docker-deconz Containerinstallation] - aufschlussreich ist dort auch der Inhalt der start.sh.<br />
Das Setup erzeugt auf einem Pi mit PiOS Lite sieben Services, die bis auf zwei alle disabled sind (<code>systemctl list-unit-files|grep deconz</code>).<br />
<br />
Um den minimalen Dienst (deconz) in Betrieb zu nehmen, sind noch folgende Schritte notwendig:<br />
# Optionale Konfiguration (empfohlen): serielle Schnittstelle und WEB-Port (Standard: 80) einstellen (siehe [[#Problembehebung|Problembehebung]])<br />
# Start und Test: <code>sudo systemctl start deconz</code>, mit dem Browser Zugriff auf Phoscon App testen: http://gatewayIP:Portnummer<br />
# Funktioniert alles, kann man den Service dauerhaft aktivieren: <code>sudo systemctl enable deconz</code><br />
'''Hinweise''': <br />
* Das Programm deCONZ verwendet die Hardwareschnittstelle und kann nicht mehrfach gestartet werden und dabei die gleiche Hardwareschnittstelle verwenden! <br />
* Es gibt eine Ungereimtheit in der Beschreibung des Parameters ''platform'': es scheint aktuell (April 2021) egal zu sein, ob man <code>-platform minimal</code> oder <code>--platform minimal</code> verwendet. <br />
* Beim deCONZ Aufruf empfiehlt es sich generell, den --dev= Parameter anzuhängen (siehe [[#Problembehebung|Problembehebung]]). <br />
* deconz.service und deconz-gui.service sind alternative Aufrufe der gleichen Binary - es kann nur einer von beiden Diensten gestartet werden. <br />
* Alternativ (nicht empfohlen) kann man das deconz Setup auf einem Desktop System ausführen und den Dienst deconz-gui konfigurieren und aktivieren. Der Zugriff auf die GUI erfolgt dann mit einem VNC Viewer (RealVNC bietet eine portable Version). <br />
* Wer eine einfache Konfiguration möchte und sich mit docker auskennt, kann die docker Variante wählen. <br />
Mit der Phoscon Web-App kann man <br />
* Das Gateway verwalten: Firmware, Backup/Restore, Zeitzone, Sprache<br />
* ZigBee Geräte anmelden und verknüpfen, Szenen einrichten ...<br />
* Applikationen mit dem Gateway verbinden, dazu zählt auch das HUEBridge Device von FHEM<br />
* Zugriff auf die alte WebApp erhalten (Hilfe Seite)<br />
Mit der deCONZ GUI kann man<br />
* Die Firmware der Geräte aktualisieren (OTA Plugin)<br />
* Das Zigbee Netzwerk visualisieren<br />
* EIne direkte Kommunikation zwischen zwei Geräten - Binding - einrichten<br />
* ... (noch vervollständigen)<br />
Um den Zugriff auf die deCONZ GUI zu erhalten, kann man '''X11 Forwarding''' verwenden, dazu braucht man nur einen X11 Server (Linux Desktop oder Windows VcXsrv, Xming; beides auf SourceForge.net verfügbar).<br />
<br />
Einzeiler für Linux Desktop : <code>ssh -X <user>@<host> "sudo systemctl stop deconz; deCONZ --dev=/dev/ttyACM0;sudo systemctl start deconz"</code><br />
<br />
Einzeiler für Windows 10 : <code>ssh -X <user>@<host> "export DISPLAY=%COMPUTERNAME%:0.0;sudo systemctl stop deconz; deCONZ --dev=/dev/ttyACM0;sudo systemctl start deconz"</code><br />
<br />
'''Tipp für Windows Einsteiger:''' CMD Box aufmachen mit: Windows Taste + r und dann CMD enter. Programme wie den X11 Server muss man herunterladen und installieren.<br />
=== Problembehebung ===<br />
'''Service'''<br />
<br />
deCONZ verwendet offenbar beim Start auch per default die Schnittstelle /dev/ttyAMA0 (raspbee Modul). Die Kommunikation eines dort steckenden anderen Moduls wird dabei gestört, die GUI reagiert eine Zeit lang nicht.<br />
<br />
Hat man andere Module an AMA0 (UART GPIO) oder an den Standard USB Schnittstellen (ACM0 usw.), muss der deCONZ Aufruf mit den richtigen Schnittstellen Parametern konfiguriert werden. <br />
<br />
Am zuverlässigsten ist es, die Definition per ID einzutragen. Der richtige Eintrag kann mit leicht abgefragt werden:<br />
<br />
<code>ls -lha /dev/serial/by-id</code><br />
<br />
Die Konfiguration der Dienste erfolgt mit dem systemctl Editor:<br />
<br />
<code>sudo systemctl edit --full deconz</code><br />
<br />
und die Zeile ExecStart um diesen Parameter ergänzen (Beispiel): <br />
<br />
<code>--dev=/dev/serial/by-id/usb-dresden_elektronik_ingenieurtechnik_GmbH_ConBee_II_DE1234567-if00</code> <br />
<br />
Grundsätzlich ist diese Art der Einbindung auch für [[Mehrere USB-Geräte einbinden|alle seriellen Geräte]] in FHEM dringend anzuraten, wenn andere Services wie deconz auf demselben Server betrieben werden.<br />
<br />
'''Docker'''<br />
<br />
Im docker run Aufruf verändert man den device Parameter aus der [https://github.com/marthoc/docker-deconz Original Dokumentation] am Einfachsten wie folgt:<br />
<br />
<code>--device=/dev/serial/by-id/usb-dresden_elektronik_ingenieurtechnik_GmbH_ConBee_II_DE1234567-if00:/dev/ttyACM0</code><br />
<br />
docker-compose.yml<syntaxhighlight lang="docker"><br />
devices:<br />
- /dev/serial/by-id/usb-dresden_elektronik_ingenieurtechnik_GmbH_ConBee_II_DE1234567-if00:/dev/ttyACM0<br />
</syntaxhighlight>Damit wird der Stick vom Host eindeutig mit serial/by-id eingebunden und im Container an der Standard Schnittstelle ttyACM0 bereitgestellt. <br />
<br />
'''X11 Server'''<br />
<br />
Sollte bei der Verbindung zum X11 Server die Fehlermeldung ''Authorization required'' kommen, kann man beim Start des VcXsrv Server einfach den Haken bei ''disable access control'' setzen.<br />
<br />
== Update in Docker Umgebung ==<br />
Das Update der PhosCon App erfolgt durch ein update des docker containers (Image neu ziehen und Container neu machen -> run bzw. compose up). <br />
<br />
Das Update der Firmware funktioniert nach dieser [https://github.com/marthoc/docker-deconz#updating-conbeeraspbee-firmware offiziellen Beschreibung].<br />
<br />
== Unterstützung in FHEM ==<br />
{{Randnotiz|RNTyp=g|RNText=Alternativ kann man das Model ConBee II auch als Interface für [[Zigbee2mqtt|zigbee2mqtt]] verwenden und dann die ZigBee-Geräte als [[MQTT2_DEVICE]] in FHEM einbinden.}} <br />
ConBee wird über das Modul [[Hue|HUEBridge]] und über die deCONZ Software, die Wireless Light Control WebApp und die Phoscon WebApp (kommt zusammen mit deConz) in FHEM eingebunden.<br />
<br />
Sensoren werden nicht automatisch erzeugt und müssen manuell angelegt werden. <br />
<br />
Tipps:<br />
* Die HUEBridge funktioniert (noch undokumentiert) auch mit Portangaben, falls nicht Standard Port 80 verwendet wird.<br />
* Der SSL Port wird im Modul von der API abgefragt und kann in der HUEBridge nicht extra angegeben werden. Dazu darf der SSL Port nicht extern umgemappt werden, sondern der deconz Service muss wissen, auf welchem Port er läuft.<br />
* Die Bridge muss einmalig mit dem Gateway gepairt werden. Das FHEM Bridge Device erzeugt einen Key, in der Phoscon App muss man im Menüpunkt Gateway/erweitert/App die Funktion {{Taste|verbinden}} wählen.<br />
<br />
== Binding einrichten ==<br />
Um das Licht ohne "Umwege" direkt mit einem Taster/Schalter zu steuern, muss man beide direkt verbinden. Im Zigbee Umfeld wird dies Binding genannt. Beim ConBee Stick erfolgt das mit der deconz-gui.<br />
[[Datei:Deconz-binding-zeichnung.png|mini|Beispiel Binding Taster -> Lampe]]<br />
Die Binding Logik geht normalerweise vom steuernden (Taster) zum gesteuerten Device (Lampe).<br />
# Panel Bind Dropbox anhaken, Kartenreiter (unten!) wird damit angezeigt und muss in den Vordergrund gebracht werden.<br />
# Bei beiden Geräten die Home Automation Tabelle öffnen: linker grauer "Knopf" im Symbol.<br />
# Per drag&drop die gewünschte Zeile in der Tabelle (z.B. 006 on/off) in das jeweilige (linke oder rechte) Feld (Source -> Destination) fallen lassen. <br />
# Den Bind Knopf drücken.<br />
Voraussetzung zum Erfolg: Beide Geräte unterstützen ein Binding, damit kann man zumindest Grundfunktionen direkt ausführen.<br />
<br />
== bekannte Problembe ==<br />
Wenn alles gut aussieht, aber trotzdem scheinbar keine Kommunikation mit Zigbee Geräten stattfindet (Anlernen geht nicht, auch nicht mit Abstand von wenigen cm) sollte man den Stick mit einer USB Verlängerung (30-50 cm) anschließen.<br />
<br />
== Links ==<br />
* Internetseite des [http://www.dresden-elektronik.de Herstellers] und des [https://phoscon.de Vertreibers]<br />
* [https://phoscon.de/de/conbee2/compatible Liste der kompatiblen Hersteller / Geräte].<br />
<br />
[[Kategorie:Interfaces]]<br />
[[Kategorie:ZigBee]]</div>Otto123http://wiki.fhem.de/w/index.php?title=ConBee&diff=37095ConBee2022-01-12T19:36:23Z<p>Otto123: /* Dokumentation und Setup */</p>
<hr />
<div>{{Todo|Noch zu vervollständigen und zu verlinken}}<br />
[[ConBee]] ist ein [[ZigBee]] USB Gateway ([[Interface]]), mit dem herstellerübergreifend ZigBee-Geräte bedient werden können. Unter der Bezeichnung RaspBee ist auch eine Variante als [[Raspberry Pi]] Modul erhältlich. Beide Geräte sind als ''ConBee II'' und ''RaspBee II'' in einer aktualisierten Version erhältlich. Im folgenden werden alle Version als ''ConBee'' bezeichnet und die Ausführungen gelten auch RaspBee; sofern es relevante Unterschiede gibt, wird das ausdrücklich erwähnt.<br />
<br />
{{Infobox Hardware<br />
|Bild=ConBee_II.jpg<br />
|Bildbeschreibung=<br />
|HWProtocol=ZigBee<br />
|HWType=[[Interface]]<br />
|HWCategory=diverse Hersteller<br />
|HWComm=Funk 2.4 GHz<br />
|HWChannels=Zigbee Channel 11 15 20 25<br />
|HWVoltage=5V=<br />
|HWPowerConsumption=ca. 0,1 W<br />
|HWPoweredBy=USB<br />
|HWSize=40 x 17 x 8 (ohne USB Stecker)<br />
|HWDeviceFHEM=HUEBridge.pm, HUEDevice.pm<br />
|HWManufacturer=dresden elektronik, Vertrieb: [http://phoscon.de Phoscon] <br />
}}<br />
== Beschreibung ==<br />
Das ConBee Gateway benötigt/hat keine Cloud-Anbindung. Eine Liste der kompatiblen ZigBee Geräte und Hersteller findet sich [https://phoscon.de/de/conbee2/compatible hier].<br />
<br />
== Dokumentation und Setup ==<br />
* Offizielle deconz [https://phoscon.de/de/conbee/install Installationsanleitung]. Das Ergebnis der Installation ist vom verwendeten System abhängig.<br />
* Beschreibung der Parameter findet man versteckt im [https://github.com/dresden-elektronik/deconz-rest-plugin/wiki/deCONZ-command-line-parameters deconz Rest-Plugin Wiki]<br />
* Beschreibung der [https://github.com/marthoc/docker-deconz Containerinstallation] - aufschlussreich ist dort auch der Inhalt der start.sh.<br />
Das Setup erzeugt auf einem Pi mit PiOS Lite sieben Services, die bis auf zwei alle disabled sind (<code>systemctl list-unit-files|grep deconz</code>).<br />
<br />
Um den minimalen Dienst (deconz) in Betrieb zu nehmen, sind noch folgende Schritte notwendig:<br />
# Optionale Konfiguration (empfohlen): serielle Schnittstelle und WEB-Port (Standard: 80) einstellen (siehe [[#Problembehebung|Problembehebung]])<br />
# Start und Test: <code>sudo systemctl start deconz</code>, mit dem Browser Zugriff auf Phoscon App testen: http://gatewayIP:Portnummer<br />
# Funktioniert alles, kann man den Service dauerhaft aktivieren: <code>sudo systemctl enable deconz</code><br />
'''Hinweise''': <br />
* Das Programm deCONZ verwendet die Hardwareschnittstelle und kann nicht mehrfach gestartet werden und dabei die gleiche Hardwareschnittstelle verwenden! <br />
* Es gibt eine Ungereimtheit in der Beschreibung des Parameters ''platform'': es scheint aktuell (April 2021) egal zu sein, ob man <code>-platform minimal</code> oder <code>--platform minimal</code> verwendet. <br />
* Beim deCONZ Aufruf empfiehlt es sich generell, den --dev= Parameter anzuhängen (siehe [[#Problembehebung|Problembehebung]]). <br />
* deconz.service und deconz-gui.service sind alternative Aufrufe der gleichen Binary - es kann nur einer von beiden Diensten gestartet werden. <br />
* Alternativ (nicht empfohlen) kann man das deconz Setup auf einem Desktop System ausführen und den Dienst deconz-gui konfigurieren und aktivieren. Der Zugriff auf die GUI erfolgt dann mit einem VNC Viewer (RealVNC bietet eine portable Version). <br />
* Wer eine einfache Konfiguration möchte und sich mit docker auskennt, kann die docker Variante wählen. <br />
Mit der Phoscon Web-App kann man <br />
* Das Gateway verwalten: Firmware, Backup/Restore, Zeitzone, Sprache<br />
* ZigBee Geräte anmelden und verknüpfen, Szenen einrichten ...<br />
* Applikationen mit dem Gateway verbinden, dazu zählt auch das HUEBridge Device von FHEM<br />
* Zugriff auf die alte WebApp erhalten (Hilfe Seite)<br />
Mit der deCONZ GUI kann man<br />
* Die Firmware der Geräte aktualisieren (OTA Plugin)<br />
* Das Zigbee Netzwerk visualisieren<br />
* EIne direkte Kommunikation zwischen zwei Geräten - Binding - einrichten<br />
* ... (noch vervollständigen)<br />
Um den Zugriff auf die deCONZ GUI zu erhalten, kann man '''X11 Forwarding''' verwenden, dazu braucht man nur einen X11 Server (Linux Desktop oder Windows VcXsrv, Xming; beides auf SourceForge.net verfügbar).<br />
<br />
Einzeiler für Linux Desktop : <code>ssh -X <user>@<host> sudo systemctl stop deconz; deCONZ --dev=/dev/ttyACM0;sudo systemctl start deconz</code><br />
<br />
Einzeiler für Windows 10 : <code>ssh -X <user>@<host> export DISPLAY=%COMPUTERNAME%:0.0;sudo systemctl stop deconz; deCONZ --dev=/dev/ttyACM0;sudo systemctl start deconz</code><br />
<br />
'''Tipp für Windows Einsteiger:''' CMD Box aufmachen mit: Windows Taste + r und dann CMD enter.<br />
=== Problembehebung ===<br />
'''Service'''<br />
<br />
deCONZ verwendet offenbar beim Start auch per default die Schnittstelle /dev/ttyAMA0 (raspbee Modul). Die Kommunikation eines dort steckenden anderen Moduls wird dabei gestört, die GUI reagiert eine Zeit lang nicht.<br />
<br />
Hat man andere Module an AMA0 (UART GPIO) oder an den Standard USB Schnittstellen (ACM0 usw.), muss der deCONZ Aufruf mit den richtigen Schnittstellen Parametern konfiguriert werden. <br />
<br />
Am zuverlässigsten ist es, die Definition per ID einzutragen. Der richtige Eintrag kann mit leicht abgefragt werden:<br />
<br />
<code>ls -lha /dev/serial/by-id</code><br />
<br />
Die Konfiguration der Dienste erfolgt mit dem systemctl Editor:<br />
<br />
<code>sudo systemctl edit --full deconz</code><br />
<br />
und die Zeile ExecStart um diesen Parameter ergänzen (Beispiel): <br />
<br />
<code>--dev=/dev/serial/by-id/usb-dresden_elektronik_ingenieurtechnik_GmbH_ConBee_II_DE1234567-if00</code> <br />
<br />
Grundsätzlich ist diese Art der Einbindung auch für [[Mehrere USB-Geräte einbinden|alle seriellen Geräte]] in FHEM dringend anzuraten, wenn andere Services wie deconz auf demselben Server betrieben werden.<br />
<br />
'''Docker'''<br />
<br />
Im docker run Aufruf verändert man den device Parameter aus der [https://github.com/marthoc/docker-deconz Original Dokumentation] am Einfachsten wie folgt:<br />
<br />
<code>--device=/dev/serial/by-id/usb-dresden_elektronik_ingenieurtechnik_GmbH_ConBee_II_DE1234567-if00:/dev/ttyACM0</code><br />
<br />
docker-compose.yml<syntaxhighlight lang="docker"><br />
devices:<br />
- /dev/serial/by-id/usb-dresden_elektronik_ingenieurtechnik_GmbH_ConBee_II_DE1234567-if00:/dev/ttyACM0<br />
</syntaxhighlight>Damit wird der Stick vom Host eindeutig mit serial/by-id eingebunden und im Container an der Standard Schnittstelle ttyACM0 bereitgestellt. <br />
<br />
'''X11 Server'''<br />
<br />
Sollte bei der Verbindung zum X11 Server die Fehlermeldung ''Authorization required'' kommen, kann man beim Start des VcXsrv Server einfach den Haken bei ''disable access control'' setzen.<br />
<br />
== Update in Docker Umgebung ==<br />
Das Update der PhosCon App erfolgt durch ein update des docker containers (Image neu ziehen und Container neu machen -> run bzw. compose up). <br />
<br />
Das Update der Firmware funktioniert nach dieser [https://github.com/marthoc/docker-deconz#updating-conbeeraspbee-firmware offiziellen Beschreibung].<br />
<br />
== Unterstützung in FHEM ==<br />
{{Randnotiz|RNTyp=g|RNText=Alternativ kann man das Model ConBee II auch als Interface für [[Zigbee2mqtt|zigbee2mqtt]] verwenden und dann die ZigBee-Geräte als [[MQTT2_DEVICE]] in FHEM einbinden.}} <br />
ConBee wird über das Modul [[Hue|HUEBridge]] und über die deCONZ Software, die Wireless Light Control WebApp und die Phoscon WebApp (kommt zusammen mit deConz) in FHEM eingebunden.<br />
<br />
Sensoren werden nicht automatisch erzeugt und müssen manuell angelegt werden. <br />
<br />
Tipps:<br />
* Die HUEBridge funktioniert (noch undokumentiert) auch mit Portangaben, falls nicht Standard Port 80 verwendet wird.<br />
* Der SSL Port wird im Modul von der API abgefragt und kann in der HUEBridge nicht extra angegeben werden. Dazu darf der SSL Port nicht extern umgemappt werden, sondern der deconz Service muss wissen, auf welchem Port er läuft.<br />
* Die Bridge muss einmalig mit dem Gateway gepairt werden. Das FHEM Bridge Device erzeugt einen Key, in der Phoscon App muss man im Menüpunkt Gateway/erweitert/App die Funktion {{Taste|verbinden}} wählen.<br />
<br />
== Binding einrichten ==<br />
Um das Licht ohne "Umwege" direkt mit einem Taster/Schalter zu steuern, muss man beide direkt verbinden. Im Zigbee Umfeld wird dies Binding genannt. Beim ConBee Stick erfolgt das mit der deconz-gui.<br />
[[Datei:Deconz-binding-zeichnung.png|mini|Beispiel Binding Taster -> Lampe]]<br />
Die Binding Logik geht normalerweise vom steuernden (Taster) zum gesteuerten Device (Lampe).<br />
# Panel Bind Dropbox anhaken, Kartenreiter (unten!) wird damit angezeigt und muss in den Vordergrund gebracht werden.<br />
# Bei beiden Geräten die Home Automation Tabelle öffnen: linker grauer "Knopf" im Symbol.<br />
# Per drag&drop die gewünschte Zeile in der Tabelle (z.B. 006 on/off) in das jeweilige (linke oder rechte) Feld (Source -> Destination) fallen lassen. <br />
# Den Bind Knopf drücken.<br />
Voraussetzung zum Erfolg: Beide Geräte unterstützen ein Binding, damit kann man zumindest Grundfunktionen direkt ausführen.<br />
<br />
== bekannte Problembe ==<br />
Wenn alles gut aussieht, aber trotzdem scheinbar keine Kommunikation mit Zigbee Geräten stattfindet (Anlernen geht nicht, auch nicht mit Abstand von wenigen cm) sollte man den Stick mit einer USB Verlängerung (30-50 cm) anschließen.<br />
<br />
== Links ==<br />
* Internetseite des [http://www.dresden-elektronik.de Herstellers] und des [https://phoscon.de Vertreibers]<br />
* [https://phoscon.de/de/conbee2/compatible Liste der kompatiblen Hersteller / Geräte].<br />
<br />
[[Kategorie:Interfaces]]<br />
[[Kategorie:ZigBee]]</div>Otto123http://wiki.fhem.de/w/index.php?title=Notify&diff=37094Notify2022-01-12T19:22:52Z<p>Otto123: /* notify Syntax */ Zeilenenden eingefügt (Raw DEF)</p>
<hr />
<div>{{SEITENTITEL:notify}}<br />
{{Infobox Modul<br />
|ModPurpose=Ausführung von Anweisung(en) als Reaktion auf Ereignisse<br />
|ModType=h<br />
|ModCmdRef=notify<br />
|ModForumArea=Automatisierung<br />
|ModTechName=91_notify.pm<br />
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])<br />
}}<br />
<br />
== Einführung ==<br />
{{Hinweis|Weitere grundlegende Informationen/Beispiele zu notify enthält [http://fhem.de/Heimautomatisierung-mit-fhem.pdf Heimautomatisierung mit FHEM]}}<br />
Das Hilfsmodul notify dient dazu [[Ereignis|Ereignisse]] über ein Suchmuster zu erkennen und bei einem Treffer eine Aktion auszulösen. Mit ''notify'' und anderen [[Eventhandler|Eventhandlern]] <ref>hierzu gehören u.a. auch [[DOIF]], [[THRESHOLD]] und [[watchdog]]</ref> ist es möglich, Logikfunktionen im FHEM abzubilden.<br />
<br />
'''Beispiele:''' <br />
* Wird das Licht in der Küche eingeschaltet, soll FHEM dort auch das Radio einschalten. <br />
* Bei Druck auf einen Taster soll die Umwälzpumpe für das Warmwasser eingeschaltet werden. <br />
* Erweiterte Möglichkeiten: Aber nur, wenn das Radio aus ist bzw. die Temperatur im Rücklauf des Warmwassers unterhalb einer bestimmten Schwelle liegt<ref>vgl. hierzu z.B. {{Link2CmdRef|Anker=devspec|Label=FILTER}} und [[if-condition]]</ref>.<br />
<br />
== Syntax ==<br />
<br />
define <name> notify <Suchmuster> <command> <br />
<br />
Das ''[[Regulärer Ausdruck|Suchmuster]]'' (häufig als Regexp = regular expression = regulärer Ausdruck bezeichnet) ist sehr wichtig: Es ist entweder der Name des auslösenden ("triggernden") Gerätes oder die Kombination aus Gerät und auslösendem Ereignis (Event) <code>Gerätename:Event</code>. Die Events kann man dem [[Event_monitor|Event-Monitor]] entnehmen. Wenn dort z.B. <code>Rollo1</code> steht, dann reagiert ''notify'' auf <code>Rollo1 on</code> und <code>Rollo1 off</code> usw.<br />
<br />
Wenn man mehrere Suchmuster kombinieren möchte, kann man diese in Klammer schreiben, als Trenner wird dann Pipe (|) genutzt: <code>(Rollo1|Rollo2|Steckdose5)</code>.<br />
<br />
'''Auch die Verwendung von Platzhaltern ist möglich''':<br />
* <code>Rollo.</code> → das notify reagiert auf alles was mit Rollo und '''einem''' weiteren beliebigen Zeichen anfängt. Also auf Rollo1 wie auch auf RolloG, aber nicht auf Rollo_wischundweg<br />
* <code>Rollo.*</code> → notify reagiert auf alles das mit Rollo beginnt<br />
* <code>.*isch</code> → auf alles das mit isch aufhört (Tisch, Fisch)<br />
* <code>Schalter(1|2|3)</code> → hört auf Schalter1, Schalter2 und Schalter3<br />
* <code>dimmer:pct:.(100|7[6-9]|[89][0-9])</code> → reagiert, wenn pct einen Wert über 75 annimmt.<br />
<br />
Suchmuster/Regex kann man im Internet beispielsweise auf [http://regexpal.com/| http://regexpal.com/] testen.<br />
<br />
Es gibt seit Juli 2020 eine Perlfunktion notifyRegexpCheck zum Testen, wie FHEM über das Suchmuster "denkt" - siehe {{Link2Forum|Topic=111938|Message=1074202|LinkText=diesen Beitrag}} im Forum.<br />
<br />
{{Hinweis|Das '''Suchmuster''' wird notify-intern um das Zeichen ^ (beginnt mit) und das Zeichen $ (endet mit) ergänzt<ref>Der Eventhandler [[DOIF]] verwendet die in Perl übliche Syntax für reguläre Ausdrücke als DOIF-Suchmuster.</ref>.<br />
<br />
Deshalb darf das Suchmuster nicht mit einem üblichen [[Regulärer Ausdruck|'''Regulären Ausdruck''']], wie er in Perl<ref>https://perldoc.perl.org/perlre.html</ref> verwendet wird, gleichgesetzt werden, da die Ergänzung zu einem grundsätzlich unterschiedlichen Verhalten führt, siehe nachstehendes Beispiel.}}<br />
<br />
'''Beispiel für das unterschiedliche Verhalten von ''Suchmuster'' und ''regulären Ausdruck'''''<br />
<br />
Für einen '''regulären Audruck''' gilt: Wenn der reguläre Ausdruck ''lampe'' ist und das [[Ereignis]] ''tischlampe'' dann passen ''tischlampe'' und ''lampe'' zueinander.<br />
<br />
Für das '''Suchmuster''' gilt: Wenn das Suchmuster ''lampe'' ist und das [[Ereignis]] ''tischlampe'' dann passen ''tischlampe'' und ''lampe'' '''nicht''' zueinander, weil das Suchmuster zu ^lampe$ ergänzt wird und damit exakt nur auf ''lampe'' matcht (passt).<br />
<br />
'''Variablen Zuordnung zum Event'''<br />
<br />
'''Beispiel 1'''<br />
<br />
2020-01-21 22:40:39 HUEDevice VibrationTest1 battery: 88<br />
{| class="wikitable"<br />
|-<br />
! !!$NAME !! colspan="2" |$EVENT<br />
|-<br />
| ||||$EVTPART0 ||$EVTPART1<br />
|-<br />
|2020-01-21 22:40:39 HUEDevice|| VibrationTest1|| battery:|| 88<br />
|}<br />
<br />
<br />
'''Beispiel 2'''<br />
2021-05-09 19:11:43 FB_CALLMONITOR cm_example external_name: Graf Herzog von und zu ...<br />
{| class="wikitable"<br />
|-<br />
! !!$NAME !! colspan="7" |$EVENT<br />
|-<br />
| ||||$EVTPART0 ||$EVTPART1 || $EVTPART2|| $EVTPART3 || $EVTPART4|| $EVTPART5|| ...<br />
|-<br />
|2021-05-09 19:11:43 FB_CALLMONITOR|| cm_example|| external_name:|| Graf|| Herzog|| von|| und|| zu|| ...<br />
|}<br />
<br />
== FHEMWEB-unterstütztes Anlegen eines notify ==<br />
{{Hinweis|Die Erstellung eines notify und insbesondere die korrekte Angabe des Suchmusters (Regex) führt gerade bei Einsteigern immer wieder zu Schwierigkeiten. Zur Fehlerminimierung empfiehlt es sich zum einen, die [[Konfiguration]] nicht direkt zu bearbeiten, sondern die "Befehl-Eingabezeile", die "Objektdetails" oder den [[Import von Code Snippets|Import von RAW-Definitionen]] zur Bearbeitung zu nutzen.}}<br />
<br />
=== Event Monitor ===<br />
Die komfortabelste Möglichkeit, die häufigsten Event-Handler zu erstellen, bietet der [[Event monitor|Event-Monitor]]. Die Vorgehensweis ist in dem zugehörigen Artikel dargestellt.<br />
<br />
=== Regexp wizard ===<br />
Zudem enthält FHEM einen Regexp wizard mit dem Regex anhand der in FHEM vorhandenen Devices und deren Events aus einer Auswahlbox selektiert werden können. Voraussetzungen sind:<br />
* Aktivierung des Hilfsmoduls [[eventTypes]] (bei allen Neuinstallationen Standard) <br />
* das gesuchte Ereignis (Event) ist nach Aktivierung des Hilfsmoduls bereits mindestens einmal eingetreten<br />
<br />
Schrittweise Darstellung der Nutzung des Regexp wizard zur Anlage eines "notify":<br />
<br />
In das [[Konfiguration#Befehl-Eingabefeld|Befehls-Eingabefeld]] eingeben und mit {{Taste|Enter}} bestätigen:<br />
define ntest notify a b<br />
Als Beispiel wird ein notify mit <name> "ntest" angelegt. "a" und "b" sind beliebige Platzhalter für <Suchmuster> und <Command>, die bei der weiteren Bearbeitung mit dem endgültigen Werten ersetzt werden.<br />
Der Regexp wizard öffnet sich:<br />
[[Datei:Regexp wizard1.JPG|400px|thumb|center]]<br />
Nun in der Auswahlbox das auslösende Event (Ereignis) auswählen; zunächst das Device und dann das gewünschte Regex. Hier soll das notify bei jeder Veränderung der Temperatur (temperature.*) des Device BTHR918N reagieren. Abschließend mit einem Mausklick auf {{Taste|set}} bestätigen. Wählt man mehrere Regex in dieser Weise aus, so wird das "notify" bei Eintritt jedes dieser Events ausgeführt:<br />
[[Datei:Regexp wizard2.JPG|400px|thumb|center]]<br />
Anschließend den Platzhalter "a" mit Klick auf den Link "removeRegexpPart" löschen:<br />
[[Datei:Regexp wizard3.JPG|400px|thumb|center]]<br />
Den Link "DEF" anklicken, damit sich der DEF-Editor öffnet:<br />
[[Datei:Regexp wizard4.JPG|400px|thumb|center]]<br />
Jetzt den auszuführenden Befehl im "DEF"-Bereich durch Überschreiben des Platzhalters "b" eintragen und mit Klick auf {{Taste|modify ntest}} abschließen:<br />
[[Datei:Regexp wizard5.JPG|400px|thumb|center]]<br />
Das fertige und sofort aktive "notify" sieht abschließend folgendermaßen aus:<br />
[[Datei:Regexp wizard6.JPG|400px|thumb|center]]<br />
Am Schluss das Speichern über {{Taste|Save config}} nicht vergessen.<br />
<br />
== Mein notify geht nicht - wie kann ich mir selbst helfen: Debugging ==<br />
Funktioniert ein notify nicht wie gewünscht, kann es nur zwei Hauptursachen haben: <br />
* Entweder das Suchmuster paßt nicht zum gewünschten Auslöser (FHEM Device), und/oder<br />
* die Anweisung enthält einen Fehler. <br />
Sollte kein Fehler im Logfile auftauchen aber das notify ausgelöst werden, stimmt meist der Übertragungsweg zum Zieldevice nicht.<br />
Der STATE des notify zeigt normalerweise mit Datum/Uhrzeit die letzte Auslösung an.<br />
<br />
Beim Debuggen sollte man daher beide Elemente getrennt untersuchen. Hier ein Beispiel welches nicht wie gewünscht funktioniert:<br />
<syntaxhighlight lang="perl"> define n_test notify n_test:muster Ausführungsteil</syntaxhighlight><br />
Zum debuggen benötigen wir <br />
* den [[Event monitor]]<br />
* das [https://fhem.de/commandref.html#trigger trigger-Kommando] - kann man jederzeit verwenden um das Suchmuster als Event unabhängig vom Auslöser zu erzeugen.<br />
* die FHEM Kommandozeile<br />
* den [[DEF-Editor]]<br />
* eventuell einen Texteditor um Codeblöcke zwischen zu lagern und Notizen zu machen.<br />
<br />
Das Suchmuster im Beispiel notify triggert auf sich selbst, es soll auf jeden Event mit dem Inhalt '''muster''' ausgelöst werden, Beispiel:<br />
2018-07-14 14:31:03 notify n_test muster bild<br />
<br />
=== Suchmuster ===<br />
Sollte das notify nicht funktionieren:<br />
* keine Reaktion wie gewünscht<br />
* keine Fehlermeldung in der Weboberfläche beim Anlegen, keine Fehlermeldung im Logfile<br />
* STATE ist unverändert auf active oder einem altem Datum/Uhrzeit<br />
liegt der Fehler mit Sicherheit im Suchmuster. Man hat die Chance das Suchmuster mit dem trigger Befehl zu erzeugen und zu schauen ob die Anweisung ausgeführt wird. Dabei ist zu beachten: Der erste ":" im Suchmuster ist zusätzlich zwischen Gerät und Event als Trennung. Jeder weiter : ist, wenn vorhanden, Bestandteil des Events! Siehe dazu den Abschnitt [https://fhem.de/commandref_DE.html#notify Hinweise in der commandref]<br />
*Im Beispiel: Event: n_test muster -> Suchmuster n_test:muster<br />
Um aus dem [[Event]] ein passendes Suchmuster zu erzeugen kann der [[Event monitor|Event-Monitor]] direkt verwendet werden. Man kann ein neues notify erzeugen oder ein Bestehendes modifizieren lassen.<br />
<br />
Unser Regex im Beispiel ist zu spezifisch, es triggert nur exakt auf '''muster'''. Dieser Trigger erzeugt den folgenden Eintrag im Eventmonitor, entspricht exakt dem Suchmuster und löst das notify aus:<br />
trigger n_test muster<br />
2018-07-13 11:52:08 notify n_test muster<br />
Das Suchmuster für unsere Anforderung muss in <code>n_test:muster.*</code> geändert werden, damit jeder Event der mit muster beginnt das notify auslöst.<br />
Der . im Regex steht für jedes beliebige Zeichen und der * für eine beliebige Anzahl des Zeichens davor: also beliebig viele beliebige Zeichen nach muster.<br />
<br />
Das Suchmuster wird häufig in ein komplizierteres Regex umgewandelt um im notify mehrere Aktionen zu starten. Das eigene Regex kann z.B. mit http://regexpal.com/ oder https://regex101.com/ getestet werden.<br />
<br />
Funktioniert der Auslöser, das notify tut aber noch nicht was es soll, müssen wir die Anweisung untersuchen. In unserem korrigierten Beispiel<br />
<syntaxhighlight lang="perl"> defmod n_test notify n_test:muster.* Ausführungsteil</syntaxhighlight><br />
folgt beim Kommando <code>trigger n_test muster bild</code> ein Eintrag im Log:<br />
2018.07.13 11:47:57 3: n_test return value: Unknown command Ausführungsteil, try help.<br />
Das notify wurde zwar getriggert aber die Anweisung war nicht ausführbar. <br />
<br />
Ein richtiges Suchmuster und eine fehlerhafte Anweisung wird also normalerweise einen Fehlereintrag im Logfile erzeugen!<br />
<br />
=== Spezialfall: notify löst zwar aus - aber zu oft ===<br />
In dem Fall ist das Suchmuster (regExp) zu unscharf oder das triggernde Gerät löst das Event zu oft aus. Das regExp sollte so genau wie möglich konstruiert werden, device:.* ist eine einfache aber oft keine gute Wahl!<br />
<br />
Im Device, welches den Event auslöst, kann mit den Attributen event-on-.* die Häufigkeit gesteuert werden. Insbesondere ist hier das regExp .* eine Art Standardwahl um aufeinanderfolgende gleichartige Events zu verhindern.<br />
:<code>attr device event-on-change-reading .*</code><br />
'''Achtung''': durch falsche Angaben kann man Events ganz leicht völlig verhindern!<br />
<br />
Siehe auch [[event-on-change-reading]]<br />
<br />
=== Anweisung ===<br />
Wird das notify getriggert oder will man ganz schnell mal ein notify testen, kann man die Anweisung durch folgenden Code ersetzen, man öffnet also einfach nur die DEF, kopiert den ursprünglichen Inhalt an einen sicheren Ort und ersetzt die Anweisung durch eine der beiden Zeilen. Die erste Zeile kann man auch einfach mal in der Kommandozeile testen:<br />
<syntaxhighlight lang="perl">{Log 1, "Das Notify n_test hat ausgeloest."}<br />
{Log 1, "Das Device $NAME hat ausgeloest, der Event sah so aus: $EVENT"}</syntaxhighlight><br />
Wird das notify ausgelöst, muss anschließend im Logfile ein Eintrag zu finden sein:<br />
2018.07.13 10:28:57 1: Das Notify n_test hat ausgeloest, der Event sah so aus: muster<br />
Unsere Anweisung <code>Ausführungsteil</code> liefert in der Kommandozeile selbst einen Fehler:<br />
<code>Unknown command Ausführungsteil, try help.</code><br />
Ein Versuch mit geschweiften Klammern <code>{Ausführungsteil}</code> liefert wieder einen Fehler:<br />
<code>Unrecognized character \xC3; marked by <-- HERE after {Ausf<-- HERE near column 6 at (eval 5977) line 1.</code><br />
Diese Variante <code>{"Ausführungsteil"}</code> liefert den String Ausführungsteil ohne Fehler: Das notify arbeitet fehler- aber sinnfrei.<br />
Der fertige Code:<br />
defmod n_test notify n_test:muster.* {"Ausführungsteil"}<br />
<br />
Man kann die Anweisung, normalerweise so wie sie ist, in der FHEM Kommandozeile testen. Sind im Perl Code (in geschweiften Klammern) im DEF Editor Semikolon enthalten muss man diese für den Test in der Kommandozeile (oder Raw Def) verdoppeln.<br />
Laufzeitabhängige Variablen sind in der Kommandozeile meist nicht verfügbar, diese sollte man für den Test einfach durch passende Inhalte austauschen. So kann man die komfortable Variante (loggt den Namen und das komplette Event) nicht in der Kommandozeile ausführen. <br />
<br />
Funktioniert ein FHEM Befehl in der Kommandozeile nicht (z.B. Lampe geht nicht an) kann es im notify auch nicht funktionieren, dann muss die Fehlersuche an anderer Stelle fortgeführt werden. <br />
<br />
Komplexeren Code im Ausführungsteil sollte man beim Testen in Teilabschnitte aufteilen, von der Laufzeit abhängige Variable ($NAME, $EVENT, $EVTPART) durch Strings ("TestWort") ersetzen, die Teilabschnitte separat testen und anschließend schrittweise wieder komplettieren.<br />
<br />
== Beispiele ==<br />
{{Hinweis|Für die nachfolgenden Beispiele wurden einige unterschiedliche Technologien verwendet. Sie können aber recht einfach auf alle anderen Systeme übertragen werden, dabei sollte ggf. darauf geachtet werden, dass sich Schaltbefehle und Events teilweise je nach konkret eingesetzter Technologie unterscheiden können. Dann ist ggf. eine Erweiterung, z.B. durch eine [[if-condition|if-Abfrage]] erforderlich.}}<br />
<br />
=== Schalter entprellen ===<br />
Will man ein notify innerhalb eines bestimmten Zeitraumes nur einmal auslösen lassen, auch wenn er in diesem Zeitraum mehrfach getriggered werden sollte, so bietet sich das Attribut disabledAfterTrigger an,<br />
attr <notify_device> disabledAfterTrigger <Anzahl Sekunden><br />
In dem Zeitraum wird dann nur einmal (beim ersten Mal) der Befehl ausgelöst, auch wenn mehrfach getriggered wurde. Der Zeitraum kann Bruchteile von Sekunden umfassen.<br />
<br />
=== Etwas schalten, wenn ein anderes Gerät geschaltet wird ===<br />
<br />
==== Vorbedingungen ====<br />
Dieses Beispiel verwendet eine einfache InterTechno-kompatible Funksteckdose für das Radio und einen HM-Aktor für das Licht:<br />
<br />
define RadioKueche IT 000000FFFF 0F F0<br />
define LichtKueche CUL_HM 3A37D6<br />
Beachte: beide kennen als Event bzw. Schaltbefehle ''on'' und ''off''.<br />
<br />
==== notify Befehl ====<br />
define LichtamRadioan notify LichtKueche set RadioKueche $EVENT <br />
oder alternativ: <br />
define LichtamRadioan notify LichtKueche { fhem "set RadioKueche $EVENT" }<br />
<br />
<br />
==== Erklärung ====<br />
* Der Name des ''notify'' "LichtamRadioan" kann frei gewählt werden, er dient nur dazu, das notify in FHEM eindeutig zu identifizieren.<br />
* "$EVENT" ist ein Platzhalter für den Zustand vom Pattern. $EVENT enthält ein "off" wenn das LichtKueche aus- und ein "on" wenn das Licht eingeschaltet wird.<br />
* "{ &lt;perlcode&gt; }" alles was zwischen {} steht ist Perl code. Perl kennt das Schlüsselwort fhem. Das Schlüsselwort FHEM dient dazu, FHEM Befehle auszuführen. Es wird also der FHEM Befehl "set RadioKueche on/off" ausgeführt. on oder off ist abhängig vom Pattern. Der eigentliche FHEM Befehl muss in " " stehen.<br />
* Wann ist ein Wechsel auf die Perl-Ebene erforderlich? <br />
** einfache FHEM-Befehle sollten in der Regel direkt verwendet werden, dies ist ressourcenschonender.<br />
** Immer dann, wenn dies nicht möglich ist, weil z.B. komplexerer Code ausgeführt werden soll, (blockierende) Prozesse ausgelagert werden sollten oder Systembefehle ausgeführt werden, ist es günstiger, auf die Perl-Ebene zu wechseln <ref>In diesem {{Link2Forum|Topic=88398|Message=808685|LinkText=Forenbeitrag}} wird z.B. erläutert, wie man nichtblockierend externe Scripte aufrufen kann, die dann ihre Ergebnisse wieder an FHEM übergeben.</ref>. <br />
<br />
=== Einschalten von mehreren Geräten/Lampen, wenn das Licht eingeschaltet wird ===<br />
Dieses Beispiel verwendet einen HM-Aktor für das Licht sowie zwei Milight-Birnen, die einzeln geschaltet werden sollen<ref>Dies ist ausdrücklich keine Empfehlung für diese Technologie und der Module</ref> in den Stehlampen:<br />
<br />
==== Vorbedingungen ====<br />
FHEM:<br />
define LichtWZ CUL_HM 3A37D8<br />
define Stehlampe1 MilightDevice RGBW Milight_Wohnzimmer 5<br />
define Stehlampe2 MilightDevice RGBW Milight_Wohnzimmer 6<br />
<br />
==== notify Befehl ====<br />
define SteckdoseWZein notify LichtWZ set Stehlampe1,Stehlampe2 $EVENT<br />
oder ''in Perl''<br />
define SteckdoseWZein notify LichtWZ { fhem "set Stehlampe1 $EVENT;;set Stehlampe2 $EVENT " } <br />
==== Erklärung ====<br />
Wenn das LichtWZ eingeschaltet wird, dann werden auch die Stehlampen (1 und 2) eingeschaltet.<br />
<br />
=== Einfache ODER Funktion ===<br />
Eine einfache ODER Funktion kann sehr einfach realisiert werden<br />
<br />
==== Vorbereitung ====<br />
KNX:<br />
* 3x GAs der abzufragende Werte (0/0/40 0/0/41 0/0/42)<br />
<br />
FHEM:<br />
define Licht1 CUL_HM 3A37D8<br />
define Licht2 CUL_HM 1B7EC3<br />
define Stehlampe MilightDevice RGBW Milight_Wohnzimmer 7<br />
<br />
==== notify Befehl ====<br />
define SteckdoseWZein notify (Licht1|Licht2) set Stehlampe $EVENT <br />
oder<br />
define SteckdoseWZein notify (Licht.) set Stehlampe $EVENT<br />
<br />
==== Erklärung ====<br />
Die Werte in der Klammer (wichtig ist das »|«) sind die Rückgabewerte. Alternativ kann in diesem Beispiel auch »Licht.« (zu beachten ist der Punkt) geschrieben werden. Der Punkt ist ein Platzhalter für (genau) ein beliebiges Zeichen.<br />
<br />
Danach folgt der set Befehl.<br />
Wenn also das Licht1 oder Licht2 den Wert "on" hat, dann hat auch die Steckdose den Wert "on"<br />
<br />
Alternative: [[structure]]<br />
<br />
=== Einfache UND Funktion ===<br />
Ob man dieses Konstrukt noch als einfach bezeichnen kann, wage ich mal zu bezweifeln. In FHEM fehlen Loggingfunktionen, die man alle selber mit Perl Code erstellen kann (Danke an MAZ).<br />
Dadurch ist FHEM zwar mächtig, wird aber für viele sehr kompliziert.<br />
<br />
In diesem Beispiel soll - wenn drei Rollos geschlossen sind - am Taster eine LED eingeschaltet werden.<br />
<br />
==== Vorbereitung ====<br />
KNX:<br />
* 3x GDs für die Rückgabewert Rollo geschlossen == 1 (0/0/50 0/0/51 0/0/52)<br />
* GD LED am Lichtschalter (0/0/106)<br />
<br />
FHEM:<br />
define R1ZU KNX 0/0/50:dpt1.009<br />
attr R1ZU dummy 1<br />
define R2ZU KNX 0/0/51:dpt1.009<br />
attr R2ZU dummy 1<br />
define R3ZU KNX 0/0/52:dpt1.009<br />
attr R3ZU dummy 1<br />
define LEDalleRolloZu KNX 0/0/106:dpt1<br />
Durch das Attribut dummy werden keine Schaltfunktion angeboten. Es kann nur Werte anzeigen.<br />
<br />
==== notify Befehl ====<br />
define nt.allerolloszu notify (R1ZU|R2ZU|R3ZU) {\<br />
my $r1 = Value("R1ZU");;\<br />
my $r2 = Value("R2ZU");;\<br />
my $r3 = Value("R3ZU");;\<br />
if ($r1 eq "on" &amp;&amp; $r2 eq "on" &amp;&amp; $r3 eq "on") {\<br />
fhem("set LEDalleRolloZu on");;\<br />
} else {\<br />
fhem("set LEDalleRolloZu off");;\<br />
}\<br />
}<br />
<br />
==== Erklärung ====<br />
Es werden die drei Rückgabewerte R1ZU, R2ZU und R3ZU ausgewertet. Danach folgt Perl Code, deswegen beginnt das ganze mit einer { und endet mit }<br />
<br />
my $r1 =&gt; Variable $r1 definieren<br />
= Value("R1ZU");; ==&gt; weist den Rückgabewert (on oder off) von R1ZU der Variable $r1 zu <br />
<br />
Der doppelte ;; ist ein FHEM Thema. Eigentlich würde für Perl ein ; reichen. Aber FHEM nutzt selbst das ; und daher wird ein ;; benötigt. Mit den ersten drei my Zeilen werden die Rückgabewerte den Variablen zugewiesen.<br />
<br />
Danach erfolgt ein normales "if then else" Konstrukt. Die Zeile »($r1 eq "on" &amp;&amp; $r2 eq "on" &amp;&amp; $r3 eq "on")«&#160;kann man so lesen: Wenn $r1 den Wert "on" und (&amp;&amp;) $r2 den Wert "on" und $r3 den Wert "on" dann schalte die LEDalleRolloZu ein {fhem("set LEDalleRolloZu on")}<br />
ansonsten else schalte die LED aus. {fhem("set LEDalleRolloZu off")<br />
<br />
Alternative: [[structure]]<br />
<br />
=== Zeitverzögert schalten ===<br />
{| class="wikitable"<br />
| '''Aufgabe:''' || Zeitverzögert schalten<br />
|- <br />
| '''Beschreibung:''' || Mit einem Notify zeitverzögert eine Aktion auslösen.<br />
|- <br />
| '''Vorbereitung:''' || Gerät "Lampe" ist definiert und es gibt eine Situation, die ein Ereignis "Fernbedienung:.*" generiert.<br />
|-<br />
| '''Befehl:''' || <code>define ntfy1 notify Fernbedienung:.* sleep 7.5;; set Lampe $EVENT</code><br />
|-<br />
| '''Erläuterungen:''' || Bei Eintreten eines Ereignisses "Fernbedienung*" wird nach einer Pause von siebeneinhalb Sekunden der Befehl <set Lampe ??> ausgeführt, wobei der eigentliche Befehl aus dem auslösenden Ereignis übernommen wird.<br />
:''Quelle: {{Link2Forum|Topic=17161|LinkText=FHEM Forum}}''<br />
|}<br />
<br />
=== Eine PV-Anlage (Solarstrom) zur Steuerung der Rollos nutzen (optional Zeit und Datums abhängig) ===<br />
Hier ein kleines Beispiel, wie man mit Hilfe einer PV-Anlage die Sonneneinstrahlung auf der Südseite ermittelt und dies zur Rolladensteuerung nutzt.<br />
Optional: Die Funktion soll allerdings nur zwischen 9:30 und 17:00 stattfinden. (zweites Beispiel)<br />
Optional: Die Funktion soll nur zwischen dem 6. und 9. Monat funktioneren. (drittes Beispiel)<br />
<br />
==== Vorbereitung ====<br />
PV Anlage mit SolarView abfragen.<br />
Per Hand ermitteln, ab wieviel erzeugtem Strom es sinnvoll ist die Rollos zu schließen.<br />
<br />
==== notify Syntax ====<br />
FHEM:<br />
<br />
define sv SolarView solarview 15000 wr1 wr2 wr3 wr4 <----vier Wechselrichter<br />
attr sv event-on-change-reading currentPower <br />
<br />
define nt.sonnenlichtpersolar notify (sv:currentPower.*) { \<br />
if ($EVTPART1 &lt; 3000 ) {\<br />
fhem('set Flur1 Auf')\<br />
}else {\<br />
if ($EVTPART1 &gt; 5000 ) {\<br />
fhem('set Flur1 Ab')\<br />
} \<br />
}\<br />
}<br />
<br />
Optional 1: Zeitabhängig (Code gehört in die DEF)<br />
<syntaxhighlight lang="Perl"><br />
(sv:currentPower.*) { <br />
my $hm = sprintf("%02d:%02d", $hour, $min);<br />
if ( $hm gt "09:30" && $hm lt "17:00") { <br />
if ($EVTPART1 < 5000 ) {<br />
fhem('set Flur1 Auf')<br />
}else {<br />
if ($EVTPART1 > 8000 ) {<br />
fhem('set Flur1 Ab')<br />
} <br />
}<br />
}<br />
}<br />
</syntaxhighlight><br />
Optional 2: Zeit und Datum (Code gehört in die DEF)<br />
<syntaxhighlight lang="Perl"><br />
(sv:currentPower.*) { <br />
my $hm = sprintf("%02d:%02d", $hour, $min);<br />
if ($month >= 6 && $month <= 9) {<br />
if ( $hm gt "09:30" && $hm lt "17:00") { <br />
if ($EVTPART1 < 5000 ) {<br />
fhem('set Flur1,RBUERO1,RBUERO2 Auf');<br />
}else {<br />
if ($EVTPART1 > 8000 ) {<br />
fhem('set Flur1,Flur2,RBUERO1,RBUERO2 Ab');<br />
} <br />
}<br />
}<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
==== Erklärung ====<br />
* Das define wird in der Kommandozeile im Webbrowser eingegeben.<br />
* Anschließend wird im Webbrowser die DEF bearbeitet, das erspart uns Probleme mit Perl<br />
* define sv SolarView ... <==== ist die Schnittstelle vom SolarView<br />
* define nt.sonnenlichtpersolar notify (sv:currentPower.*) { <==== hier wird ein notify angelegt, der auf das "define sv" Wert "currentPower.*" (.* ist irgendwas) reagiert<br />
if ($EVTPART1 &lt; 3000 ) {<br />
fhem('set Flur1 Auf');<br />
}else {<br />
if ($EVTPART1 &gt; 5000 ) {<br />
fhem('set Flur1 Ab');<br />
} <br />
}<br />
}<br />
Diese if-Funktion wertet den Rückgabewert von currentPower aus. Hierbei muss man wissen, dass $EVTPART1 das Split-Ergebnis vom Rückgabewert ist<br />
<br />
Beispiel: Der Rückgabewert (wie im Beispiel) ist "currentPower: 6000".<br />
Jetzt steht im "$EVTPART0 == currentPower:" und im "$EVTPART1 == 6000"<br />
Das bedeutet, dass man sich nicht selbst den richtigen split (Perl Befehl) Aufruf ausdenken muss, dies übernimmt vielmehr FHEM.<br />
<br />
Ergebnis: <br />
Das Rollo wird abhängig von der erzeugten IST_Strommenge auf und zu gefahren.<br />
Damit dies nicht dauernd hin und her pendelt, wurde der Auf Wert sehr klein und den Ab Wert sehr groß gewählt.<br />
<br />
'''Optional 1:''' Der Block "my $hm = sprintf("%02d:%02d", $hour, $min);" erzeugt die String-Variable $hm mit dem Inhalt $hour:$min. %02d begrenzt die Ausgabe auf zwei Stellen.<br />
Danach wird mit "if ( $hm gt "09:30" && $hm lt "17:00")" mit stringvergleichenden Operatoren geprüft, ob die Uhrzeit zwischen 9:30 und 17:00 liegt (lt = kleiner als; gt = größer als). Es wäre auch ein le und ge möglich: le = kleiner/gleich als, ge = größer/gleich als.<br />
<br />
'''Optional 2:'''if( $month >= 6 && $month <= 9) {<br />
<br />
Hier wird die numerische FHEM-Standard-Variable $month (Monat) auf größer/gleich bzw kleiner/gleich mit den binären Operatoren überprüft.<br />
Die Funktion arbeitet also nur zwischen dem 6. und dem 9. Monat und dann auch nur zwischen 9:31 und 16:59.<br />
<br />
=== Status eines Kippfensters mit 2 Fensterkontakten abbilden ===<br />
<br />
==== Vorbereitung ====<br />
Es ist je ein Fensterkontakt der ''open'' oder ''closed'' meldet, oben und unten am Fenster angebracht.<br />
Die Namen der beiden FHEM-Devices sind ''fensterKontaktOben'' und ''fensterKontaktUnten''.<br />
<br />
==== notify Syntax ====<br />
FHEM:<br />
define statusFenster notify fensterKontakt(Oben|Unten):(open|closed) {\<br />
if ( ReadingsVal('fensterKontaktOben', 'state', 'undef') eq 'open' && ReadingsVal('fensterKontaktUnten', 'state', 'undef') eq 'open')\<br />
{ fhem 'set Terrassentuer open' }\<br />
if ( ReadingsVal('fensterKontaktOben', 'state', 'undef') eq 'closed' && ReadingsVal('fensterKontaktUnten', 'state', 'undef') eq 'closed')\<br />
{ fhem 'set Terrassentuer closed' }\<br />
if ( ReadingsVal('fensterKontaktOben', 'state', 'undef') eq 'open' && ReadingsVal('fensterKontaktUnten', 'state', 'undef') eq 'closed')\<br />
{ fhem 'set Terrassentuer tilted' }\<br />
if ( ReadingsVal('fensterKontaktOben', 'state', 'undef') eq 'closed' && ReadingsVal('fensterKontaktUnten', 'state', 'undef') eq 'open')\<br />
{ fhem 'set Terrassentuer undef' }\<br />
}<br />
<br />
== Weitere Hinweise ==<br />
* Entsprechend zu $EVENT gibt es auch noch $NAME und $TYPE. $NAME und $TYPE enthalten den Namen bzw. Typ des Ereignis auslösenden Gerätes.<br />
* Wird der Perl-Code in einem <code>notify</code> immer länger, lagere den Code wegen der Übersichtlichkeit in eine eigene Programmdatei aus, wie in [[99_myUtils anlegen]] beschrieben.<br />
* Achtung! Wenn man das Skript für den notify-Befehl über mehrere Zeilen schreibt, muss man anscheinend darauf achten, dass keine abschließende Leerzeile mitgespeichert wird. Sonst wird der notify-Befehl ignoriert.<br />
* Dieser {{Link2Forum|Topic=38520|Message=307325}} enthält Vorschläge zur Vorgehensweise bei der Erstellung von komplexen ''notify'' Definitionen bzw. bei deren Fehlerbehebung.<br />
<br />
== Weiterführende Links ==<br />
* [[Escapen in Perlbefehlen]]<br />
* [[Klammerebenen]]<br />
* Forenbeitrag zum Thema {{Link2Forum|Topic=115414|LinkText=Optimierung des Suchmusters - NOTIFYDEV}}<br />
<br />
== Hinweise ==<br />
<references /><br />
<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:Hilfsmodul]]</div>Otto123http://wiki.fhem.de/w/index.php?title=Notify&diff=37093Notify2022-01-12T19:19:48Z<p>Otto123: /* notify Befehl */ Zeilenenden eingefügt Raw Def</p>
<hr />
<div>{{SEITENTITEL:notify}}<br />
{{Infobox Modul<br />
|ModPurpose=Ausführung von Anweisung(en) als Reaktion auf Ereignisse<br />
|ModType=h<br />
|ModCmdRef=notify<br />
|ModForumArea=Automatisierung<br />
|ModTechName=91_notify.pm<br />
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])<br />
}}<br />
<br />
== Einführung ==<br />
{{Hinweis|Weitere grundlegende Informationen/Beispiele zu notify enthält [http://fhem.de/Heimautomatisierung-mit-fhem.pdf Heimautomatisierung mit FHEM]}}<br />
Das Hilfsmodul notify dient dazu [[Ereignis|Ereignisse]] über ein Suchmuster zu erkennen und bei einem Treffer eine Aktion auszulösen. Mit ''notify'' und anderen [[Eventhandler|Eventhandlern]] <ref>hierzu gehören u.a. auch [[DOIF]], [[THRESHOLD]] und [[watchdog]]</ref> ist es möglich, Logikfunktionen im FHEM abzubilden.<br />
<br />
'''Beispiele:''' <br />
* Wird das Licht in der Küche eingeschaltet, soll FHEM dort auch das Radio einschalten. <br />
* Bei Druck auf einen Taster soll die Umwälzpumpe für das Warmwasser eingeschaltet werden. <br />
* Erweiterte Möglichkeiten: Aber nur, wenn das Radio aus ist bzw. die Temperatur im Rücklauf des Warmwassers unterhalb einer bestimmten Schwelle liegt<ref>vgl. hierzu z.B. {{Link2CmdRef|Anker=devspec|Label=FILTER}} und [[if-condition]]</ref>.<br />
<br />
== Syntax ==<br />
<br />
define <name> notify <Suchmuster> <command> <br />
<br />
Das ''[[Regulärer Ausdruck|Suchmuster]]'' (häufig als Regexp = regular expression = regulärer Ausdruck bezeichnet) ist sehr wichtig: Es ist entweder der Name des auslösenden ("triggernden") Gerätes oder die Kombination aus Gerät und auslösendem Ereignis (Event) <code>Gerätename:Event</code>. Die Events kann man dem [[Event_monitor|Event-Monitor]] entnehmen. Wenn dort z.B. <code>Rollo1</code> steht, dann reagiert ''notify'' auf <code>Rollo1 on</code> und <code>Rollo1 off</code> usw.<br />
<br />
Wenn man mehrere Suchmuster kombinieren möchte, kann man diese in Klammer schreiben, als Trenner wird dann Pipe (|) genutzt: <code>(Rollo1|Rollo2|Steckdose5)</code>.<br />
<br />
'''Auch die Verwendung von Platzhaltern ist möglich''':<br />
* <code>Rollo.</code> → das notify reagiert auf alles was mit Rollo und '''einem''' weiteren beliebigen Zeichen anfängt. Also auf Rollo1 wie auch auf RolloG, aber nicht auf Rollo_wischundweg<br />
* <code>Rollo.*</code> → notify reagiert auf alles das mit Rollo beginnt<br />
* <code>.*isch</code> → auf alles das mit isch aufhört (Tisch, Fisch)<br />
* <code>Schalter(1|2|3)</code> → hört auf Schalter1, Schalter2 und Schalter3<br />
* <code>dimmer:pct:.(100|7[6-9]|[89][0-9])</code> → reagiert, wenn pct einen Wert über 75 annimmt.<br />
<br />
Suchmuster/Regex kann man im Internet beispielsweise auf [http://regexpal.com/| http://regexpal.com/] testen.<br />
<br />
Es gibt seit Juli 2020 eine Perlfunktion notifyRegexpCheck zum Testen, wie FHEM über das Suchmuster "denkt" - siehe {{Link2Forum|Topic=111938|Message=1074202|LinkText=diesen Beitrag}} im Forum.<br />
<br />
{{Hinweis|Das '''Suchmuster''' wird notify-intern um das Zeichen ^ (beginnt mit) und das Zeichen $ (endet mit) ergänzt<ref>Der Eventhandler [[DOIF]] verwendet die in Perl übliche Syntax für reguläre Ausdrücke als DOIF-Suchmuster.</ref>.<br />
<br />
Deshalb darf das Suchmuster nicht mit einem üblichen [[Regulärer Ausdruck|'''Regulären Ausdruck''']], wie er in Perl<ref>https://perldoc.perl.org/perlre.html</ref> verwendet wird, gleichgesetzt werden, da die Ergänzung zu einem grundsätzlich unterschiedlichen Verhalten führt, siehe nachstehendes Beispiel.}}<br />
<br />
'''Beispiel für das unterschiedliche Verhalten von ''Suchmuster'' und ''regulären Ausdruck'''''<br />
<br />
Für einen '''regulären Audruck''' gilt: Wenn der reguläre Ausdruck ''lampe'' ist und das [[Ereignis]] ''tischlampe'' dann passen ''tischlampe'' und ''lampe'' zueinander.<br />
<br />
Für das '''Suchmuster''' gilt: Wenn das Suchmuster ''lampe'' ist und das [[Ereignis]] ''tischlampe'' dann passen ''tischlampe'' und ''lampe'' '''nicht''' zueinander, weil das Suchmuster zu ^lampe$ ergänzt wird und damit exakt nur auf ''lampe'' matcht (passt).<br />
<br />
'''Variablen Zuordnung zum Event'''<br />
<br />
'''Beispiel 1'''<br />
<br />
2020-01-21 22:40:39 HUEDevice VibrationTest1 battery: 88<br />
{| class="wikitable"<br />
|-<br />
! !!$NAME !! colspan="2" |$EVENT<br />
|-<br />
| ||||$EVTPART0 ||$EVTPART1<br />
|-<br />
|2020-01-21 22:40:39 HUEDevice|| VibrationTest1|| battery:|| 88<br />
|}<br />
<br />
<br />
'''Beispiel 2'''<br />
2021-05-09 19:11:43 FB_CALLMONITOR cm_example external_name: Graf Herzog von und zu ...<br />
{| class="wikitable"<br />
|-<br />
! !!$NAME !! colspan="7" |$EVENT<br />
|-<br />
| ||||$EVTPART0 ||$EVTPART1 || $EVTPART2|| $EVTPART3 || $EVTPART4|| $EVTPART5|| ...<br />
|-<br />
|2021-05-09 19:11:43 FB_CALLMONITOR|| cm_example|| external_name:|| Graf|| Herzog|| von|| und|| zu|| ...<br />
|}<br />
<br />
== FHEMWEB-unterstütztes Anlegen eines notify ==<br />
{{Hinweis|Die Erstellung eines notify und insbesondere die korrekte Angabe des Suchmusters (Regex) führt gerade bei Einsteigern immer wieder zu Schwierigkeiten. Zur Fehlerminimierung empfiehlt es sich zum einen, die [[Konfiguration]] nicht direkt zu bearbeiten, sondern die "Befehl-Eingabezeile", die "Objektdetails" oder den [[Import von Code Snippets|Import von RAW-Definitionen]] zur Bearbeitung zu nutzen.}}<br />
<br />
=== Event Monitor ===<br />
Die komfortabelste Möglichkeit, die häufigsten Event-Handler zu erstellen, bietet der [[Event monitor|Event-Monitor]]. Die Vorgehensweis ist in dem zugehörigen Artikel dargestellt.<br />
<br />
=== Regexp wizard ===<br />
Zudem enthält FHEM einen Regexp wizard mit dem Regex anhand der in FHEM vorhandenen Devices und deren Events aus einer Auswahlbox selektiert werden können. Voraussetzungen sind:<br />
* Aktivierung des Hilfsmoduls [[eventTypes]] (bei allen Neuinstallationen Standard) <br />
* das gesuchte Ereignis (Event) ist nach Aktivierung des Hilfsmoduls bereits mindestens einmal eingetreten<br />
<br />
Schrittweise Darstellung der Nutzung des Regexp wizard zur Anlage eines "notify":<br />
<br />
In das [[Konfiguration#Befehl-Eingabefeld|Befehls-Eingabefeld]] eingeben und mit {{Taste|Enter}} bestätigen:<br />
define ntest notify a b<br />
Als Beispiel wird ein notify mit <name> "ntest" angelegt. "a" und "b" sind beliebige Platzhalter für <Suchmuster> und <Command>, die bei der weiteren Bearbeitung mit dem endgültigen Werten ersetzt werden.<br />
Der Regexp wizard öffnet sich:<br />
[[Datei:Regexp wizard1.JPG|400px|thumb|center]]<br />
Nun in der Auswahlbox das auslösende Event (Ereignis) auswählen; zunächst das Device und dann das gewünschte Regex. Hier soll das notify bei jeder Veränderung der Temperatur (temperature.*) des Device BTHR918N reagieren. Abschließend mit einem Mausklick auf {{Taste|set}} bestätigen. Wählt man mehrere Regex in dieser Weise aus, so wird das "notify" bei Eintritt jedes dieser Events ausgeführt:<br />
[[Datei:Regexp wizard2.JPG|400px|thumb|center]]<br />
Anschließend den Platzhalter "a" mit Klick auf den Link "removeRegexpPart" löschen:<br />
[[Datei:Regexp wizard3.JPG|400px|thumb|center]]<br />
Den Link "DEF" anklicken, damit sich der DEF-Editor öffnet:<br />
[[Datei:Regexp wizard4.JPG|400px|thumb|center]]<br />
Jetzt den auszuführenden Befehl im "DEF"-Bereich durch Überschreiben des Platzhalters "b" eintragen und mit Klick auf {{Taste|modify ntest}} abschließen:<br />
[[Datei:Regexp wizard5.JPG|400px|thumb|center]]<br />
Das fertige und sofort aktive "notify" sieht abschließend folgendermaßen aus:<br />
[[Datei:Regexp wizard6.JPG|400px|thumb|center]]<br />
Am Schluss das Speichern über {{Taste|Save config}} nicht vergessen.<br />
<br />
== Mein notify geht nicht - wie kann ich mir selbst helfen: Debugging ==<br />
Funktioniert ein notify nicht wie gewünscht, kann es nur zwei Hauptursachen haben: <br />
* Entweder das Suchmuster paßt nicht zum gewünschten Auslöser (FHEM Device), und/oder<br />
* die Anweisung enthält einen Fehler. <br />
Sollte kein Fehler im Logfile auftauchen aber das notify ausgelöst werden, stimmt meist der Übertragungsweg zum Zieldevice nicht.<br />
Der STATE des notify zeigt normalerweise mit Datum/Uhrzeit die letzte Auslösung an.<br />
<br />
Beim Debuggen sollte man daher beide Elemente getrennt untersuchen. Hier ein Beispiel welches nicht wie gewünscht funktioniert:<br />
<syntaxhighlight lang="perl"> define n_test notify n_test:muster Ausführungsteil</syntaxhighlight><br />
Zum debuggen benötigen wir <br />
* den [[Event monitor]]<br />
* das [https://fhem.de/commandref.html#trigger trigger-Kommando] - kann man jederzeit verwenden um das Suchmuster als Event unabhängig vom Auslöser zu erzeugen.<br />
* die FHEM Kommandozeile<br />
* den [[DEF-Editor]]<br />
* eventuell einen Texteditor um Codeblöcke zwischen zu lagern und Notizen zu machen.<br />
<br />
Das Suchmuster im Beispiel notify triggert auf sich selbst, es soll auf jeden Event mit dem Inhalt '''muster''' ausgelöst werden, Beispiel:<br />
2018-07-14 14:31:03 notify n_test muster bild<br />
<br />
=== Suchmuster ===<br />
Sollte das notify nicht funktionieren:<br />
* keine Reaktion wie gewünscht<br />
* keine Fehlermeldung in der Weboberfläche beim Anlegen, keine Fehlermeldung im Logfile<br />
* STATE ist unverändert auf active oder einem altem Datum/Uhrzeit<br />
liegt der Fehler mit Sicherheit im Suchmuster. Man hat die Chance das Suchmuster mit dem trigger Befehl zu erzeugen und zu schauen ob die Anweisung ausgeführt wird. Dabei ist zu beachten: Der erste ":" im Suchmuster ist zusätzlich zwischen Gerät und Event als Trennung. Jeder weiter : ist, wenn vorhanden, Bestandteil des Events! Siehe dazu den Abschnitt [https://fhem.de/commandref_DE.html#notify Hinweise in der commandref]<br />
*Im Beispiel: Event: n_test muster -> Suchmuster n_test:muster<br />
Um aus dem [[Event]] ein passendes Suchmuster zu erzeugen kann der [[Event monitor|Event-Monitor]] direkt verwendet werden. Man kann ein neues notify erzeugen oder ein Bestehendes modifizieren lassen.<br />
<br />
Unser Regex im Beispiel ist zu spezifisch, es triggert nur exakt auf '''muster'''. Dieser Trigger erzeugt den folgenden Eintrag im Eventmonitor, entspricht exakt dem Suchmuster und löst das notify aus:<br />
trigger n_test muster<br />
2018-07-13 11:52:08 notify n_test muster<br />
Das Suchmuster für unsere Anforderung muss in <code>n_test:muster.*</code> geändert werden, damit jeder Event der mit muster beginnt das notify auslöst.<br />
Der . im Regex steht für jedes beliebige Zeichen und der * für eine beliebige Anzahl des Zeichens davor: also beliebig viele beliebige Zeichen nach muster.<br />
<br />
Das Suchmuster wird häufig in ein komplizierteres Regex umgewandelt um im notify mehrere Aktionen zu starten. Das eigene Regex kann z.B. mit http://regexpal.com/ oder https://regex101.com/ getestet werden.<br />
<br />
Funktioniert der Auslöser, das notify tut aber noch nicht was es soll, müssen wir die Anweisung untersuchen. In unserem korrigierten Beispiel<br />
<syntaxhighlight lang="perl"> defmod n_test notify n_test:muster.* Ausführungsteil</syntaxhighlight><br />
folgt beim Kommando <code>trigger n_test muster bild</code> ein Eintrag im Log:<br />
2018.07.13 11:47:57 3: n_test return value: Unknown command Ausführungsteil, try help.<br />
Das notify wurde zwar getriggert aber die Anweisung war nicht ausführbar. <br />
<br />
Ein richtiges Suchmuster und eine fehlerhafte Anweisung wird also normalerweise einen Fehlereintrag im Logfile erzeugen!<br />
<br />
=== Spezialfall: notify löst zwar aus - aber zu oft ===<br />
In dem Fall ist das Suchmuster (regExp) zu unscharf oder das triggernde Gerät löst das Event zu oft aus. Das regExp sollte so genau wie möglich konstruiert werden, device:.* ist eine einfache aber oft keine gute Wahl!<br />
<br />
Im Device, welches den Event auslöst, kann mit den Attributen event-on-.* die Häufigkeit gesteuert werden. Insbesondere ist hier das regExp .* eine Art Standardwahl um aufeinanderfolgende gleichartige Events zu verhindern.<br />
:<code>attr device event-on-change-reading .*</code><br />
'''Achtung''': durch falsche Angaben kann man Events ganz leicht völlig verhindern!<br />
<br />
Siehe auch [[event-on-change-reading]]<br />
<br />
=== Anweisung ===<br />
Wird das notify getriggert oder will man ganz schnell mal ein notify testen, kann man die Anweisung durch folgenden Code ersetzen, man öffnet also einfach nur die DEF, kopiert den ursprünglichen Inhalt an einen sicheren Ort und ersetzt die Anweisung durch eine der beiden Zeilen. Die erste Zeile kann man auch einfach mal in der Kommandozeile testen:<br />
<syntaxhighlight lang="perl">{Log 1, "Das Notify n_test hat ausgeloest."}<br />
{Log 1, "Das Device $NAME hat ausgeloest, der Event sah so aus: $EVENT"}</syntaxhighlight><br />
Wird das notify ausgelöst, muss anschließend im Logfile ein Eintrag zu finden sein:<br />
2018.07.13 10:28:57 1: Das Notify n_test hat ausgeloest, der Event sah so aus: muster<br />
Unsere Anweisung <code>Ausführungsteil</code> liefert in der Kommandozeile selbst einen Fehler:<br />
<code>Unknown command Ausführungsteil, try help.</code><br />
Ein Versuch mit geschweiften Klammern <code>{Ausführungsteil}</code> liefert wieder einen Fehler:<br />
<code>Unrecognized character \xC3; marked by <-- HERE after {Ausf<-- HERE near column 6 at (eval 5977) line 1.</code><br />
Diese Variante <code>{"Ausführungsteil"}</code> liefert den String Ausführungsteil ohne Fehler: Das notify arbeitet fehler- aber sinnfrei.<br />
Der fertige Code:<br />
defmod n_test notify n_test:muster.* {"Ausführungsteil"}<br />
<br />
Man kann die Anweisung, normalerweise so wie sie ist, in der FHEM Kommandozeile testen. Sind im Perl Code (in geschweiften Klammern) im DEF Editor Semikolon enthalten muss man diese für den Test in der Kommandozeile (oder Raw Def) verdoppeln.<br />
Laufzeitabhängige Variablen sind in der Kommandozeile meist nicht verfügbar, diese sollte man für den Test einfach durch passende Inhalte austauschen. So kann man die komfortable Variante (loggt den Namen und das komplette Event) nicht in der Kommandozeile ausführen. <br />
<br />
Funktioniert ein FHEM Befehl in der Kommandozeile nicht (z.B. Lampe geht nicht an) kann es im notify auch nicht funktionieren, dann muss die Fehlersuche an anderer Stelle fortgeführt werden. <br />
<br />
Komplexeren Code im Ausführungsteil sollte man beim Testen in Teilabschnitte aufteilen, von der Laufzeit abhängige Variable ($NAME, $EVENT, $EVTPART) durch Strings ("TestWort") ersetzen, die Teilabschnitte separat testen und anschließend schrittweise wieder komplettieren.<br />
<br />
== Beispiele ==<br />
{{Hinweis|Für die nachfolgenden Beispiele wurden einige unterschiedliche Technologien verwendet. Sie können aber recht einfach auf alle anderen Systeme übertragen werden, dabei sollte ggf. darauf geachtet werden, dass sich Schaltbefehle und Events teilweise je nach konkret eingesetzter Technologie unterscheiden können. Dann ist ggf. eine Erweiterung, z.B. durch eine [[if-condition|if-Abfrage]] erforderlich.}}<br />
<br />
=== Schalter entprellen ===<br />
Will man ein notify innerhalb eines bestimmten Zeitraumes nur einmal auslösen lassen, auch wenn er in diesem Zeitraum mehrfach getriggered werden sollte, so bietet sich das Attribut disabledAfterTrigger an,<br />
attr <notify_device> disabledAfterTrigger <Anzahl Sekunden><br />
In dem Zeitraum wird dann nur einmal (beim ersten Mal) der Befehl ausgelöst, auch wenn mehrfach getriggered wurde. Der Zeitraum kann Bruchteile von Sekunden umfassen.<br />
<br />
=== Etwas schalten, wenn ein anderes Gerät geschaltet wird ===<br />
<br />
==== Vorbedingungen ====<br />
Dieses Beispiel verwendet eine einfache InterTechno-kompatible Funksteckdose für das Radio und einen HM-Aktor für das Licht:<br />
<br />
define RadioKueche IT 000000FFFF 0F F0<br />
define LichtKueche CUL_HM 3A37D6<br />
Beachte: beide kennen als Event bzw. Schaltbefehle ''on'' und ''off''.<br />
<br />
==== notify Befehl ====<br />
define LichtamRadioan notify LichtKueche set RadioKueche $EVENT <br />
oder alternativ: <br />
define LichtamRadioan notify LichtKueche { fhem "set RadioKueche $EVENT" }<br />
<br />
<br />
==== Erklärung ====<br />
* Der Name des ''notify'' "LichtamRadioan" kann frei gewählt werden, er dient nur dazu, das notify in FHEM eindeutig zu identifizieren.<br />
* "$EVENT" ist ein Platzhalter für den Zustand vom Pattern. $EVENT enthält ein "off" wenn das LichtKueche aus- und ein "on" wenn das Licht eingeschaltet wird.<br />
* "{ &lt;perlcode&gt; }" alles was zwischen {} steht ist Perl code. Perl kennt das Schlüsselwort fhem. Das Schlüsselwort FHEM dient dazu, FHEM Befehle auszuführen. Es wird also der FHEM Befehl "set RadioKueche on/off" ausgeführt. on oder off ist abhängig vom Pattern. Der eigentliche FHEM Befehl muss in " " stehen.<br />
* Wann ist ein Wechsel auf die Perl-Ebene erforderlich? <br />
** einfache FHEM-Befehle sollten in der Regel direkt verwendet werden, dies ist ressourcenschonender.<br />
** Immer dann, wenn dies nicht möglich ist, weil z.B. komplexerer Code ausgeführt werden soll, (blockierende) Prozesse ausgelagert werden sollten oder Systembefehle ausgeführt werden, ist es günstiger, auf die Perl-Ebene zu wechseln <ref>In diesem {{Link2Forum|Topic=88398|Message=808685|LinkText=Forenbeitrag}} wird z.B. erläutert, wie man nichtblockierend externe Scripte aufrufen kann, die dann ihre Ergebnisse wieder an FHEM übergeben.</ref>. <br />
<br />
=== Einschalten von mehreren Geräten/Lampen, wenn das Licht eingeschaltet wird ===<br />
Dieses Beispiel verwendet einen HM-Aktor für das Licht sowie zwei Milight-Birnen, die einzeln geschaltet werden sollen<ref>Dies ist ausdrücklich keine Empfehlung für diese Technologie und der Module</ref> in den Stehlampen:<br />
<br />
==== Vorbedingungen ====<br />
FHEM:<br />
define LichtWZ CUL_HM 3A37D8<br />
define Stehlampe1 MilightDevice RGBW Milight_Wohnzimmer 5<br />
define Stehlampe2 MilightDevice RGBW Milight_Wohnzimmer 6<br />
<br />
==== notify Befehl ====<br />
define SteckdoseWZein notify LichtWZ set Stehlampe1,Stehlampe2 $EVENT<br />
oder ''in Perl''<br />
define SteckdoseWZein notify LichtWZ { fhem "set Stehlampe1 $EVENT;;set Stehlampe2 $EVENT " } <br />
==== Erklärung ====<br />
Wenn das LichtWZ eingeschaltet wird, dann werden auch die Stehlampen (1 und 2) eingeschaltet.<br />
<br />
=== Einfache ODER Funktion ===<br />
Eine einfache ODER Funktion kann sehr einfach realisiert werden<br />
<br />
==== Vorbereitung ====<br />
KNX:<br />
* 3x GAs der abzufragende Werte (0/0/40 0/0/41 0/0/42)<br />
<br />
FHEM:<br />
define Licht1 CUL_HM 3A37D8<br />
define Licht2 CUL_HM 1B7EC3<br />
define Stehlampe MilightDevice RGBW Milight_Wohnzimmer 7<br />
<br />
==== notify Befehl ====<br />
define SteckdoseWZein notify (Licht1|Licht2) set Stehlampe $EVENT <br />
oder<br />
define SteckdoseWZein notify (Licht.) set Stehlampe $EVENT<br />
<br />
==== Erklärung ====<br />
Die Werte in der Klammer (wichtig ist das »|«) sind die Rückgabewerte. Alternativ kann in diesem Beispiel auch »Licht.« (zu beachten ist der Punkt) geschrieben werden. Der Punkt ist ein Platzhalter für (genau) ein beliebiges Zeichen.<br />
<br />
Danach folgt der set Befehl.<br />
Wenn also das Licht1 oder Licht2 den Wert "on" hat, dann hat auch die Steckdose den Wert "on"<br />
<br />
Alternative: [[structure]]<br />
<br />
=== Einfache UND Funktion ===<br />
Ob man dieses Konstrukt noch als einfach bezeichnen kann, wage ich mal zu bezweifeln. In FHEM fehlen Loggingfunktionen, die man alle selber mit Perl Code erstellen kann (Danke an MAZ).<br />
Dadurch ist FHEM zwar mächtig, wird aber für viele sehr kompliziert.<br />
<br />
In diesem Beispiel soll - wenn drei Rollos geschlossen sind - am Taster eine LED eingeschaltet werden.<br />
<br />
==== Vorbereitung ====<br />
KNX:<br />
* 3x GDs für die Rückgabewert Rollo geschlossen == 1 (0/0/50 0/0/51 0/0/52)<br />
* GD LED am Lichtschalter (0/0/106)<br />
<br />
FHEM:<br />
define R1ZU KNX 0/0/50:dpt1.009<br />
attr R1ZU dummy 1<br />
define R2ZU KNX 0/0/51:dpt1.009<br />
attr R2ZU dummy 1<br />
define R3ZU KNX 0/0/52:dpt1.009<br />
attr R3ZU dummy 1<br />
define LEDalleRolloZu KNX 0/0/106:dpt1<br />
Durch das Attribut dummy werden keine Schaltfunktion angeboten. Es kann nur Werte anzeigen.<br />
<br />
==== notify Befehl ====<br />
define nt.allerolloszu notify (R1ZU|R2ZU|R3ZU) {\<br />
my $r1 = Value("R1ZU");;\<br />
my $r2 = Value("R2ZU");;\<br />
my $r3 = Value("R3ZU");;\<br />
if ($r1 eq "on" &amp;&amp; $r2 eq "on" &amp;&amp; $r3 eq "on") {\<br />
fhem("set LEDalleRolloZu on");;\<br />
} else {\<br />
fhem("set LEDalleRolloZu off");;\<br />
}\<br />
}<br />
<br />
==== Erklärung ====<br />
Es werden die drei Rückgabewerte R1ZU, R2ZU und R3ZU ausgewertet. Danach folgt Perl Code, deswegen beginnt das ganze mit einer { und endet mit }<br />
<br />
my $r1 =&gt; Variable $r1 definieren<br />
= Value("R1ZU");; ==&gt; weist den Rückgabewert (on oder off) von R1ZU der Variable $r1 zu <br />
<br />
Der doppelte ;; ist ein FHEM Thema. Eigentlich würde für Perl ein ; reichen. Aber FHEM nutzt selbst das ; und daher wird ein ;; benötigt. Mit den ersten drei my Zeilen werden die Rückgabewerte den Variablen zugewiesen.<br />
<br />
Danach erfolgt ein normales "if then else" Konstrukt. Die Zeile »($r1 eq "on" &amp;&amp; $r2 eq "on" &amp;&amp; $r3 eq "on")«&#160;kann man so lesen: Wenn $r1 den Wert "on" und (&amp;&amp;) $r2 den Wert "on" und $r3 den Wert "on" dann schalte die LEDalleRolloZu ein {fhem("set LEDalleRolloZu on")}<br />
ansonsten else schalte die LED aus. {fhem("set LEDalleRolloZu off")<br />
<br />
Alternative: [[structure]]<br />
<br />
=== Zeitverzögert schalten ===<br />
{| class="wikitable"<br />
| '''Aufgabe:''' || Zeitverzögert schalten<br />
|- <br />
| '''Beschreibung:''' || Mit einem Notify zeitverzögert eine Aktion auslösen.<br />
|- <br />
| '''Vorbereitung:''' || Gerät "Lampe" ist definiert und es gibt eine Situation, die ein Ereignis "Fernbedienung:.*" generiert.<br />
|-<br />
| '''Befehl:''' || <code>define ntfy1 notify Fernbedienung:.* sleep 7.5;; set Lampe $EVENT</code><br />
|-<br />
| '''Erläuterungen:''' || Bei Eintreten eines Ereignisses "Fernbedienung*" wird nach einer Pause von siebeneinhalb Sekunden der Befehl <set Lampe ??> ausgeführt, wobei der eigentliche Befehl aus dem auslösenden Ereignis übernommen wird.<br />
:''Quelle: {{Link2Forum|Topic=17161|LinkText=FHEM Forum}}''<br />
|}<br />
<br />
=== Eine PV-Anlage (Solarstrom) zur Steuerung der Rollos nutzen (optional Zeit und Datums abhängig) ===<br />
Hier ein kleines Beispiel, wie man mit Hilfe einer PV-Anlage die Sonneneinstrahlung auf der Südseite ermittelt und dies zur Rolladensteuerung nutzt.<br />
Optional: Die Funktion soll allerdings nur zwischen 9:30 und 17:00 stattfinden. (zweites Beispiel)<br />
Optional: Die Funktion soll nur zwischen dem 6. und 9. Monat funktioneren. (drittes Beispiel)<br />
<br />
==== Vorbereitung ====<br />
PV Anlage mit SolarView abfragen.<br />
Per Hand ermitteln, ab wieviel erzeugtem Strom es sinnvoll ist die Rollos zu schließen.<br />
<br />
==== notify Syntax ====<br />
FHEM:<br />
<br />
define sv SolarView solarview 15000 wr1 wr2 wr3 wr4 <----vier Wechselrichter<br />
attr sv event-on-change-reading currentPower <br />
<br />
define nt.sonnenlichtpersolar notify (sv:currentPower.*) { <br />
if ($EVTPART1 &lt; 3000 ) {<br />
fhem('set Flur1 Auf');<br />
}else {<br />
if ($EVTPART1 &gt; 5000 ) {<br />
fhem('set Flur1 Ab');<br />
} <br />
}<br />
}<br />
<br />
Optional 1: Zeitabhängig<br />
<syntaxhighlight lang="Perl"><br />
(sv:currentPower.*) { <br />
my $hm = sprintf("%02d:%02d", $hour, $min);<br />
if ( $hm gt "09:30" && $hm lt "17:00") { <br />
if ($EVTPART1 < 5000 ) {<br />
fhem('set Flur1 Auf');<br />
}else {<br />
if ($EVTPART1 > 8000 ) {<br />
fhem('set Flur1 Ab');<br />
} <br />
}<br />
}<br />
}<br />
</syntaxhighlight><br />
Optional 2: Zeit und Datum<br />
<syntaxhighlight lang="Perl"><br />
(sv:currentPower.*) { <br />
my $hm = sprintf("%02d:%02d", $hour, $min);<br />
if ($month >= 6 && $month <= 9) {<br />
if ( $hm gt "09:30" && $hm lt "17:00") { <br />
if ($EVTPART1 < 5000 ) {<br />
fhem('set Flur1,RBUERO1,RBUERO2 Auf');<br />
}else {<br />
if ($EVTPART1 > 8000 ) {<br />
fhem('set Flur1,Flur2,RBUERO1,RBUERO2 Ab');<br />
} <br />
}<br />
}<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
==== Erklärung ====<br />
* Das define wird in der Kommandozeile im Webbrowser eingegeben.<br />
* Anschließend wird im Webbrowser die DEF bearbeitet, das erspart uns Probleme mit Perl<br />
* define sv SolarView ... <==== ist die Schnittstelle vom SolarView<br />
* define nt.sonnenlichtpersolar notify (sv:currentPower.*) { <==== hier wird ein notify angelegt, der auf das "define sv" Wert "currentPower.*" (.* ist irgendwas) reagiert<br />
if ($EVTPART1 &lt; 3000 ) {<br />
fhem('set Flur1 Auf');<br />
}else {<br />
if ($EVTPART1 &gt; 5000 ) {<br />
fhem('set Flur1 Ab');<br />
} <br />
}<br />
}<br />
Diese if-Funktion wertet den Rückgabewert von currentPower aus. Hierbei muss man wissen, dass $EVTPART1 das Split-Ergebnis vom Rückgabewert ist<br />
<br />
Beispiel: Der Rückgabewert (wie im Beispiel) ist "currentPower: 6000".<br />
Jetzt steht im "$EVTPART0 == currentPower:" und im "$EVTPART1 == 6000"<br />
Das bedeutet, dass man sich nicht selbst den richtigen split (Perl Befehl) Aufruf ausdenken muss, dies übernimmt vielmehr FHEM.<br />
<br />
Ergebnis: <br />
Das Rollo wird abhängig von der erzeugten IST_Strommenge auf und zu gefahren.<br />
Damit dies nicht dauernd hin und her pendelt, wurde der Auf Wert sehr klein und den Ab Wert sehr groß gewählt.<br />
<br />
'''Optional 1:''' Der Block "my $hm = sprintf("%02d:%02d", $hour, $min);" erzeugt die String-Variable $hm mit dem Inhalt $hour:$min. %02d begrenzt die Ausgabe auf zwei Stellen.<br />
Danach wird mit "if ( $hm gt "09:30" && $hm lt "17:00")" mit stringvergleichenden Operatoren geprüft, ob die Uhrzeit zwischen 9:30 und 17:00 liegt (lt = kleiner als; gt = größer als). Es wäre auch ein le und ge möglich: le = kleiner/gleich als, ge = größer/gleich als.<br />
<br />
'''Optional 2:'''if( $month >= 6 && $month <= 9) {<br />
<br />
Hier wird die numerische FHEM-Standard-Variable $month (Monat) auf größer/gleich bzw kleiner/gleich mit den binären Operatoren überprüft.<br />
Die Funktion arbeitet also nur zwischen dem 6. und dem 9. Monat und dann auch nur zwischen 9:31 und 16:59.<br />
<br />
=== Status eines Kippfensters mit 2 Fensterkontakten abbilden ===<br />
<br />
==== Vorbereitung ====<br />
Es ist je ein Fensterkontakt der ''open'' oder ''closed'' meldet, oben und unten am Fenster angebracht.<br />
Die Namen der beiden FHEM-Devices sind ''fensterKontaktOben'' und ''fensterKontaktUnten''.<br />
<br />
==== notify Syntax ====<br />
FHEM:<br />
define statusFenster notify fensterKontakt(Oben|Unten):(open|closed) {\<br />
if ( ReadingsVal('fensterKontaktOben', 'state', 'undef') eq 'open' && ReadingsVal('fensterKontaktUnten', 'state', 'undef') eq 'open')\<br />
{ fhem 'set Terrassentuer open' }\<br />
if ( ReadingsVal('fensterKontaktOben', 'state', 'undef') eq 'closed' && ReadingsVal('fensterKontaktUnten', 'state', 'undef') eq 'closed')\<br />
{ fhem 'set Terrassentuer closed' }\<br />
if ( ReadingsVal('fensterKontaktOben', 'state', 'undef') eq 'open' && ReadingsVal('fensterKontaktUnten', 'state', 'undef') eq 'closed')\<br />
{ fhem 'set Terrassentuer tilted' }\<br />
if ( ReadingsVal('fensterKontaktOben', 'state', 'undef') eq 'closed' && ReadingsVal('fensterKontaktUnten', 'state', 'undef') eq 'open')\<br />
{ fhem 'set Terrassentuer undef' }\<br />
}<br />
<br />
== Weitere Hinweise ==<br />
* Entsprechend zu $EVENT gibt es auch noch $NAME und $TYPE. $NAME und $TYPE enthalten den Namen bzw. Typ des Ereignis auslösenden Gerätes.<br />
* Wird der Perl-Code in einem <code>notify</code> immer länger, lagere den Code wegen der Übersichtlichkeit in eine eigene Programmdatei aus, wie in [[99_myUtils anlegen]] beschrieben.<br />
* Achtung! Wenn man das Skript für den notify-Befehl über mehrere Zeilen schreibt, muss man anscheinend darauf achten, dass keine abschließende Leerzeile mitgespeichert wird. Sonst wird der notify-Befehl ignoriert.<br />
* Dieser {{Link2Forum|Topic=38520|Message=307325}} enthält Vorschläge zur Vorgehensweise bei der Erstellung von komplexen ''notify'' Definitionen bzw. bei deren Fehlerbehebung.<br />
<br />
== Weiterführende Links ==<br />
* [[Escapen in Perlbefehlen]]<br />
* [[Klammerebenen]]<br />
* Forenbeitrag zum Thema {{Link2Forum|Topic=115414|LinkText=Optimierung des Suchmusters - NOTIFYDEV}}<br />
<br />
== Hinweise ==<br />
<references /><br />
<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:Hilfsmodul]]</div>Otto123http://wiki.fhem.de/w/index.php?title=Notify&diff=37092Notify2022-01-12T19:13:59Z<p>Otto123: /* notify Syntax */ Zeilenenden eingefügt (Raw DEF)</p>
<hr />
<div>{{SEITENTITEL:notify}}<br />
{{Infobox Modul<br />
|ModPurpose=Ausführung von Anweisung(en) als Reaktion auf Ereignisse<br />
|ModType=h<br />
|ModCmdRef=notify<br />
|ModForumArea=Automatisierung<br />
|ModTechName=91_notify.pm<br />
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])<br />
}}<br />
<br />
== Einführung ==<br />
{{Hinweis|Weitere grundlegende Informationen/Beispiele zu notify enthält [http://fhem.de/Heimautomatisierung-mit-fhem.pdf Heimautomatisierung mit FHEM]}}<br />
Das Hilfsmodul notify dient dazu [[Ereignis|Ereignisse]] über ein Suchmuster zu erkennen und bei einem Treffer eine Aktion auszulösen. Mit ''notify'' und anderen [[Eventhandler|Eventhandlern]] <ref>hierzu gehören u.a. auch [[DOIF]], [[THRESHOLD]] und [[watchdog]]</ref> ist es möglich, Logikfunktionen im FHEM abzubilden.<br />
<br />
'''Beispiele:''' <br />
* Wird das Licht in der Küche eingeschaltet, soll FHEM dort auch das Radio einschalten. <br />
* Bei Druck auf einen Taster soll die Umwälzpumpe für das Warmwasser eingeschaltet werden. <br />
* Erweiterte Möglichkeiten: Aber nur, wenn das Radio aus ist bzw. die Temperatur im Rücklauf des Warmwassers unterhalb einer bestimmten Schwelle liegt<ref>vgl. hierzu z.B. {{Link2CmdRef|Anker=devspec|Label=FILTER}} und [[if-condition]]</ref>.<br />
<br />
== Syntax ==<br />
<br />
define <name> notify <Suchmuster> <command> <br />
<br />
Das ''[[Regulärer Ausdruck|Suchmuster]]'' (häufig als Regexp = regular expression = regulärer Ausdruck bezeichnet) ist sehr wichtig: Es ist entweder der Name des auslösenden ("triggernden") Gerätes oder die Kombination aus Gerät und auslösendem Ereignis (Event) <code>Gerätename:Event</code>. Die Events kann man dem [[Event_monitor|Event-Monitor]] entnehmen. Wenn dort z.B. <code>Rollo1</code> steht, dann reagiert ''notify'' auf <code>Rollo1 on</code> und <code>Rollo1 off</code> usw.<br />
<br />
Wenn man mehrere Suchmuster kombinieren möchte, kann man diese in Klammer schreiben, als Trenner wird dann Pipe (|) genutzt: <code>(Rollo1|Rollo2|Steckdose5)</code>.<br />
<br />
'''Auch die Verwendung von Platzhaltern ist möglich''':<br />
* <code>Rollo.</code> → das notify reagiert auf alles was mit Rollo und '''einem''' weiteren beliebigen Zeichen anfängt. Also auf Rollo1 wie auch auf RolloG, aber nicht auf Rollo_wischundweg<br />
* <code>Rollo.*</code> → notify reagiert auf alles das mit Rollo beginnt<br />
* <code>.*isch</code> → auf alles das mit isch aufhört (Tisch, Fisch)<br />
* <code>Schalter(1|2|3)</code> → hört auf Schalter1, Schalter2 und Schalter3<br />
* <code>dimmer:pct:.(100|7[6-9]|[89][0-9])</code> → reagiert, wenn pct einen Wert über 75 annimmt.<br />
<br />
Suchmuster/Regex kann man im Internet beispielsweise auf [http://regexpal.com/| http://regexpal.com/] testen.<br />
<br />
Es gibt seit Juli 2020 eine Perlfunktion notifyRegexpCheck zum Testen, wie FHEM über das Suchmuster "denkt" - siehe {{Link2Forum|Topic=111938|Message=1074202|LinkText=diesen Beitrag}} im Forum.<br />
<br />
{{Hinweis|Das '''Suchmuster''' wird notify-intern um das Zeichen ^ (beginnt mit) und das Zeichen $ (endet mit) ergänzt<ref>Der Eventhandler [[DOIF]] verwendet die in Perl übliche Syntax für reguläre Ausdrücke als DOIF-Suchmuster.</ref>.<br />
<br />
Deshalb darf das Suchmuster nicht mit einem üblichen [[Regulärer Ausdruck|'''Regulären Ausdruck''']], wie er in Perl<ref>https://perldoc.perl.org/perlre.html</ref> verwendet wird, gleichgesetzt werden, da die Ergänzung zu einem grundsätzlich unterschiedlichen Verhalten führt, siehe nachstehendes Beispiel.}}<br />
<br />
'''Beispiel für das unterschiedliche Verhalten von ''Suchmuster'' und ''regulären Ausdruck'''''<br />
<br />
Für einen '''regulären Audruck''' gilt: Wenn der reguläre Ausdruck ''lampe'' ist und das [[Ereignis]] ''tischlampe'' dann passen ''tischlampe'' und ''lampe'' zueinander.<br />
<br />
Für das '''Suchmuster''' gilt: Wenn das Suchmuster ''lampe'' ist und das [[Ereignis]] ''tischlampe'' dann passen ''tischlampe'' und ''lampe'' '''nicht''' zueinander, weil das Suchmuster zu ^lampe$ ergänzt wird und damit exakt nur auf ''lampe'' matcht (passt).<br />
<br />
'''Variablen Zuordnung zum Event'''<br />
<br />
'''Beispiel 1'''<br />
<br />
2020-01-21 22:40:39 HUEDevice VibrationTest1 battery: 88<br />
{| class="wikitable"<br />
|-<br />
! !!$NAME !! colspan="2" |$EVENT<br />
|-<br />
| ||||$EVTPART0 ||$EVTPART1<br />
|-<br />
|2020-01-21 22:40:39 HUEDevice|| VibrationTest1|| battery:|| 88<br />
|}<br />
<br />
<br />
'''Beispiel 2'''<br />
2021-05-09 19:11:43 FB_CALLMONITOR cm_example external_name: Graf Herzog von und zu ...<br />
{| class="wikitable"<br />
|-<br />
! !!$NAME !! colspan="7" |$EVENT<br />
|-<br />
| ||||$EVTPART0 ||$EVTPART1 || $EVTPART2|| $EVTPART3 || $EVTPART4|| $EVTPART5|| ...<br />
|-<br />
|2021-05-09 19:11:43 FB_CALLMONITOR|| cm_example|| external_name:|| Graf|| Herzog|| von|| und|| zu|| ...<br />
|}<br />
<br />
== FHEMWEB-unterstütztes Anlegen eines notify ==<br />
{{Hinweis|Die Erstellung eines notify und insbesondere die korrekte Angabe des Suchmusters (Regex) führt gerade bei Einsteigern immer wieder zu Schwierigkeiten. Zur Fehlerminimierung empfiehlt es sich zum einen, die [[Konfiguration]] nicht direkt zu bearbeiten, sondern die "Befehl-Eingabezeile", die "Objektdetails" oder den [[Import von Code Snippets|Import von RAW-Definitionen]] zur Bearbeitung zu nutzen.}}<br />
<br />
=== Event Monitor ===<br />
Die komfortabelste Möglichkeit, die häufigsten Event-Handler zu erstellen, bietet der [[Event monitor|Event-Monitor]]. Die Vorgehensweis ist in dem zugehörigen Artikel dargestellt.<br />
<br />
=== Regexp wizard ===<br />
Zudem enthält FHEM einen Regexp wizard mit dem Regex anhand der in FHEM vorhandenen Devices und deren Events aus einer Auswahlbox selektiert werden können. Voraussetzungen sind:<br />
* Aktivierung des Hilfsmoduls [[eventTypes]] (bei allen Neuinstallationen Standard) <br />
* das gesuchte Ereignis (Event) ist nach Aktivierung des Hilfsmoduls bereits mindestens einmal eingetreten<br />
<br />
Schrittweise Darstellung der Nutzung des Regexp wizard zur Anlage eines "notify":<br />
<br />
In das [[Konfiguration#Befehl-Eingabefeld|Befehls-Eingabefeld]] eingeben und mit {{Taste|Enter}} bestätigen:<br />
define ntest notify a b<br />
Als Beispiel wird ein notify mit <name> "ntest" angelegt. "a" und "b" sind beliebige Platzhalter für <Suchmuster> und <Command>, die bei der weiteren Bearbeitung mit dem endgültigen Werten ersetzt werden.<br />
Der Regexp wizard öffnet sich:<br />
[[Datei:Regexp wizard1.JPG|400px|thumb|center]]<br />
Nun in der Auswahlbox das auslösende Event (Ereignis) auswählen; zunächst das Device und dann das gewünschte Regex. Hier soll das notify bei jeder Veränderung der Temperatur (temperature.*) des Device BTHR918N reagieren. Abschließend mit einem Mausklick auf {{Taste|set}} bestätigen. Wählt man mehrere Regex in dieser Weise aus, so wird das "notify" bei Eintritt jedes dieser Events ausgeführt:<br />
[[Datei:Regexp wizard2.JPG|400px|thumb|center]]<br />
Anschließend den Platzhalter "a" mit Klick auf den Link "removeRegexpPart" löschen:<br />
[[Datei:Regexp wizard3.JPG|400px|thumb|center]]<br />
Den Link "DEF" anklicken, damit sich der DEF-Editor öffnet:<br />
[[Datei:Regexp wizard4.JPG|400px|thumb|center]]<br />
Jetzt den auszuführenden Befehl im "DEF"-Bereich durch Überschreiben des Platzhalters "b" eintragen und mit Klick auf {{Taste|modify ntest}} abschließen:<br />
[[Datei:Regexp wizard5.JPG|400px|thumb|center]]<br />
Das fertige und sofort aktive "notify" sieht abschließend folgendermaßen aus:<br />
[[Datei:Regexp wizard6.JPG|400px|thumb|center]]<br />
Am Schluss das Speichern über {{Taste|Save config}} nicht vergessen.<br />
<br />
== Mein notify geht nicht - wie kann ich mir selbst helfen: Debugging ==<br />
Funktioniert ein notify nicht wie gewünscht, kann es nur zwei Hauptursachen haben: <br />
* Entweder das Suchmuster paßt nicht zum gewünschten Auslöser (FHEM Device), und/oder<br />
* die Anweisung enthält einen Fehler. <br />
Sollte kein Fehler im Logfile auftauchen aber das notify ausgelöst werden, stimmt meist der Übertragungsweg zum Zieldevice nicht.<br />
Der STATE des notify zeigt normalerweise mit Datum/Uhrzeit die letzte Auslösung an.<br />
<br />
Beim Debuggen sollte man daher beide Elemente getrennt untersuchen. Hier ein Beispiel welches nicht wie gewünscht funktioniert:<br />
<syntaxhighlight lang="perl"> define n_test notify n_test:muster Ausführungsteil</syntaxhighlight><br />
Zum debuggen benötigen wir <br />
* den [[Event monitor]]<br />
* das [https://fhem.de/commandref.html#trigger trigger-Kommando] - kann man jederzeit verwenden um das Suchmuster als Event unabhängig vom Auslöser zu erzeugen.<br />
* die FHEM Kommandozeile<br />
* den [[DEF-Editor]]<br />
* eventuell einen Texteditor um Codeblöcke zwischen zu lagern und Notizen zu machen.<br />
<br />
Das Suchmuster im Beispiel notify triggert auf sich selbst, es soll auf jeden Event mit dem Inhalt '''muster''' ausgelöst werden, Beispiel:<br />
2018-07-14 14:31:03 notify n_test muster bild<br />
<br />
=== Suchmuster ===<br />
Sollte das notify nicht funktionieren:<br />
* keine Reaktion wie gewünscht<br />
* keine Fehlermeldung in der Weboberfläche beim Anlegen, keine Fehlermeldung im Logfile<br />
* STATE ist unverändert auf active oder einem altem Datum/Uhrzeit<br />
liegt der Fehler mit Sicherheit im Suchmuster. Man hat die Chance das Suchmuster mit dem trigger Befehl zu erzeugen und zu schauen ob die Anweisung ausgeführt wird. Dabei ist zu beachten: Der erste ":" im Suchmuster ist zusätzlich zwischen Gerät und Event als Trennung. Jeder weiter : ist, wenn vorhanden, Bestandteil des Events! Siehe dazu den Abschnitt [https://fhem.de/commandref_DE.html#notify Hinweise in der commandref]<br />
*Im Beispiel: Event: n_test muster -> Suchmuster n_test:muster<br />
Um aus dem [[Event]] ein passendes Suchmuster zu erzeugen kann der [[Event monitor|Event-Monitor]] direkt verwendet werden. Man kann ein neues notify erzeugen oder ein Bestehendes modifizieren lassen.<br />
<br />
Unser Regex im Beispiel ist zu spezifisch, es triggert nur exakt auf '''muster'''. Dieser Trigger erzeugt den folgenden Eintrag im Eventmonitor, entspricht exakt dem Suchmuster und löst das notify aus:<br />
trigger n_test muster<br />
2018-07-13 11:52:08 notify n_test muster<br />
Das Suchmuster für unsere Anforderung muss in <code>n_test:muster.*</code> geändert werden, damit jeder Event der mit muster beginnt das notify auslöst.<br />
Der . im Regex steht für jedes beliebige Zeichen und der * für eine beliebige Anzahl des Zeichens davor: also beliebig viele beliebige Zeichen nach muster.<br />
<br />
Das Suchmuster wird häufig in ein komplizierteres Regex umgewandelt um im notify mehrere Aktionen zu starten. Das eigene Regex kann z.B. mit http://regexpal.com/ oder https://regex101.com/ getestet werden.<br />
<br />
Funktioniert der Auslöser, das notify tut aber noch nicht was es soll, müssen wir die Anweisung untersuchen. In unserem korrigierten Beispiel<br />
<syntaxhighlight lang="perl"> defmod n_test notify n_test:muster.* Ausführungsteil</syntaxhighlight><br />
folgt beim Kommando <code>trigger n_test muster bild</code> ein Eintrag im Log:<br />
2018.07.13 11:47:57 3: n_test return value: Unknown command Ausführungsteil, try help.<br />
Das notify wurde zwar getriggert aber die Anweisung war nicht ausführbar. <br />
<br />
Ein richtiges Suchmuster und eine fehlerhafte Anweisung wird also normalerweise einen Fehlereintrag im Logfile erzeugen!<br />
<br />
=== Spezialfall: notify löst zwar aus - aber zu oft ===<br />
In dem Fall ist das Suchmuster (regExp) zu unscharf oder das triggernde Gerät löst das Event zu oft aus. Das regExp sollte so genau wie möglich konstruiert werden, device:.* ist eine einfache aber oft keine gute Wahl!<br />
<br />
Im Device, welches den Event auslöst, kann mit den Attributen event-on-.* die Häufigkeit gesteuert werden. Insbesondere ist hier das regExp .* eine Art Standardwahl um aufeinanderfolgende gleichartige Events zu verhindern.<br />
:<code>attr device event-on-change-reading .*</code><br />
'''Achtung''': durch falsche Angaben kann man Events ganz leicht völlig verhindern!<br />
<br />
Siehe auch [[event-on-change-reading]]<br />
<br />
=== Anweisung ===<br />
Wird das notify getriggert oder will man ganz schnell mal ein notify testen, kann man die Anweisung durch folgenden Code ersetzen, man öffnet also einfach nur die DEF, kopiert den ursprünglichen Inhalt an einen sicheren Ort und ersetzt die Anweisung durch eine der beiden Zeilen. Die erste Zeile kann man auch einfach mal in der Kommandozeile testen:<br />
<syntaxhighlight lang="perl">{Log 1, "Das Notify n_test hat ausgeloest."}<br />
{Log 1, "Das Device $NAME hat ausgeloest, der Event sah so aus: $EVENT"}</syntaxhighlight><br />
Wird das notify ausgelöst, muss anschließend im Logfile ein Eintrag zu finden sein:<br />
2018.07.13 10:28:57 1: Das Notify n_test hat ausgeloest, der Event sah so aus: muster<br />
Unsere Anweisung <code>Ausführungsteil</code> liefert in der Kommandozeile selbst einen Fehler:<br />
<code>Unknown command Ausführungsteil, try help.</code><br />
Ein Versuch mit geschweiften Klammern <code>{Ausführungsteil}</code> liefert wieder einen Fehler:<br />
<code>Unrecognized character \xC3; marked by <-- HERE after {Ausf<-- HERE near column 6 at (eval 5977) line 1.</code><br />
Diese Variante <code>{"Ausführungsteil"}</code> liefert den String Ausführungsteil ohne Fehler: Das notify arbeitet fehler- aber sinnfrei.<br />
Der fertige Code:<br />
defmod n_test notify n_test:muster.* {"Ausführungsteil"}<br />
<br />
Man kann die Anweisung, normalerweise so wie sie ist, in der FHEM Kommandozeile testen. Sind im Perl Code (in geschweiften Klammern) im DEF Editor Semikolon enthalten muss man diese für den Test in der Kommandozeile (oder Raw Def) verdoppeln.<br />
Laufzeitabhängige Variablen sind in der Kommandozeile meist nicht verfügbar, diese sollte man für den Test einfach durch passende Inhalte austauschen. So kann man die komfortable Variante (loggt den Namen und das komplette Event) nicht in der Kommandozeile ausführen. <br />
<br />
Funktioniert ein FHEM Befehl in der Kommandozeile nicht (z.B. Lampe geht nicht an) kann es im notify auch nicht funktionieren, dann muss die Fehlersuche an anderer Stelle fortgeführt werden. <br />
<br />
Komplexeren Code im Ausführungsteil sollte man beim Testen in Teilabschnitte aufteilen, von der Laufzeit abhängige Variable ($NAME, $EVENT, $EVTPART) durch Strings ("TestWort") ersetzen, die Teilabschnitte separat testen und anschließend schrittweise wieder komplettieren.<br />
<br />
== Beispiele ==<br />
{{Hinweis|Für die nachfolgenden Beispiele wurden einige unterschiedliche Technologien verwendet. Sie können aber recht einfach auf alle anderen Systeme übertragen werden, dabei sollte ggf. darauf geachtet werden, dass sich Schaltbefehle und Events teilweise je nach konkret eingesetzter Technologie unterscheiden können. Dann ist ggf. eine Erweiterung, z.B. durch eine [[if-condition|if-Abfrage]] erforderlich.}}<br />
<br />
=== Schalter entprellen ===<br />
Will man ein notify innerhalb eines bestimmten Zeitraumes nur einmal auslösen lassen, auch wenn er in diesem Zeitraum mehrfach getriggered werden sollte, so bietet sich das Attribut disabledAfterTrigger an,<br />
attr <notify_device> disabledAfterTrigger <Anzahl Sekunden><br />
In dem Zeitraum wird dann nur einmal (beim ersten Mal) der Befehl ausgelöst, auch wenn mehrfach getriggered wurde. Der Zeitraum kann Bruchteile von Sekunden umfassen.<br />
<br />
=== Etwas schalten, wenn ein anderes Gerät geschaltet wird ===<br />
<br />
==== Vorbedingungen ====<br />
Dieses Beispiel verwendet eine einfache InterTechno-kompatible Funksteckdose für das Radio und einen HM-Aktor für das Licht:<br />
<br />
define RadioKueche IT 000000FFFF 0F F0<br />
define LichtKueche CUL_HM 3A37D6<br />
Beachte: beide kennen als Event bzw. Schaltbefehle ''on'' und ''off''.<br />
<br />
==== notify Befehl ====<br />
define LichtamRadioan notify LichtKueche set RadioKueche $EVENT <br />
oder alternativ: <br />
define LichtamRadioan notify LichtKueche { fhem "set RadioKueche $EVENT" }<br />
<br />
<br />
==== Erklärung ====<br />
* Der Name des ''notify'' "LichtamRadioan" kann frei gewählt werden, er dient nur dazu, das notify in FHEM eindeutig zu identifizieren.<br />
* "$EVENT" ist ein Platzhalter für den Zustand vom Pattern. $EVENT enthält ein "off" wenn das LichtKueche aus- und ein "on" wenn das Licht eingeschaltet wird.<br />
* "{ &lt;perlcode&gt; }" alles was zwischen {} steht ist Perl code. Perl kennt das Schlüsselwort fhem. Das Schlüsselwort FHEM dient dazu, FHEM Befehle auszuführen. Es wird also der FHEM Befehl "set RadioKueche on/off" ausgeführt. on oder off ist abhängig vom Pattern. Der eigentliche FHEM Befehl muss in " " stehen.<br />
* Wann ist ein Wechsel auf die Perl-Ebene erforderlich? <br />
** einfache FHEM-Befehle sollten in der Regel direkt verwendet werden, dies ist ressourcenschonender.<br />
** Immer dann, wenn dies nicht möglich ist, weil z.B. komplexerer Code ausgeführt werden soll, (blockierende) Prozesse ausgelagert werden sollten oder Systembefehle ausgeführt werden, ist es günstiger, auf die Perl-Ebene zu wechseln <ref>In diesem {{Link2Forum|Topic=88398|Message=808685|LinkText=Forenbeitrag}} wird z.B. erläutert, wie man nichtblockierend externe Scripte aufrufen kann, die dann ihre Ergebnisse wieder an FHEM übergeben.</ref>. <br />
<br />
=== Einschalten von mehreren Geräten/Lampen, wenn das Licht eingeschaltet wird ===<br />
Dieses Beispiel verwendet einen HM-Aktor für das Licht sowie zwei Milight-Birnen, die einzeln geschaltet werden sollen<ref>Dies ist ausdrücklich keine Empfehlung für diese Technologie und der Module</ref> in den Stehlampen:<br />
<br />
==== Vorbedingungen ====<br />
FHEM:<br />
define LichtWZ CUL_HM 3A37D8<br />
define Stehlampe1 MilightDevice RGBW Milight_Wohnzimmer 5<br />
define Stehlampe2 MilightDevice RGBW Milight_Wohnzimmer 6<br />
<br />
==== notify Befehl ====<br />
define SteckdoseWZein notify LichtWZ set Stehlampe1,Stehlampe2 $EVENT<br />
oder ''in Perl''<br />
define SteckdoseWZein notify LichtWZ { fhem "set Stehlampe1 $EVENT;;set Stehlampe2 $EVENT " } <br />
==== Erklärung ====<br />
Wenn das LichtWZ eingeschaltet wird, dann werden auch die Stehlampen (1 und 2) eingeschaltet.<br />
<br />
=== Einfache ODER Funktion ===<br />
Eine einfache ODER Funktion kann sehr einfach realisiert werden<br />
<br />
==== Vorbereitung ====<br />
KNX:<br />
* 3x GAs der abzufragende Werte (0/0/40 0/0/41 0/0/42)<br />
<br />
FHEM:<br />
define Licht1 CUL_HM 3A37D8<br />
define Licht2 CUL_HM 1B7EC3<br />
define Stehlampe MilightDevice RGBW Milight_Wohnzimmer 7<br />
<br />
==== notify Befehl ====<br />
define SteckdoseWZein notify (Licht1|Licht2) set Stehlampe $EVENT <br />
oder<br />
define SteckdoseWZein notify (Licht.) set Stehlampe $EVENT<br />
<br />
==== Erklärung ====<br />
Die Werte in der Klammer (wichtig ist das »|«) sind die Rückgabewerte. Alternativ kann in diesem Beispiel auch »Licht.« (zu beachten ist der Punkt) geschrieben werden. Der Punkt ist ein Platzhalter für (genau) ein beliebiges Zeichen.<br />
<br />
Danach folgt der set Befehl.<br />
Wenn also das Licht1 oder Licht2 den Wert "on" hat, dann hat auch die Steckdose den Wert "on"<br />
<br />
Alternative: [[structure]]<br />
<br />
=== Einfache UND Funktion ===<br />
Ob man dieses Konstrukt noch als einfach bezeichnen kann, wage ich mal zu bezweifeln. In FHEM fehlen Loggingfunktionen, die man alle selber mit Perl Code erstellen kann (Danke an MAZ).<br />
Dadurch ist FHEM zwar mächtig, wird aber für viele sehr kompliziert.<br />
<br />
In diesem Beispiel soll - wenn drei Rollos geschlossen sind - am Taster eine LED eingeschaltet werden.<br />
<br />
==== Vorbereitung ====<br />
KNX:<br />
* 3x GDs für die Rückgabewert Rollo geschlossen == 1 (0/0/50 0/0/51 0/0/52)<br />
* GD LED am Lichtschalter (0/0/106)<br />
<br />
FHEM:<br />
define R1ZU KNX 0/0/50:dpt1.009<br />
attr R1ZU dummy 1<br />
define R2ZU KNX 0/0/51:dpt1.009<br />
attr R2ZU dummy 1<br />
define R3ZU KNX 0/0/52:dpt1.009<br />
attr R3ZU dummy 1<br />
define LEDalleRolloZu KNX 0/0/106:dpt1<br />
Durch das Attribut dummy werden keine Schaltfunktion angeboten. Es kann nur Werte anzeigen.<br />
<br />
==== notify Befehl ====<br />
define nt.allerolloszu notify (R1ZU|R2ZU|R3ZU) {<br />
my $r1 = Value("R1ZU");;<br />
my $r2 = Value("R2ZU");;<br />
my $r3 = Value("R3ZU");;<br />
if ($r1 eq "on" &amp;&amp; $r2 eq "on" &amp;&amp; $r3 eq "on") {<br />
fhem("set LEDalleRolloZu on");;<br />
} else {<br />
fhem("set LEDalleRolloZu off");;<br />
}<br />
}<br />
<br />
==== Erklärung ====<br />
Es werden die drei Rückgabewerte R1ZU, R2ZU und R3ZU ausgewertet. Danach folgt Perl Code, deswegen beginnt das ganze mit einer { und endet mit }<br />
<br />
my $r1 =&gt; Variable $r1 definieren<br />
= Value("R1ZU");; ==&gt; weist den Rückgabewert (on oder off) von R1ZU der Variable $r1 zu <br />
<br />
Der doppelte ;; ist ein FHEM Thema. Eigentlich würde für Perl ein ; reichen. Aber FHEM nutzt selbst das ; und daher wird ein ;; benötigt. Mit den ersten drei my Zeilen werden die Rückgabewerte den Variablen zugewiesen.<br />
<br />
Danach erfolgt ein normales "if then else" Konstrukt. Die Zeile »($r1 eq "on" &amp;&amp; $r2 eq "on" &amp;&amp; $r3 eq "on")«&#160;kann man so lesen: Wenn $r1 den Wert "on" und (&amp;&amp;) $r2 den Wert "on" und $r3 den Wert "on" dann schalte die LEDalleRolloZu ein {fhem("set LEDalleRolloZu on")}<br />
ansonsten else schalte die LED aus. {fhem("set LEDalleRolloZu off")<br />
<br />
Alternative: [[structure]]<br />
<br />
=== Zeitverzögert schalten ===<br />
{| class="wikitable"<br />
| '''Aufgabe:''' || Zeitverzögert schalten<br />
|- <br />
| '''Beschreibung:''' || Mit einem Notify zeitverzögert eine Aktion auslösen.<br />
|- <br />
| '''Vorbereitung:''' || Gerät "Lampe" ist definiert und es gibt eine Situation, die ein Ereignis "Fernbedienung:.*" generiert.<br />
|-<br />
| '''Befehl:''' || <code>define ntfy1 notify Fernbedienung:.* sleep 7.5;; set Lampe $EVENT</code><br />
|-<br />
| '''Erläuterungen:''' || Bei Eintreten eines Ereignisses "Fernbedienung*" wird nach einer Pause von siebeneinhalb Sekunden der Befehl <set Lampe ??> ausgeführt, wobei der eigentliche Befehl aus dem auslösenden Ereignis übernommen wird.<br />
:''Quelle: {{Link2Forum|Topic=17161|LinkText=FHEM Forum}}''<br />
|}<br />
<br />
=== Eine PV-Anlage (Solarstrom) zur Steuerung der Rollos nutzen (optional Zeit und Datums abhängig) ===<br />
Hier ein kleines Beispiel, wie man mit Hilfe einer PV-Anlage die Sonneneinstrahlung auf der Südseite ermittelt und dies zur Rolladensteuerung nutzt.<br />
Optional: Die Funktion soll allerdings nur zwischen 9:30 und 17:00 stattfinden. (zweites Beispiel)<br />
Optional: Die Funktion soll nur zwischen dem 6. und 9. Monat funktioneren. (drittes Beispiel)<br />
<br />
==== Vorbereitung ====<br />
PV Anlage mit SolarView abfragen.<br />
Per Hand ermitteln, ab wieviel erzeugtem Strom es sinnvoll ist die Rollos zu schließen.<br />
<br />
==== notify Syntax ====<br />
FHEM:<br />
<br />
define sv SolarView solarview 15000 wr1 wr2 wr3 wr4 <----vier Wechselrichter<br />
attr sv event-on-change-reading currentPower <br />
<br />
define nt.sonnenlichtpersolar notify (sv:currentPower.*) { <br />
if ($EVTPART1 &lt; 3000 ) {<br />
fhem('set Flur1 Auf');<br />
}else {<br />
if ($EVTPART1 &gt; 5000 ) {<br />
fhem('set Flur1 Ab');<br />
} <br />
}<br />
}<br />
<br />
Optional 1: Zeitabhängig<br />
<syntaxhighlight lang="Perl"><br />
(sv:currentPower.*) { <br />
my $hm = sprintf("%02d:%02d", $hour, $min);<br />
if ( $hm gt "09:30" && $hm lt "17:00") { <br />
if ($EVTPART1 < 5000 ) {<br />
fhem('set Flur1 Auf');<br />
}else {<br />
if ($EVTPART1 > 8000 ) {<br />
fhem('set Flur1 Ab');<br />
} <br />
}<br />
}<br />
}<br />
</syntaxhighlight><br />
Optional 2: Zeit und Datum<br />
<syntaxhighlight lang="Perl"><br />
(sv:currentPower.*) { <br />
my $hm = sprintf("%02d:%02d", $hour, $min);<br />
if ($month >= 6 && $month <= 9) {<br />
if ( $hm gt "09:30" && $hm lt "17:00") { <br />
if ($EVTPART1 < 5000 ) {<br />
fhem('set Flur1,RBUERO1,RBUERO2 Auf');<br />
}else {<br />
if ($EVTPART1 > 8000 ) {<br />
fhem('set Flur1,Flur2,RBUERO1,RBUERO2 Ab');<br />
} <br />
}<br />
}<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
==== Erklärung ====<br />
* Das define wird in der Kommandozeile im Webbrowser eingegeben.<br />
* Anschließend wird im Webbrowser die DEF bearbeitet, das erspart uns Probleme mit Perl<br />
* define sv SolarView ... <==== ist die Schnittstelle vom SolarView<br />
* define nt.sonnenlichtpersolar notify (sv:currentPower.*) { <==== hier wird ein notify angelegt, der auf das "define sv" Wert "currentPower.*" (.* ist irgendwas) reagiert<br />
if ($EVTPART1 &lt; 3000 ) {<br />
fhem('set Flur1 Auf');<br />
}else {<br />
if ($EVTPART1 &gt; 5000 ) {<br />
fhem('set Flur1 Ab');<br />
} <br />
}<br />
}<br />
Diese if-Funktion wertet den Rückgabewert von currentPower aus. Hierbei muss man wissen, dass $EVTPART1 das Split-Ergebnis vom Rückgabewert ist<br />
<br />
Beispiel: Der Rückgabewert (wie im Beispiel) ist "currentPower: 6000".<br />
Jetzt steht im "$EVTPART0 == currentPower:" und im "$EVTPART1 == 6000"<br />
Das bedeutet, dass man sich nicht selbst den richtigen split (Perl Befehl) Aufruf ausdenken muss, dies übernimmt vielmehr FHEM.<br />
<br />
Ergebnis: <br />
Das Rollo wird abhängig von der erzeugten IST_Strommenge auf und zu gefahren.<br />
Damit dies nicht dauernd hin und her pendelt, wurde der Auf Wert sehr klein und den Ab Wert sehr groß gewählt.<br />
<br />
'''Optional 1:''' Der Block "my $hm = sprintf("%02d:%02d", $hour, $min);" erzeugt die String-Variable $hm mit dem Inhalt $hour:$min. %02d begrenzt die Ausgabe auf zwei Stellen.<br />
Danach wird mit "if ( $hm gt "09:30" && $hm lt "17:00")" mit stringvergleichenden Operatoren geprüft, ob die Uhrzeit zwischen 9:30 und 17:00 liegt (lt = kleiner als; gt = größer als). Es wäre auch ein le und ge möglich: le = kleiner/gleich als, ge = größer/gleich als.<br />
<br />
'''Optional 2:'''if( $month >= 6 && $month <= 9) {<br />
<br />
Hier wird die numerische FHEM-Standard-Variable $month (Monat) auf größer/gleich bzw kleiner/gleich mit den binären Operatoren überprüft.<br />
Die Funktion arbeitet also nur zwischen dem 6. und dem 9. Monat und dann auch nur zwischen 9:31 und 16:59.<br />
<br />
=== Status eines Kippfensters mit 2 Fensterkontakten abbilden ===<br />
<br />
==== Vorbereitung ====<br />
Es ist je ein Fensterkontakt der ''open'' oder ''closed'' meldet, oben und unten am Fenster angebracht.<br />
Die Namen der beiden FHEM-Devices sind ''fensterKontaktOben'' und ''fensterKontaktUnten''.<br />
<br />
==== notify Syntax ====<br />
FHEM:<br />
define statusFenster notify fensterKontakt(Oben|Unten):(open|closed) {\<br />
if ( ReadingsVal('fensterKontaktOben', 'state', 'undef') eq 'open' && ReadingsVal('fensterKontaktUnten', 'state', 'undef') eq 'open')\<br />
{ fhem 'set Terrassentuer open' }\<br />
if ( ReadingsVal('fensterKontaktOben', 'state', 'undef') eq 'closed' && ReadingsVal('fensterKontaktUnten', 'state', 'undef') eq 'closed')\<br />
{ fhem 'set Terrassentuer closed' }\<br />
if ( ReadingsVal('fensterKontaktOben', 'state', 'undef') eq 'open' && ReadingsVal('fensterKontaktUnten', 'state', 'undef') eq 'closed')\<br />
{ fhem 'set Terrassentuer tilted' }\<br />
if ( ReadingsVal('fensterKontaktOben', 'state', 'undef') eq 'closed' && ReadingsVal('fensterKontaktUnten', 'state', 'undef') eq 'open')\<br />
{ fhem 'set Terrassentuer undef' }\<br />
}<br />
<br />
== Weitere Hinweise ==<br />
* Entsprechend zu $EVENT gibt es auch noch $NAME und $TYPE. $NAME und $TYPE enthalten den Namen bzw. Typ des Ereignis auslösenden Gerätes.<br />
* Wird der Perl-Code in einem <code>notify</code> immer länger, lagere den Code wegen der Übersichtlichkeit in eine eigene Programmdatei aus, wie in [[99_myUtils anlegen]] beschrieben.<br />
* Achtung! Wenn man das Skript für den notify-Befehl über mehrere Zeilen schreibt, muss man anscheinend darauf achten, dass keine abschließende Leerzeile mitgespeichert wird. Sonst wird der notify-Befehl ignoriert.<br />
* Dieser {{Link2Forum|Topic=38520|Message=307325}} enthält Vorschläge zur Vorgehensweise bei der Erstellung von komplexen ''notify'' Definitionen bzw. bei deren Fehlerbehebung.<br />
<br />
== Weiterführende Links ==<br />
* [[Escapen in Perlbefehlen]]<br />
* [[Klammerebenen]]<br />
* Forenbeitrag zum Thema {{Link2Forum|Topic=115414|LinkText=Optimierung des Suchmusters - NOTIFYDEV}}<br />
<br />
== Hinweise ==<br />
<references /><br />
<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:Hilfsmodul]]</div>Otto123http://wiki.fhem.de/w/index.php?title=Benutzer_Diskussion:Otto123&diff=36985Benutzer Diskussion:Otto1232022-01-05T18:17:10Z<p>Otto123: /* VCCU Setzen der IOgrp auf (fast) allen Devices mit einem einzigen Befehl */</p>
<hr />
<div>== Willkommen! ==<br />
{| width="100%" cellspacing="0" cellpadding="6" style="line-height: 20px; background: #E0E0E0; border: 2px solid #1874CD;"<br />
|-<br />
| colspan="4" style="background:#1874CD;" |<big><span style="color: #FAFAFA">'''Hallo Otto123,''' willkommen im FHEM Wiki!</span></big><br />
|-<br />
| colspan="4" | Danke für dein Interesse an unserem Projekt, ich freue mich schon auf deine weiteren Beiträge. Die folgenden Seiten sollten dir die ersten Schritte erleichtern, bitte nimm dir daher etwas Zeit, sie zu lesen.<br />
<br />
----<br />
'''FHEM-spezifische Informationen'''<br />
<br />
|-<br />
| width="8%" | &nbsp;<br />
| width="38%" | '''[[Systemübersicht]]'''<br />''FHEM Systemübersicht''<br />
| width="8%" | &nbsp;<br />
| width="38%" | '''[[FHEMWiki:Über FHEMWiki]]'''<br />''Informationen über dieses Wiki''<br />
<!-- Abschnitt auf Kommentar gesetzt<br />
|-<br />
| colspan="4" |<br />
----<br />
<br />
{{Todo|FHEM-spezifische Anleitungen und Regeln.}}<br />
<br />
---- <br />
Ende von 'Abschnitt auf Kommentar gesetzt' --><br />
|-<br />
| colspan="4" | <br />
----<br />
'''Generelle Informationen über (Media)Wikis'''<br />
|-<br />
| width="8%" | [[Datei:Crystal Clear app kedit.svg|rechts|30px|link=Hilfe:Bearbeiten]]<br />
| width="38%" | '''[[Hilfe:Bearbeiten]]'''<br />''Zugang zu allen wichtigen Informationen.''<br />
| width="8%" | [[Datei:X-office-presentation.svg|rechts|30px|link=Wikipedia:Tutorial]]<br />
| width="38%" | <!-- '''[[Wikipedia:Tutorial]]'''-->'''[http://de.wikipedia.org/wiki/Wikipedia:Tutorial Wikipedia:Tutorial]'''<br />''Schritt-für-Schritt-Anleitung für Einsteiger.''<br />
|-<br />
| [[Datei:Applications-system.svg|rechts|30px|link=Wikipedia:Grundprinzipien]]<br />
| '''<!--[[Wikipedia:Grundprinzipien]]-->[http://de.wikipedia.org/wiki/Wikipedia:Grundprinzipien Wikipedia:Grundprinzipien]'''<br />''Die grundlegende Philosophie unseres Projekts.''<br />
| [[Datei:MentorenProgrammLogo-7.svg|rechts|60px|link=Wikipedia:Mentorenprogramm]]<br />
| '''<!--[[Wikipedia:Mentorenprogramm]]-->[http://de.wikipedia.org/wiki/Wikipedia:Mentorenprogramm Wikipedia:Mentorenprogramm]'''<br />''Persönliche Einführung in die Beteiligung bei Wikipedia.''<br />
|-<br />
| colspan="4" |<br />
----<br />
Bitte beachte, [[Wikipedia:Was Wikipedia nicht ist|was Wikipedia nicht ist]], und "unterschreibe" deine Diskussionsbeiträge durch Eingabe von <code>--<nowiki>~~~~</nowiki></code> oder durch Drücken der Schaltfläche [[Datei:button_sig.png|Signaturknopf|20px|link=Hilfe:Signatur]] über dem Bearbeitungsfeld. Artikel werden jedoch nicht unterschrieben, und wofür die Zusammenfassungszeile da ist, erfährst du unter [[wikipedia:Hilfe:Zusammenfassung und Quellen|Hilfe:Zusammenfassung und Quellen]]. <br /><br /><br />
[[Datei:Nuvola apps ksirc.png|25px|link=Benutzer Diskussion:Ph1959de]] &nbsp;&nbsp; '''Hast du Fragen an mich?''' Schreib mir auf [[Benutzer Diskussion:Ph1959de|<u>meiner</u> Diskussionsseite]]! Viele Grüße, [[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 15:50, 31. Mär. 2015 (CEST)<br />
|}<br />
<br />
Lange nicht mehr so gelacht ;-). Du bist der Erste, dem anscheinend der tote Link nach einer gefühlten Ewigkeit aufgefallen ist. Herzlichen Glückwunsch, Aufnahmeprüfung mit höchster Auszeichnung bestanden. Gruß, [[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]])<br />
<br />
== Bearbeitungsleiste im Wiki-Editor wieder verfügbar ==<br />
<br />
Hallo Otto,<br /><br />
Arno hat am Wochenende wichtige Probleme aus dem Wikimedia-Update behoben. Die Bearbeitungsleiste im Wiki-Editor ist nun wieder verfügbar. Dein "Plain-Text-Problem" sollte damit zumindest abgeschwächt sein. Sollte es bei Dir noch Schwierigkeiten mit der Anzeige der Leiste geben, bitte melden; ist in "nur" 3 Browsern getestet.<br />
Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 05:40, 21. Apr. 2015 (CEST)<br />
<br />
== Event monitor in "[[Erste Schritte in FHEM]]" ==<br />
Hallo Otto,<br />
<br />
* gibt es einen Grund, warum Du die Änderung der Schreibweise nicht durchgängig im gesamten Artikel vorgenommen hast?<br />
* es wäre schön, Änderungen in der dt. Version auch gleich entsprechend in der [[First steps in FHEM|englischen Version]] mit vorzunehmen (habe ich gerade).<br />
<br />
Ach ja - und bezüglich der Verlinkung von Begriffen:<br />
<br />
Ich kenne das aus der WP so, dass immer nur das erste Auftreten des gleichen Lemmas im Artikel (maximal in jedem Abschnitt einmal) verlinkt wird. Sonst gibt es ja fast nur noch Links. ;-)<br />
<br />
[[Benutzer:Baumbuwe|Uwe ]] ([[Benutzer Diskussion:Baumbuwe|Diskussion]])<br />
: Hallo Uwe,<br />
: Ich diskutiere das gerade mit [[Benutzer_Diskussion:Krikan|Christian]], ich habe die Schreibweise eigentlich wegen dem Link geändert. Das mit den Links habe ich wieder zurück genommen, also nur den ersten. Ich wusste das nicht :) Ich gebe zu ich bin nicht so fit im Wiki, alles noch sehr am Anfang bei mir.--[[Benutzer:Otto123|Otto123]] ([[Benutzer Diskussion:Otto123|Diskussion]]) 17:11, 17. Aug. 2017 (CEST)<br />
<br />
:: Alles gut - das ist ein Wiki, also Learning by Looking around and Doing - [[Benutzer:Baumbuwe|Uwe ]] ([[Benutzer Diskussion:Baumbuwe|Diskussion]])<br />
<br />
== VCCU Setzen der IOgrp auf (fast) allen Devices mit einem einzigen Befehl ==<br />
<br />
Hallo, ich habe den "Befehl" <br><br />
<br />
attr TYPE=CUL_HM:FILTER=DEF=[0-9a-fA-F]{6}:FILTER=DEF!=[0]{6} IOgrp VCCU<br><br />
<br />
in fhemweb oben eingegeben und bekomme:<br><br />
<br />
vccu VCCU is no vccu with IOs assigned. It can't be used as IO<br><br />
<br />
vccu VCCU is no vccu with IOs assigned. It can't be used as IO<br><br />
<br />
vccu VCCU is no vccu with IOs assigned. It can't be used as IO<br><br />
<br />
...<br><br />
<br />
<br />
wohlgemerkt, ich denke mein IO ist definiert:<br />
<br />
<br />
define VCCU CUL_HM 141423<br><br />
<br />
setuuid VCCU 60a39bd5-f33f-e738-3f8e-8051aa3cf88fbd08<br><br />
<br />
'''attr VCCU IOList hmusb'''<br><br />
<br />
attr VCCU IOgrp VCCU<br><br />
<br />
attr VCCU model CCU-FHEM<br><br />
<br />
attr VCCU subType virtual<br><br />
<br />
attr VCCU webCmd virtual:update<br><br />
<br />
<br />
<br />
Ich bin mir auch nicht sicher, wo der Befehl <br />
attr TYPE=CUL_HM:FILTER=DEF=[0-9a-fA-F]{6}:FILTER=DEF!=[0]{6} IOgrp VCCU<br />
eingegeben werden soll. Und warum er die fhem.cfg ändert (nach save)?<br />
<br />
Vielleicht kann ich ja die wiki Seite um entsprechende Erklärungen ergänzen, wenn ich verstehe, was falsch läuft...<br />
<br />
<br />
--[[Benutzer:Nomo|Nomo]] ([[Benutzer Diskussion:Nomo|Diskussion]]) 00:14, 23. Dez. 2021 (CET)<br />
<br />
ich weiß irgendwie nicht wie man hier so ein Problem diskutieren kann, ich würde bitten die Frage im Forum zu stellen.--[[Benutzer:Otto123|Otto123]] ([[Benutzer Diskussion:Otto123|Diskussion]]) 19:17, 5. Jan. 2022 (CET)</div>Otto123http://wiki.fhem.de/w/index.php?title=Benutzer_Diskussion:Otto123&diff=36983Benutzer Diskussion:Otto1232022-01-05T18:15:38Z<p>Otto123: /* VCCU Setzen der IOgrp auf (fast) allen Devices mit einem einzigen Befehl */</p>
<hr />
<div>== Willkommen! ==<br />
{| width="100%" cellspacing="0" cellpadding="6" style="line-height: 20px; background: #E0E0E0; border: 2px solid #1874CD;"<br />
|-<br />
| colspan="4" style="background:#1874CD;" |<big><span style="color: #FAFAFA">'''Hallo Otto123,''' willkommen im FHEM Wiki!</span></big><br />
|-<br />
| colspan="4" | Danke für dein Interesse an unserem Projekt, ich freue mich schon auf deine weiteren Beiträge. Die folgenden Seiten sollten dir die ersten Schritte erleichtern, bitte nimm dir daher etwas Zeit, sie zu lesen.<br />
<br />
----<br />
'''FHEM-spezifische Informationen'''<br />
<br />
|-<br />
| width="8%" | &nbsp;<br />
| width="38%" | '''[[Systemübersicht]]'''<br />''FHEM Systemübersicht''<br />
| width="8%" | &nbsp;<br />
| width="38%" | '''[[FHEMWiki:Über FHEMWiki]]'''<br />''Informationen über dieses Wiki''<br />
<!-- Abschnitt auf Kommentar gesetzt<br />
|-<br />
| colspan="4" |<br />
----<br />
<br />
{{Todo|FHEM-spezifische Anleitungen und Regeln.}}<br />
<br />
---- <br />
Ende von 'Abschnitt auf Kommentar gesetzt' --><br />
|-<br />
| colspan="4" | <br />
----<br />
'''Generelle Informationen über (Media)Wikis'''<br />
|-<br />
| width="8%" | [[Datei:Crystal Clear app kedit.svg|rechts|30px|link=Hilfe:Bearbeiten]]<br />
| width="38%" | '''[[Hilfe:Bearbeiten]]'''<br />''Zugang zu allen wichtigen Informationen.''<br />
| width="8%" | [[Datei:X-office-presentation.svg|rechts|30px|link=Wikipedia:Tutorial]]<br />
| width="38%" | <!-- '''[[Wikipedia:Tutorial]]'''-->'''[http://de.wikipedia.org/wiki/Wikipedia:Tutorial Wikipedia:Tutorial]'''<br />''Schritt-für-Schritt-Anleitung für Einsteiger.''<br />
|-<br />
| [[Datei:Applications-system.svg|rechts|30px|link=Wikipedia:Grundprinzipien]]<br />
| '''<!--[[Wikipedia:Grundprinzipien]]-->[http://de.wikipedia.org/wiki/Wikipedia:Grundprinzipien Wikipedia:Grundprinzipien]'''<br />''Die grundlegende Philosophie unseres Projekts.''<br />
| [[Datei:MentorenProgrammLogo-7.svg|rechts|60px|link=Wikipedia:Mentorenprogramm]]<br />
| '''<!--[[Wikipedia:Mentorenprogramm]]-->[http://de.wikipedia.org/wiki/Wikipedia:Mentorenprogramm Wikipedia:Mentorenprogramm]'''<br />''Persönliche Einführung in die Beteiligung bei Wikipedia.''<br />
|-<br />
| colspan="4" |<br />
----<br />
Bitte beachte, [[Wikipedia:Was Wikipedia nicht ist|was Wikipedia nicht ist]], und "unterschreibe" deine Diskussionsbeiträge durch Eingabe von <code>--<nowiki>~~~~</nowiki></code> oder durch Drücken der Schaltfläche [[Datei:button_sig.png|Signaturknopf|20px|link=Hilfe:Signatur]] über dem Bearbeitungsfeld. Artikel werden jedoch nicht unterschrieben, und wofür die Zusammenfassungszeile da ist, erfährst du unter [[wikipedia:Hilfe:Zusammenfassung und Quellen|Hilfe:Zusammenfassung und Quellen]]. <br /><br /><br />
[[Datei:Nuvola apps ksirc.png|25px|link=Benutzer Diskussion:Ph1959de]] &nbsp;&nbsp; '''Hast du Fragen an mich?''' Schreib mir auf [[Benutzer Diskussion:Ph1959de|<u>meiner</u> Diskussionsseite]]! Viele Grüße, [[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 15:50, 31. Mär. 2015 (CEST)<br />
|}<br />
<br />
Lange nicht mehr so gelacht ;-). Du bist der Erste, dem anscheinend der tote Link nach einer gefühlten Ewigkeit aufgefallen ist. Herzlichen Glückwunsch, Aufnahmeprüfung mit höchster Auszeichnung bestanden. Gruß, [[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]])<br />
<br />
== Bearbeitungsleiste im Wiki-Editor wieder verfügbar ==<br />
<br />
Hallo Otto,<br /><br />
Arno hat am Wochenende wichtige Probleme aus dem Wikimedia-Update behoben. Die Bearbeitungsleiste im Wiki-Editor ist nun wieder verfügbar. Dein "Plain-Text-Problem" sollte damit zumindest abgeschwächt sein. Sollte es bei Dir noch Schwierigkeiten mit der Anzeige der Leiste geben, bitte melden; ist in "nur" 3 Browsern getestet.<br />
Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 05:40, 21. Apr. 2015 (CEST)<br />
<br />
== Event monitor in "[[Erste Schritte in FHEM]]" ==<br />
Hallo Otto,<br />
<br />
* gibt es einen Grund, warum Du die Änderung der Schreibweise nicht durchgängig im gesamten Artikel vorgenommen hast?<br />
* es wäre schön, Änderungen in der dt. Version auch gleich entsprechend in der [[First steps in FHEM|englischen Version]] mit vorzunehmen (habe ich gerade).<br />
<br />
Ach ja - und bezüglich der Verlinkung von Begriffen:<br />
<br />
Ich kenne das aus der WP so, dass immer nur das erste Auftreten des gleichen Lemmas im Artikel (maximal in jedem Abschnitt einmal) verlinkt wird. Sonst gibt es ja fast nur noch Links. ;-)<br />
<br />
[[Benutzer:Baumbuwe|Uwe ]] ([[Benutzer Diskussion:Baumbuwe|Diskussion]])<br />
: Hallo Uwe,<br />
: Ich diskutiere das gerade mit [[Benutzer_Diskussion:Krikan|Christian]], ich habe die Schreibweise eigentlich wegen dem Link geändert. Das mit den Links habe ich wieder zurück genommen, also nur den ersten. Ich wusste das nicht :) Ich gebe zu ich bin nicht so fit im Wiki, alles noch sehr am Anfang bei mir.--[[Benutzer:Otto123|Otto123]] ([[Benutzer Diskussion:Otto123|Diskussion]]) 17:11, 17. Aug. 2017 (CEST)<br />
<br />
:: Alles gut - das ist ein Wiki, also Learning by Looking around and Doing - [[Benutzer:Baumbuwe|Uwe ]] ([[Benutzer Diskussion:Baumbuwe|Diskussion]])<br />
<br />
== VCCU Setzen der IOgrp auf (fast) allen Devices mit einem einzigen Befehl ==<br />
<br />
Hallo, ich habe den "Befehl" <br><br />
<br />
attr TYPE=CUL_HM:FILTER=DEF=[0-9a-fA-F]{6}:FILTER=DEF!=[0]{6} IOgrp VCCU<br><br />
<br />
in fhemweb oben eingegeben und bekomme:<br><br />
<br />
vccu VCCU is no vccu with IOs assigned. It can't be used as IO<br><br />
<br />
vccu VCCU is no vccu with IOs assigned. It can't be used as IO<br><br />
<br />
vccu VCCU is no vccu with IOs assigned. It can't be used as IO<br><br />
<br />
...<br><br />
<br />
<br />
wohlgemerkt, ich denke mein IO ist definiert:<br />
<br />
<br />
define VCCU CUL_HM 141423<br><br />
<br />
setuuid VCCU 60a39bd5-f33f-e738-3f8e-8051aa3cf88fbd08<br><br />
<br />
'''attr VCCU IOList hmusb'''<br><br />
<br />
attr VCCU IOgrp VCCU<br><br />
<br />
attr VCCU model CCU-FHEM<br><br />
<br />
attr VCCU subType virtual<br><br />
<br />
attr VCCU webCmd virtual:update<br><br />
<br />
<br />
<br />
Ich bin mir auch nicht sicher, wo der Befehl <br />
attr TYPE=CUL_HM:FILTER=DEF=[0-9a-fA-F]{6}:FILTER=DEF!=[0]{6} IOgrp VCCU<br />
eingegeben werden soll. Und warum er die fhem.cfg ändert (nach save)?<br />
<br />
Vielleicht kann ich ja die wiki Seite um entsprechende Erklärungen ergänzen, wenn ich verstehe, was falsch läuft...<br />
<br />
<br />
--[[Benutzer:Nomo|Nomo]] ([[Benutzer Diskussion:Nomo|Diskussion]]) 00:14, 23. Dez. 2021 (CET)<br />
<br />
ich weiß irgendwie nicht wie man hier so ein Problem diskutieren kann, ich würde bitten die Frage im Forum zu stellen.</div>Otto123http://wiki.fhem.de/w/index.php?title=ConBee&diff=36981ConBee2022-01-05T18:11:24Z<p>Otto123: /* Binding einrichten */ Abschnitt bekannte probleme eingefügt</p>
<hr />
<div>{{Todo|Noch zu vervollständigen und zu verlinken}}<br />
[[ConBee]] ist ein [[ZigBee]] USB Gateway ([[Interface]]), mit dem herstellerübergreifend ZigBee-Geräte bedient werden können. Unter der Bezeichnung RaspBee ist auch eine Variante als [[Raspberry Pi]] Modul erhältlich. Beide Geräte sind als ''ConBee II'' und ''RaspBee II'' in einer aktualisierten Version erhältlich. Im folgenden werden alle Version als ''ConBee'' bezeichnet und die Ausführungen gelten auch RaspBee; sofern es relevante Unterschiede gibt, wird das ausdrücklich erwähnt.<br />
<br />
{{Infobox Hardware<br />
|Bild=ConBee_II.jpg<br />
|Bildbeschreibung=<br />
|HWProtocol=ZigBee<br />
|HWType=[[Interface]]<br />
|HWCategory=diverse Hersteller<br />
|HWComm=Funk 2.4 GHz<br />
|HWChannels=Zigbee Channel 11 15 20 25<br />
|HWVoltage=5V=<br />
|HWPowerConsumption=ca. 0,1 W<br />
|HWPoweredBy=USB<br />
|HWSize=40 x 17 x 8 (ohne USB Stecker)<br />
|HWDeviceFHEM=HUEBridge.pm, HUEDevice.pm<br />
|HWManufacturer=dresden elektronik, Vertrieb: [http://phoscon.de Phoscon] <br />
}}<br />
== Beschreibung ==<br />
Das ConBee Gateway benötigt/hat keine Cloud-Anbindung. Eine Liste der kompatiblen ZigBee Geräte und Hersteller findet sich [https://phoscon.de/de/conbee2/compatible hier].<br />
<br />
== Dokumentation und Setup ==<br />
* Offizielle deconz [https://phoscon.de/de/conbee/install Installationsanleitung]. Das Ergebnis der Installation ist vom verwendeten System abhängig.<br />
* Beschreibung der Parameter findet man versteckt im [https://github.com/dresden-elektronik/deconz-rest-plugin/wiki/deCONZ-command-line-parameters deconz Rest-Plugin Wiki]<br />
* Beschreibung der [https://github.com/marthoc/docker-deconz Containerinstallation] - aufschlussreich ist dort auch der Inhalt der start.sh.<br />
Das Setup erzeugt auf einem Pi mit PiOS Lite sieben Services, die bis auf zwei alle disabled sind (<code>systemctl list-unit-files|grep deconz</code>).<br />
<br />
Um den minimalen Dienst (deconz) in Betrieb zu nehmen, sind noch folgende Schritte notwendig:<br />
# Optionale Konfiguration (empfohlen): serielle Schnittstelle und WEB-Port (Standard: 80) einstellen (siehe [[#Problembehebung|Problembehebung]])<br />
# Start und Test: <code>sudo systemctl start deconz</code>, mit dem Browser Zugriff auf Phoscon App testen: http://gatewayIP:Portnummer<br />
# Funktioniert alles, kann man den Service dauerhaft aktivieren: <code>sudo systemctl enable deconz</code><br />
'''Hinweise''': <br />
* Das Programm deCONZ verwendet die Hardwareschnittstelle und kann nicht mehrfach gestartet werden und dabei die gleiche Hardwareschnittstelle verwenden! <br />
* Es gibt eine Ungereimtheit in der Beschreibung des Parameters ''platform'': es scheint aktuell (April 2021) egal zu sein, ob man <code>-platform minimal</code> oder <code>--platform minimal</code> verwendet. <br />
* Beim deCONZ Aufruf empfiehlt es sich generell, den --dev= Parameter anzuhängen (siehe [[#Problembehebung|Problembehebung]]). <br />
* deconz.service und deconz-gui.service sind alternative Aufrufe der gleichen Binary - es kann nur einer von beiden Diensten gestartet werden. <br />
* Alternativ (nicht empfohlen) kann man das deconz Setup auf einem Desktop System ausführen und den Dienst deconz-gui konfigurieren und aktivieren. Der Zugriff auf die GUI erfolgt dann mit einem VNC Viewer (RealVNC bietet eine portable Version). <br />
* Wer eine einfache Konfiguration möchte und sich mit docker auskennt, kann die docker Variante wählen. <br />
Mit der Phoscon Web-App kann man <br />
* Das Gateway verwalten: Firmware, Backup/Restore, Zeitzone, Sprache<br />
* ZigBee Geräte anmelden und verknüpfen, Szenen einrichten ...<br />
* Applikationen mit dem Gateway verbinden, dazu zählt auch das HUEBridge Device von FHEM<br />
* Zugriff auf die alte WebApp erhalten (Hilfe Seite)<br />
Mit der deCONZ GUI kann man<br />
* Die Firmware der Geräte aktualisieren (OTA Plugin)<br />
* Das Zigbee Netzwerk visualisieren<br />
* EIne direkte Kommunikation zwischen zwei Geräten - Binding - einrichten<br />
* ... (noch vervollständigen)<br />
Um den Zugriff auf die deCONZ GUI zu erhalten, kann man '''X11 Forwarding''' verwenden, dazu braucht man nur einen X11 Server (Linux Desktop oder Windows VcXsrv, Xming; beides auf SourceForge.net verfügbar).<br />
<br />
Einzeiler für Linux Desktop : <code>ssh -X <user>@<host> sudo systemctl stop deconz; deCONZ --dev=/dev/ttyACM0;sudo systemctl start deconz</code><br />
<br />
Einzeiler für Windows 10 : <code>ssh -X <user>@<host> export DISPLAY=%COMPUTERNAME%:0.0;sudo systemctl stop deconz; deCONZ --dev=/dev/ttyACM0;sudo systemctl start deconz</code><br />
=== Problembehebung ===<br />
'''Service'''<br />
<br />
deCONZ verwendet offenbar beim Start auch per default die Schnittstelle /dev/ttyAMA0 (raspbee Modul). Die Kommunikation eines dort steckenden anderen Moduls wird dabei gestört, die GUI reagiert eine Zeit lang nicht.<br />
<br />
Hat man andere Module an AMA0 (UART GPIO) oder an den Standard USB Schnittstellen (ACM0 usw.), muss der deCONZ Aufruf mit den richtigen Schnittstellen Parametern konfiguriert werden. <br />
<br />
Am zuverlässigsten ist es, die Definition per ID einzutragen. Der richtige Eintrag kann mit leicht abgefragt werden:<br />
<br />
<code>ls -lha /dev/serial/by-id</code><br />
<br />
Die Konfiguration der Dienste erfolgt mit dem systemctl Editor:<br />
<br />
<code>sudo systemctl edit --full deconz</code><br />
<br />
und die Zeile ExecStart um diesen Parameter ergänzen (Beispiel): <br />
<br />
<code>--dev=/dev/serial/by-id/usb-dresden_elektronik_ingenieurtechnik_GmbH_ConBee_II_DE1234567-if00</code> <br />
<br />
Grundsätzlich ist diese Art der Einbindung auch für [[Mehrere USB-Geräte einbinden|alle seriellen Geräte]] in FHEM dringend anzuraten, wenn andere Services wie deconz auf demselben Server betrieben werden.<br />
<br />
'''Docker'''<br />
<br />
Im docker run Aufruf verändert man den device Parameter aus der [https://github.com/marthoc/docker-deconz Original Dokumentation] am Einfachsten wie folgt:<br />
<br />
<code>--device=/dev/serial/by-id/usb-dresden_elektronik_ingenieurtechnik_GmbH_ConBee_II_DE1234567-if00:/dev/ttyACM0</code><br />
<br />
docker-compose.yml<syntaxhighlight lang="docker"><br />
devices:<br />
- /dev/serial/by-id/usb-dresden_elektronik_ingenieurtechnik_GmbH_ConBee_II_DE1234567-if00:/dev/ttyACM0<br />
</syntaxhighlight>Damit wird der Stick vom Host eindeutig mit serial/by-id eingebunden und im Container an der Standard Schnittstelle ttyACM0 bereitgestellt. <br />
<br />
'''X11 Server'''<br />
<br />
Sollte bei der Verbindung zum X11 Server die Fehlermeldung ''Authorization required'' kommen, kann man beim Start des VcXsrv Server einfach den Haken bei ''disable access control'' setzen.<br />
<br />
== Update in Docker Umgebung ==<br />
Das Update der PhosCon App erfolgt durch ein update des docker containers (Image neu ziehen und Container neu machen -> run bzw. compose up). <br />
<br />
Das Update der Firmware funktioniert nach dieser [https://github.com/marthoc/docker-deconz#updating-conbeeraspbee-firmware offiziellen Beschreibung].<br />
<br />
== Unterstützung in FHEM ==<br />
{{Randnotiz|RNTyp=g|RNText=Alternativ kann man das Model ConBee II auch als Interface für [[Zigbee2mqtt|zigbee2mqtt]] verwenden und dann die ZigBee-Geräte als [[MQTT2_DEVICE]] in FHEM einbinden.}} <br />
ConBee wird über das Modul [[Hue|HUEBridge]] und über die deCONZ Software, die Wireless Light Control WebApp und die Phoscon WebApp (kommt zusammen mit deConz) in FHEM eingebunden.<br />
<br />
Sensoren werden nicht automatisch erzeugt und müssen manuell angelegt werden. <br />
<br />
Tipps:<br />
* Die HUEBridge funktioniert (noch undokumentiert) auch mit Portangaben, falls nicht Standard Port 80 verwendet wird.<br />
* Der SSL Port wird im Modul von der API abgefragt und kann in der HUEBridge nicht extra angegeben werden. Dazu darf der SSL Port nicht extern umgemappt werden, sondern der deconz Service muss wissen, auf welchem Port er läuft.<br />
* Die Bridge muss einmalig mit dem Gateway gepairt werden. Das FHEM Bridge Device erzeugt einen Key, in der Phoscon App muss man im Menüpunkt Gateway/erweitert/App die Funktion {{Taste|verbinden}} wählen.<br />
<br />
== Binding einrichten ==<br />
Um das Licht ohne "Umwege" direkt mit einem Taster/Schalter zu steuern, muss man beide direkt verbinden. Im Zigbee Umfeld wird dies Binding genannt. Beim ConBee Stick erfolgt das mit der deconz-gui.<br />
[[Datei:Deconz-binding-zeichnung.png|mini|Beispiel Binding Taster -> Lampe]]<br />
Die Binding Logik geht normalerweise vom steuernden (Taster) zum gesteuerten Device (Lampe).<br />
# Panel Bind Dropbox anhaken, Kartenreiter (unten!) wird damit angezeigt und muss in den Vordergrund gebracht werden.<br />
# Bei beiden Geräten die Home Automation Tabelle öffnen: linker grauer "Knopf" im Symbol.<br />
# Per drag&drop die gewünschte Zeile in der Tabelle (z.B. 006 on/off) in das jeweilige (linke oder rechte) Feld (Source -> Destination) fallen lassen. <br />
# Den Bind Knopf drücken.<br />
Voraussetzung zum Erfolg: Beide Geräte unterstützen ein Binding, damit kann man zumindest Grundfunktionen direkt ausführen.<br />
<br />
== bekannte Problembe ==<br />
Wenn alles gut aussieht, aber trotzdem scheinbar keine Kommunikation mit Zigbee Geräten stattfindet (Anlernen geht nicht, auch nicht mit Abstand von wenigen cm) sollte man den Stick mit einer USB Verlängerung (30-50 cm) anschließen.<br />
<br />
== Links ==<br />
* Internetseite des [http://www.dresden-elektronik.de Herstellers] und des [https://phoscon.de Vertreibers]<br />
* [https://phoscon.de/de/conbee2/compatible Liste der kompatiblen Hersteller / Geräte].<br />
<br />
[[Kategorie:Interfaces]]<br />
[[Kategorie:ZigBee]]</div>Otto123http://wiki.fhem.de/w/index.php?title=Sonos2mqtt&diff=36578Sonos2mqtt2021-12-18T21:48:33Z<p>Otto123: /* Konfiguration der Player */ Player löschen eingearbeitet</p>
<hr />
<div>== Grundeinrichtung ==<br />
Die Grundeinrichtung ist bereits im Artikel [[MQTT2-Module - Praxisbeispiele#Sonos2Mqtt|MQTT2-Module - Praxisbeispiele]] beschrieben. Hier soll es um die praktische Verwendung und Erweiterung gehen. <br />
<br />
Für alle Erweiterungen wird versucht vorhandene Devices in FHEM zu verwenden.<br />
<br />
Viele Dinge werden derzeit noch entwickelt und können frei gestaltet werden - der Vorteil von generischen FHEM Devices.<br />
<br />
== Tipps zur Verwendung ==<br />
Die automatische Konfiguration setzt den alias entsprechend dem im Sonos vergeben Namen . Die langen MQTT2_RINCON_ Namen sind unhandlich und schlecht lesbar. Man kann Player mit einem devspec ansprechen, das simpelste ist:<br />
:<code>set alias=Büro play</code><br />
Oder alle Player<br />
:<code>set model=sonos2mqtt_speaker leaveGroup</code><br />
<br />
== Konfiguration der Player ==<br />
Mit dem Template sonos_bridge_comfort wird aus dem contrib Ordner eine Datei 99_sonos2mqttUtils.pm nachgeladen und aktiviert. Darin befindet sich der wesentliche Code, die sonos2mqtt Geräte selbst enthalten nur rudimentäre Aufrufe. <br />
<br />
Selbstverständlich kann man diese Datei jederzeit selbst gestalten (FHEM Menu:Edit Files) aber man sollte beachten, dass eine erneute Anwendung des Templates die Datei überschreibt.<br />
<br />
Man kann auch jederzeit diese Datei aus dem SVN neu laden:<br />
<syntaxhighlight lang="perl"><br />
{ Svn_GetFile("contrib/AttrTemplate/99_sonos2mqttUtils.pm", "FHEM/99_sonos2mqttUtils.pm", sub(){ CommandReload(undef, "99_sonos2mqttUtils") }) }<br />
</syntaxhighlight>Hauptroutine ist sonos2mqtt die mit zwei Parametern aufgerufen wird. <code>{sonos2mqtt($NAME,$EVENT)}</code><br />
<br />
Die Optik des Players wird mit der Routine <code>sonos2mqtt_devStateIcon</code> bestimmt.<br />
<br />
Man kann die Player mittels <code>attr a:model=sonos2mqtt_speaker webCmd volume</code> mit einem Slider in der Übersicht ausstatten.<br />
<br />
Ändert man die Sonoslandschaft, kann man auch alles einreißen und neu erzeugen lassen. Zunächst alles löschen (für die FHEM Kommandozeile):<syntaxhighlight lang="perl"><br />
{fhem("delete a:model=sonos2mqtt_speaker;;delete FileLog_MQTT2_RINCON.*");;qx(rm ./log/MQTT2_RINCON_*);;return ""}<br />
</syntaxhighlight>Danach muss man sonos2mqtt einfach neu starten: pm2 start ... bzw den docker container neu starten.<br />
<br />
== Befehle nachrüsten ==<br />
Um Befehle in der setList / getList / readingList nachzurüsten gibt es die Routine <code>sonos2mqtt_mod_list(devspec,attrName,line)</code> <br />
<br />
Vorhandenen Zeilen werden ersetzt. Identifiziert wird nur der erste Teil bis zum ":". Beispiel für die Komandozeile: <br />
<br />
<code>{sonos2mqtt_mod_list('a:model=sonos2mqtt_bridge','readingList','sonos/RINCON_([0-9A-Z]+)/Reply:.* Reply')}</code> <br />
<br />
== Sprachausgabe ==<br />
Man hat zwei Möglichkeiten, dies umzusetzen: <br />
# Text2Speech FHEM intern<br />
# Mit dem sonos text to speech Server https://svrooij.io/sonos2mqtt/<br />
<br />
=== Text2Speech Variante einrichten ===<br />
Zwei zusätzliche Geräte sind notwendig:<br />
* [[Text2Speech]] im Servermodus, erzeugt mp3 Dateien im cache Verzeichnis und legt einen Link im Reading httpName ab.<br />
* Ein HTTP Server stellt die Dateien im gleichen Verzeichnis bereit<br />
'''Hinweis''': Für die vollständige Funktion und Installation von Text2Speech ist die Commandref zu beachten! Für das unten im Beispiel verwendete Feature UseMP3Wrap muss das Tool mp3wrap installiert werden (z.B. <code>apt install mp3wrap</code>). Dies ist bei längeren Texten und bei der Verwendung von eingebetteten festen Sounds existenziell!<br />
<br />
Für die Funktion ist wichtig, dass das Sonos System den Host im Link zur Datei richtig auflösen kann. Deshalb wird der Hostname und Port des Servers im Reading host des TTS Device als Name oder IP Adresse abgelegt! Dies kann entweder mit dem hier gezeigten Befehl oder vollständig manuell erfolgen. Für FHEM innerhalb Docker muss man die Adresse des Docker Host angeben.<br />
<syntaxhighlight lang="perl"><br />
defmod SonosTTS Text2Speech none<br />
attr SonosTTS TTS_UseMP3Wrap 1<br />
attr SonosTTS TTS_Language Deutsch<br />
attr SonosTTS userReadings httpName:lastFilename.* {'http://'.ReadingsVal($name,'host','set host:port first').'/fhem/'.ReadingsVal($name,'lastFilename','')}<br />
attr SonosTTS TTS_CacheFileDir cache<br />
setreading SonosTTS host {(qx(hostname -s|tr -d '\n').':'.InternalVal('WEB','PORT','8083'))}<br />
#setreading SonosTTS host {((split(' ', qx(hostname -I)))[0].':'.InternalVal('WEB','PORT','8083'))}<br />
#setreading SonosTTS host <hostname>:<port><br />
<br />
defmod SonosSpeakWeb HTTPSRV cache cache SonosSpeakWeb<br />
</syntaxhighlight><br />
Der Sprachausgabe Befehle im Player Device läuft in 3 Schritten:<br />
# mit dem TTS Gerät wird die mp3 Datei erzeugt,<br />
# mit dem sleep wird auf die Fertigstellung gewartet,<br />
# die Datei wird mit <code>set Player notify volume uri</code> abgespielt.<br />
Durch den "sonos2mqtt notify" Befehl wird die laufende Umgebung wiederhergestellt.<br />
* Wird der Sprachbefehl an den Gruppenmaster gesendet wird die mp3 Datei in der gesamten Gruppe gespielt. <br />
* Wird der Sprachbefehl an ein Mitglied einer Gruppe gesendet (nicht den Master) wird die Gruppe aufgetrennt und später wieder hergestellt.<br />
Es sind zwei Befehle zur Sprachausgabe eingebaut: <br />
<br />
=== sayText Befehl ===<br />
Dieser Befehl orientiert sich an den FHEM [[DevelopmentGuidelinesAV|DevelopmentGuidelines]] und sammelt "gleichzeitig" eintreffende Sprachnachrichten, damit nichts verloren geht. Informationen im Forum dazu in {{Link2Forum|Topic=111711|Message=1100112|LinkText=diesem Beitrag}}.<br />
<br />
Die Lautstärke wird separat in SonosTTS gesetzt: <code>setreading SonosTTS vol 15</code>, ebenso die Sprache (einmalig bei der Einrichtung oder bei Bedarf zwischendurch) <code>attr SonosTTS TTS_Language Deutsch</code> <br />
<br />
''Hinweis: Der Befehl <code>set SonosTTS volume xx</code> hat im Servermodus des Devices keine Wirkung!''<br />
=== Speak Befehl ===<br />
Dieser Befehl ist ähnlich wie der in der FHEM-Sonos Umgebung:<br />
:<code>set Player speak <volume> text</code><br />
<br />
Verwendet man diesen Syntax (mit Sprache und Stimme am Anfang), wird automatisch der speak Befehl an die sonos-tts abgesetzt. Die sonos-tts muss man separat installieren/integrieren!<br />
<br />
<code>set EG.KU.Sonos speak de-DE Vicki 25 Test</code><br />
<br />
Will man keine laufenden Sendung unterbrechen sondern einfach eine Ansage machen und danach etwas starten, kann man so vorgehen:<br />
<syntaxhighlight lang="perl"><br />
set SonosTTS tts Hier steht die Ansage;sleep SonosTTS:playing:.0 ; set alias=PlayerAlias playUri [SonosTTS:httpName]<br />
</syntaxhighlight><br />
<br />
=== Volume Befehl ===<br />
Der Befehl akzeptiert einen zweiten Wert als Startwert d.h. set volume 25 10 setzt sofort auf 10 und startet dann fading auf 25. Ein zweiter Wert -1 erzeugt ein fading vom aktuellen Wert auf den angegebenen.<br />
<br />
==== Spiele feste Sounds ====<br />
Generell kann man feste mp3 Dateien (Klingeltöne, Klänge usw.) auch im cache Verzeichnis ablegen und direkt mit dem Link starten. <br />
<br />
Es gibt zahlreiche Soundquellen im Internet, ist der gewünschte Sound dabei, kann man ihn innerhalb FHEM herunterladen und an Ort und Stelle platzieren. (Beispiel ohne und mit Umbennung)<br />
<syntaxhighlight lang="perl"><br />
"wget -qP ./cache https://cdn.smartersoft-group.com/various/pull-bell-short.mp3"<br />
"wget -qO ./cache/KlingelTon.mp3 https://cdn.smartersoft-group.com/various/pull-bell-short.mp3"<br />
</syntaxhighlight><br />
Vergewissern ob der gewünschte Sound auch da ist: {qx(ls -lha ./cache)}<br />
<br />
Mit set magic kann man dabei einfach Teile aus anderen Readings holen.<br />
<syntaxhighlight lang="perl"><br />
set alias=Büro notify 25 {('http://[SonosTTS:host]/fhem/cache/KlingelTon.mp3')}<br />
</syntaxhighlight><br />
Man kann auch den setter im Gerät erweitern <code>{sonos2mqtt_mod_list('a:model=sonos2mqtt_speaker','setList',q(playSound:textField ....))}</code> :<br />
<syntaxhighlight lang="perl"><br />
playSound:textField {my $tts="SonosTTS";my ($cmd,$vol,$file)=split(' ', $EVENT,3);$file=($file=~m/.*\.mp3$/)?"$file":"$file.mp3";fhem("set $NAME notify $vol http://[$tts:host]/fhem/[a:$tts:TTS_CacheFileDir]/$file")}<br />
</syntaxhighlight><br />
Damit sind dann dieser Syntax möglich:<br />
<syntaxhighlight lang="perl"><br />
set alias=Büro playSound 40 KlingelTon.mp3<br />
</syntaxhighlight><br />
oder ohne Dateiendung (wird auf mp3 gesetzt)<br />
<syntaxhighlight lang="perl"><br />
set alias=Büro playSound 40 KlingelTon<br />
</syntaxhighlight><br />
<br />
=== SonosBridge ===<br />
Die SonsoBridge enthält bereits ein paar zentrale Funktionen und Readings, z.B. wird beim Laden der Favoritenliste ein Reading favlist und grouplist erzeugt, welches zur Erweiterung der Player mit Auswahllisten dienen kann.<br />
<br />
=== Player mit Favoritenliste und Gruppenliste ausstatten ===<br />
Wenn nicht schon geschehen muss man jetzt die Favoriten zum ersten Mal einlesen: get SonosBridge Favorites<br />
<br />
Nachdem die SonosBridge "aufgerüstet" ist, kann man allen Playern die Favoritenliste zum Auswählen eintragen. Beide Zeile sind für die FHEM Kommandozeile und verwenden die Routine aus der 99_sonos2mqttUtils.<br />
<syntaxhighlight lang="perl"><br />
{sonos2mqtt_mod_list('a:model=sonos2mqtt_speaker','setList','joinGroup:'.ReadingsVal((devspec2array('a:model=sonos2mqtt_bridge'))[0],'grouplist','').q( {sonos2mqtt($NAME,$EVENT)}))}<br />
{sonos2mqtt_mod_list('a:model=sonos2mqtt_speaker','setList','playFav:'.ReadingsVal((devspec2array('a:model=sonos2mqtt_bridge'))[0],'favlist','').q( {sonos2mqtt($NAME,$EVENT)}))}<br />
</syntaxhighlight><br />
Man kann den playFav Befehl auch im set Befehl mit einem Teil des Favoriten Namen verwenden. Enthält die Favoritenliste z.B. Radio Leipzig würde der auch mit diesem Befehl angesteuert werden:<syntaxhighlight lang="perl"><br />
set alias=Bad playFav leipzig<br />
</syntaxhighlight><br />
<br />
=== Listen der Favoriten Radios und Playlist erstellen ===<br />
Im Sonos System kann man an (mindestens) drei Stellen Favoriten hinterlegen: Sonos-Favoriten, Sonos-Playlisten, TuneIn: Meine Radiosender<br />
<br />
Diese drei Listen kann man einlesen und für die einfache Suche und Auswahl verwenden. Der play befehl akzeptiert dazu den Syntax und sucht in den entsprechenden Listen.<br />
<br />
Diese Play Befehle starten nicht sofort sondern erst nach einem folgenden set ... play. Damit kann man etwas vorbereiten und gezielt starten.<br />
<br />
<code>set alias=Büro play Favorite Deutschlandfunk</code><br />
<br />
<code>set alias=Büro play Radio HitRadio</code><br />
<br />
<code>set alias=Büro play Playlist Meine Hits</code><br />
<br />
Die Listen dazu muss man einmalig (bzw. bei Veränderungen) einlesen:<br />
<pre><br />
get SonosBridge Reply Playlists;sleep SonosBridge:Reply.*;setreading SonosBridge Playlists [SonosBridge:Reply]<br />
get SonosBridge Reply Favorites;sleep SonosBridge:Reply.*;setreading SonosBridge Favorites [SonosBridge:Reply]<br />
get SonosBridge Reply Radios;sleep SonosBridge:Reply.*;setreading SonosBridge Radios [SonosBridge:Reply]<br />
</pre><br />
<br />
Beispiel für ein Guten Morgen Radio:<br />
<pre><br />
set alias=BadWanne,alias=Kueche joinGroup Bad;<br />
set alias=BadWanne,alias=Bad volume 13 6;<br />
set alias=Bad play Favorite Deutschlandfunk.Kultur.RP;<br />
set alias=Kueche volume 18 8;<br />
sleep 0.2;set alias=Bad play<br />
</pre><br />
<br />
=== Radioliste durchtasten ===<br />
Will man eine Liste von bestimmten Radiostation mit einem Taster "durchtasten" kann man das wie folgt tun:<br />
<br />
Eine eigene Radio Liste in ein Reading schreiben (Die Namen müssen zumindest in Teilen mit den Favoriten Titeln übereinstimmen)<br />
<syntaxhighlight lang="perl"><br />
setreading model=sonos2mqtt_bridge favRadios Deutschlandfunk Kultur,Radio Leipzig,Radio Station 3 <br />
</syntaxhighlight><br />
Im Template wird durch ein userReading die Liste beim Auslesen der Favoriten vorbelegt.<br />
<br />
Der Befehl zum weiterschalten. Jedesmal wenn dieser Befehl ausgeführt wird, wird der nächste Favorit gestartet.<br />
<br />
Wird eine Radiosender gespielt wird bei einem set ... next auf den nächsten Sender in dieser Liste geschaltet und der transportState wird beibehalten.<br />
<br />
=== Weitere Ideen ===<br />
Will man vor dem Radiostart noch die Ansage des Senders haben, geht das zwar auch mit dem speak Befehl, die direkte Ausgabe ohne Restore der Umgebung (sonos2mqtt notify) ist aber effektiver.<br />
<br />
Damit das funktioniert müssen wir die Events einschränken: <br />
<syntaxhighlight lang="perl"><br />
attr model=sonos2mqtt_speaker event-on-change-reading .*<br />
{my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];;my $r=Each($dev,ReadingsVal($dev,'favRadios',''));;my $play = (devspec2array('alias=Büro'))[0];;my $tts="SonosTTS";;fhem("set $tts tts Es folgt $r;;sleep $tts:playing:.0;;set $play playUri [$tts:httpName];;sleep $play:play;;sleep $play:PLAYING;;sleep $play:STOPPED;;set $play playFav $r")}<br />
</syntaxhighlight><br />
Kurze Erklärung zum Code <br />
* ermittelt den nächsten Radiosender in der Liste,<br />
* erzeugt die Ansage "Es folgt SenderXY",<br />
* wenn die mp3 Datei fertig erzeugt ist wird sie mit dem Befehl playUri an den Player gesendet,<br />
* es wird eine Eventfolge abgewartet -> play / PLAYING / STOPPED,<br />
* danach wird der Radiosender gestartet.<br />
Der Code ist so einfach und relativ "steif" für die Kommandozeile. Man kann das auch in einen Setter packen:<br />
<syntaxhighlight lang="perl"><br />
toggleRadio:noArg {my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];my $r=Each($dev,ReadingsVal($dev,'favRadios',''));my $tts="SonosTTS";fhem("set $tts tts Es folgt $r;sleep $tts:playing:.0;set $NAME playUri [$tts:httpName];sleep $NAME:play;sleep $NAME:PLAYING;sleep $NAME:STOPPED;set $NAME playFav $r")}<br />
</syntaxhighlight><br />
<br />
== Dokumentationen und weitere Entwicklungen ==<br />
ToDo<br />
<br />
[[Kategorie:MQTT]]</div>Otto123http://wiki.fhem.de/w/index.php?title=MQTT2-Module_-_Praxisbeispiele&diff=36203MQTT2-Module - Praxisbeispiele2021-11-18T10:24:53Z<p>Otto123: /* Anwesenheitserkennung */ Hinweis auf direkte Verwendung MQTT2_SERVER verschoben und präsenter gemacht.</p>
<hr />
<div>== Einführung: MQTT bzw. MQTT2 in FHEM ==<br />
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT verwenden, beachten Sie bitte, dass der MQTT2_CLIENT die ursprüngliche Herkunft der über MQTT verteilten Informationen nicht kennt. Daher ergeben sich in der Anwendung kleinere Unterschiede, zu deren Verständnis die diesbezüglichen [[MQTT2_CLIENT#Anwendung|Hinweise zu MQTT2_CLIENT]] bekannt sein sollten.}}Zur Einbindung von Geräten, welche zur Nutzung des MQTT-Protokols konfiguriert werden können und darüber mit einem MQTT-Server (früher: Broker) kommunizieren, stehen unter FHEM verschiedene Optionen zur Verfügung, wobei nicht alle Module beliebig miteinander verwendet werden können. Details hierzu sind dieser [[MQTT|Übersicht]] zu entnehmen. <br />
<br />
Im Rahmen dieses Artikels wird für die eigentlichen Geräte [[MQTT2 DEVICE|MQTT2_DEVICE]] verwendet, damit wird als IO-Device entweder {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} oder [[MQTT2 CLIENT|MQTT2_CLIENT]] benötigt, mit einem IO-Device des Typs [[MQTT (Modul)|MQTT]] funktioniert die nachfolgende Darstellung dagegen nicht<ref>Allerdings können die Konfigurationen in der Regel recht einfach auf die bisherige MQTT-Implementierung übertragen werden</ref>. MQTT2_DEVICE unterstützt u.a. auch die ''setExtensions'' direkt, also z.B. ''on-for-timer<ref>Beachten Sie bei mehrkanaligen Geräten, dass jeweils nur ein Hauptkanal mittels setExtensions verwaltet werden kann! U.a. aus diesen Grund ist es meist sinnvoller, die ''split''-Varianten der attrTemplate-Einrichtung zu verwenden.</ref>'' sowie ''[[MQTT2-Module - Praxisbeispiele#attrTemplate_2|attrTemplate]]''<ref>Auch MQTT_DEVICE unterstützt SetExtensions, allerdings muss dies dort per Attribut eingeschaltet werden</ref>.<br />
<br />
=== Allgemeine Einstellungen und Hinweise ===<br />
{{Randnotiz|RNTyp=r|RNText=Beachten Sie, dass für [[autocreate]] in Verbindung mit MQTT2_SERVER '''zwingend''' jeder über MQTT kommunizierende Client eine ClientID angeben muss. Passen Sie daher ggf. die Einstellungen Ihres Geräts an. Manche Geräte verwenden auch "Wegwerf"-ClientID's. Für diese empfiehlt es sich, ggf. dann die durch autocreate erstellten Geräte nachzubearbeiten und die ClientID-Angabe v.a. aus den Inhalten des readingList-Attributs zu entfernen.}}Die nachfolgenden Beispiele gelingen am einfachsten mit '''MQTT2_SERVER als Server ("Broker")''', für diesen sollte dabei ''autocreate'' '''nicht deaktiviert''' sein, damit die erforderlichen MQTT2_DEVICES soweit möglich automatisiert erstellt werden<ref>Dabei wird vorausgesetzt, dass ein allgemeines {{Link2CmdRef|Anker=autocreate|Lang=en|Label=autocreate}}-Device (''TYPE=autocreate'') ebenfalls aktiv ist.</ref> . <br />
<br />
Beispiel<ref>MQTT2_SERVER verwendet als default-Einstellung für ''autocreate'' ''simple'', ohne dass ein entsprechendes Attribut gesetzt werden müsste. Die Einstellung ''complex'' empfiehlt sich in der Regel nicht; diese ist jedoch dann zu empfehlen, wenn das Device entweder verschachtelte JSON-Array-Strukturen liefert oder bestimmte Readings nicht gefüllt werden sollen.</ref>:<br />
define MQTT2_FHEM_Server MQTT2_SERVER 1883 global<br />
<br />
Falls der MQTT Broker mit Hilfe von [[allowed]] abgesichert wurde, muss in den Geräten ebenfalls User bzw. Passwort eingetragen werden, damit eine MQTT Kommunikation möglich ist.<br />
<br />
{{Hinweis|Die Code-Darstellung in diesem Beitrag entspricht jeweils dem RAW-Format zum [[Import von Code Snippets]]. Wer die Attribute direkt und einzeln bearbeitet, muss ggf. die "\" entfernen!}}<br />
<br />
=== MQTT-Einstellungen in den Geräten ===<br />
Die Beispiele gehen davon aus, dass die einzubindenden Geräte '''''mit den default-Einstellungen''''' für MQTT betrieben werden, wenn man von den Angaben zum Server und ggf. der Gerätekennung absieht. Es sollten also insbesondere '''keine Veränderungen der topic-Pfade''' vorgenommen werden.<br />
<br />
{{Hinweis|Einige der hier beschriebenen Einstellungen haben Änderungen der sich durch die jeweiligen Automatismen eigentlich jeweils ergebenden Standard-Werte zur Folge, insbesondere, was Reading-Namen und von den Geräten gesendete Werte angeht. Sie sollten daher zunächst die Konfiguration des jeweiligen MQTT2-DEVICE-Geräts abschließen, und erst anschließend die weitere Integration mit Event-Handlern, logging usw. vornehmen. }}<br />
<br />
=== auto-Konfigurations-features ===<br />
Viele firmwares und Dienste bieten Möglichkeiten an, einer Controller-Software (insbesondere homeassistant) Hilfsdaten zur automatisierten Konfiguration bereitzustellen. Da FHEM diese Daten nicht zu ihrem ursprünglichen Zweck verwenden kann, werden hierdurch lediglich zusätzliche Readings erzeugt, mit denen man als User in der Regel wenig anfangen kann. Es wird daher empfohlen, derartige features '''abzuschalten'''. Wo dies nicht möglich ist, sollte man eine passende [[MQTT2_CLIENT#ignoreRegexp|ignoreRegexp]] setzen bzw. diese passend erweitern!<br />
<br />
== zigbee2mqtt ==<br />
[[Bild:MQTT2_zigbee2mqtt_Bulbs.png|400px|thumb|Darstellung in FHEMWEB]]<br />
[https://www.zigbee2mqtt.io zigbee2mqtt] ist ein open-source Projekt, mit dem zigbee-Geräte über MQTT direkt angesprochen werden können, ohne dass hierfür eine Bridge eines Herstellers benötigt wird.<br />
<br />
Einzelheiten zur Vorgehensweise sind auf der Detailseite [[Zigbee2mqtt|zigbee2mqtt]] zu finden.<br />
<br />
== Tasmota ==<br />
{{Randnotiz|RNTyp=r|RNText=Bitte beachten Sie, dass versicherungsrechtliche Probleme entstehen können, wenn die herstellereigene Firmware ersetzt wird!}}[https://github.com/arendst/Sonoff-Tasmota Tasmota] ('''T'''heo '''A'''rends '''S'''onoff '''M'''QTT '''O'''ver '''T'''he '''A'''ir - einer offenen Firmware von [https://github.com/arendst arendst]) ist eine open-source Software für ESP8266-Geräte, die z.B. statt der originalen Firmware für Sonoff-Geräte und andere ESP8266-basierte WLAN-Steckdosen usw. verwendet werden kann. <br />
{{Hinweis|[[Datei:Tasmota mqtt config.png|120px|thumb|right]]Vor allem, aber nicht nur bei Verwendung des MQTT2_CLIENT als IO, ist es empfehlenswert, in der MQTT-Konfiguration der tasmota-Geräte für den Parameter ''<nowiki>topic = %topic% (tasmota)</nowiki>'' ebenfalls die dynamisch aus der Chip-ID erzeugte Kennung ''DVES_%06X'' zu verwenden. (Kopieren Sie einfach diese Zeichenkette aus dem Eingabefeld für ''"client ..."'', siehe nebenstehende Abbildung). Die eigentliche Umbenennung zu einem "sprechenden Namen" kann dann innerhalb von FHEM - mittels ''rename'' oder ggf. mit einem ''alias'' - erfolgen.}}<br />
=== MQTT2_DEVICE ===<br />
Dieses sollte bei aktiviertem ''autocreate'' am MQTT2_SERVER-Device automatisch angelegt werden, sobald das betreffende Gerät eingesteckt oder neu gestartet oder an einem evtl. vorhandenen Taster geschalten wird. Bislang wurden Tasmota version(en) ab 6.1.1 bis min. 8.1.0 getestet, dies auf verschiedener Hardware, zunächst mit Sonoff Touch und S20, zwischenzeitlich mit einer Vielzahl von Geräten, die per USB-Adapter oder mit der Methode aus dem [https://www.heise.de/ct/artikel/Tuya-Convert-IoT-Geraete-ohne-Loeten-vom-Cloud-Zwang-befreien-4283623.html Tuya-Convert]-Projekt des heise-Verlags auf Tasmota umgeflasht wurden.<br />
<br />
=== Manuelle Anpassungen - Schalter ===<br />
Die RAW-Definition kann dann beispielsweise wie folgt ergänzt werden: <br />
<syntaxhighlight lang="perl"><br />
defmod MQTT2_DVES_9B01BD MQTT2_DEVICE DVES_9B01BD<br />
attr MQTT2_DVES_9B01BD IODev m2server<br />
attr MQTT2_DVES_9B01BD devStateIcon on:FS20.on:off off:FS20.off:on<br />
attr MQTT2_DVES_9B01BD readingList DVES_9B01BD:tele/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:tele/DVES_9B01BD/LWT:.* LWT\<br />
DVES_9B01BD:tele/DVES_9B01BD/UPTIME:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:tele/DVES_9B01BD/SENSOR:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:tele/DVES_9B01BD/INFO1:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:tele/DVES_9B01BD/INFO2:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:tele/DVES_9B01BD/INFO3:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:stat/DVES_9B01BD/RESULT:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:stat/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }<br />
attr MQTT2_DVES_9B01BD room MQTT2_DEVICE<br />
attr MQTT2_DVES_9B01BD setList on cmnd/DVES_9B01BD/POWER on\<br />
off cmnd/DVES_9B01BD/POWER off\<br />
reboot cmnd/DVES_9B01BD/Restart 1<br />
attr MQTT2_DVES_9B01BD webCmd on:off:reboot<br />
</syntaxhighlight><br />
<br />
=== Manuelle Anpassungen - Dimmer ===<br />
{{Randnotiz|RNTyp=r|RNText=Dieses Beispiel ist nur bedingt zur Nachahmung zu empfehlen: Prinzipiell kann man Readings und setter in MQTT2_DEVICE fast nach Belieben benennen. Wählt man allerdings <i>FHEM-typische</i> Namen, kann dies sehr zur Vereinfachung beitragen. Z.B. wird eine Sprachssteuerung bei einem Dimmer üblicherweise automatisch korrekt eingestellt werden, wenn der für die Helligkeit zuständige setter z.B. <i>pct</i> (oder <i>brightness</i>) heißt, oder eine abzufragende Temperatur <i>temperature</i>. Entsprechendes gilt im Rahmen von <i>devspec-Abfragen</i>.}}Bei einem Dimmer sind einige zusätzliche Anpassungen vorzunehmen. Ein Dimmer wird über '''POWER''' geschaltet und über '''Dimmer''' gedimmt. Damit das funktioniert, müssen ein stateFormat und devStateIcon zusammenarbeiten:<br />
<syntaxhighlight lang="perl"><br />
attr MQTT2_DVES_2DF34D devStateIcon 10\d.*:dim100%@orange:off 1\d.*:dim12%@orange:off 2\d.*:dim18%@orange:off 3\d.*:dim31%@orange:off 4\d.*:dim43%@orange:off 5\d.*:dim50%@orange:off 6\d.*:dim62%@orange:off 7\d.*:dim68%@orange:off 8\d.*:dim81%@orange:off 9\d.*:dim93%@orange:off 0:FS20.off:on .*:FS20.off@orange:off<br />
attr MQTT2_DVES_2DF34D stateFormat {if(ReadingsVal($name,"POWER",0)eq"off"){0}else{ReadingsVal($name,"Dimmer",0)}}<br />
</syntaxhighlight><br />
Nun kann man über das Icon ein- und ausschalten und der Zustand des Dimmers wird korrekt angezeigt.<br />
<br />
Es fehlt noch ein Slider, um auch dimmen zu können. Zusätzlich muss setList noch um Dimmer erweitert werden:<br />
<syntaxhighlight lang="text"><br />
attr MQTT2_DVES_2DF34D setList on cmnd/dimmer/POWER on\<br />
off cmnd/dimmer/POWER off\<br />
Dimmer cmnd/dimmer/Dimmer<br />
attr MQTT2_DVES_2DF34D webCmd Dimmer<br />
attr MQTT2_DVES_2DF34D widgetOverride Dimmer:slider,0,1,100<br />
</syntaxhighlight><br />
<br />
=== attrTemplate ===<br />
===== Allgemeines =====<br />
Für gängige Tasmota-Geräte stehen ''templates'' bereit, mit denen sich diese schnell konfigurieren lassen. <br />
Beachten Sie dazu den Abschnitt ''attrTemplate'' in [[MQTT2 DEVICE#attrTemplate|MQTT2_DEVICE]]. Bei Anwendung eines template mit "split" im Namen werden dabei weitere Geräte angelegt und konfiguriert.{{Hinweis|Bitte attrTemplates nicht verwechseln mit templates, die auf den Tasmota- bzw. Blackadder-Seiten angeboten werden, welche zur Konfiguration der firmware genutzt werden können! Es sollte zunächst die firmware korrekt eingerichtet werden, so dass das Gerät selbst direkt auf dessen Web-Interface korrekt bedient werden kann.}}<br />
<br />
===== Kein passendes attrTemplate vorhanden? =====<br />
Exisitert (noch) kein passendes attrTemplate, ist zu empfehlen, zunächst das "''tasmota_basic''" anzuwenden. Dieses führt einige Basiskonfigurationen durch, die für FHEM hilfreich sind, z.B. wird die firmware so eingestellt, dass Schaltzustände in Kleinschreibung übermittelt werden, statt der defaults "ON" bzw. "OFF".<br />
<br />
Allerdings stellt dieses das ''autocreate'' an dem MQTT2_DEVICE auf 0, was dann nicht optimal ist, wenn man weitere Readings aus dem Gerät erwartet, etwa, weil zusätzliche Sensoren vorhanden sind. In diesem Fall empfiehlt es sich, das ''autocreate''-Attribut an dem MQTT2_DEVICE zu löschen, damit alle weiteren Informationen verarbeitet werden und ggf. im ''jsonMap''-Attribut nur die Angabe "''POWER1:state''" zu belassen.<br />
<br />
=== on-for-timer ===<br />
Um z.B. ein Relais nur für einen Zeitraum anzuschalten, kann man bei Tasmota-Geräten zwischen mehrere Varianten wählen. Ohne speziellen ''setter'' in der ''setList'' werden die '''SetExtensions''' verwendet. Timer laufen damit innerhalb FHEM. Da diese intern als temporäres [[at]] ausgeführt werden, sind diese auch noch nach einem FHEM-Neustart vorhanden, sofern FHEM ordnungsgemäß beendet und neu gestartet wird.<br />
<br />
Die Tasmota-firmware bietet ergänzend dazu zwei Möglichkeiten an, bei denen der Timer direkt auf dem ESP-Microcontroller verwaltet wird:<br />
<br />
==== delay ==== <br />
Zeile zur Erweiterung der ''setList'' (Attributeingabe via FHEMWEB!):<br />
on-for-timer {my $duration = $EVTPART1*10; 'cmnd/DVES_575127/Backlog POWER1 1; delay '.$duration.'; POWER1 0'}<br />
<br />
Ohne Auswirkungen auf alles, was danach kommt, hat aber den Nachteil, dass die möglichen Zeitspannen auf 3600 1/10 Sekunden begrenzt sind (siehe [https://tasmota.github.io/docs/Commands/#delay Commands - Tasmota Delay]), also 6 Minuten.<br />
<br />
====pulseTime ====<br />
Zeile zur Erweiterung der ''setList'' (s.o.):<br />
on-for-timer {my $duration = $EVTPART1 < 11.2 ? $EVTPART1*10 : $EVTPART1+100; 'CMNDTOPIC/Backlog pulseTime1 '.$duration.'; POWER1 1'}<br />
Auch hier sind die möglichen längsten Einschaltdauern begrenzt, allerdings ist diese mit 18h deutlich länger als mit ''delay''. Diese Implementierung hat den Nachteil, dass der ESP-Microcontroller die jeweils letzte pulseTime auch für alle weiteren "normalen" Einschaltvorgänge berücksichtigt, das Relais also ebenfalls nach Ablauf der übermittelten pulseTime abgeschaltet wird; dies gilt allerdings ohne explizites ''save'' nur bis zum nächsten reboot des Microcontrollers.<br />
<br />
=== zigbee2tasmota ===<br />
[https://tasmota.github.io/docs/Zigbee/ zigbee2tasmota] ist eine Erweiterung der Tasmota-firmware für Microcontroller, insbesondere dem ESP8266 (und ESP32)(link), über die einige ZigBee-Chipsätze (insbesondere TI CC2530) als [[ZigBee#Koordinator_.28ZigBee_coordinator.2C_ZC.29|Coordinator]] eingebunden werden können, um ein ZigBee-Netzwerk aufzubauen.<br />
{{Hinweis|Stand 08/2020 war die Einbindung anderer Chipsätze erst in einem Alpha-Stadium; die Zahl der über einen CC2530 einbindbaren ZigBee-Geräte ist daher derzeit relativ begrenzt (ca. 16)!}}<br />
Auch für diese Lösung stehen einige ''attrTemplate'' zur Verfügung. Nähere Informationen hierzu sind dem Artikel [[Zigbee2Tasmota-MQTT]] zu entnehmen.<br />
<br />
== ESPurna ==<br />
ESPurna ist eine weitere alternative firmware für ESP8266-basierte Geräte, Details sind der [https://github.com/xoseperez/espurna/wiki Projektseite] zu entnehmen.<br />
<br />
Das Format, in dem ESPurna Daten sendet, unterscheidet sich v.a. darin, dass bool'sche Werte als 0 oder 1 gesendet werden, und nicht wie sonst üblich als "on" oder "off" oä.. Es stehen einige Mustertemplates zur Verfügung, um diese Art der Payload in FHEM-konforme Werte zu überführen.<br />
<br />
== Shelly ==<br />
=== Vorbemerkung ===<br />
Auch für Shelly-Geräte steht eine Auswahl an [[MQTT2-Module - Praxisbeispiele#attrTemplate_2|templates]] bereit.<br />
Beachten Sie auch hier, dass uU. bei Anwendung eines template mit "split" im Namen weitere Geräte angelegt und konfiguriert werden.<br />
<br />
Standardmäßig senden die Shelly-Geräte ihren kompletten Status alle 30 Sekunden. Dies kann man über den Parameter ''mqtt_update_period'' in den ''settings'' ändern, allerdings ist dieser nur über die HTTP-Schnittstelle des Shelly verfügbar. Um diese Statusupdates abzustellen, kann über den Browser folgender Befehl verwendet werden:<br />
http://<ip-des-shelly>/settings?mqtt_update_period=0, <br />
Soweit bekannt, werden dann nur statische updates ausgeschaltet, z.B. für das Relay bzw. angeschlossene Taster oder Schalter; insbesondere Verbrauchswerte werden dennoch aktualisiert.<br />
<br />
=== Shelly1 ===<br />
<br />
=== Shellybulb ===<br />
Zunächst muss man einen Statusupdate des Shellybulb erzwingen (Aus- und Einschalten, physikalisch oder per Web-UI), damit das Gerät bei eingeschaltetem autocreate angelegt wird. Dies sieht zunächst so aus:<br />
Internals:<br />
CFGFN <br />
CID shellybulb_3CC533<br />
DEF shellybulb_3CC533<br />
DEVICETOPIC MQTT2_shellybulb_3CC533<br />
IODev MQTT2_FHEM_Server<br />
NAME MQTT2_shellybulb_3CC533<br />
NR 246<br />
STATE ???<br />
TYPE MQTT2_DEVICE<br />
READINGS:<br />
2018-12-12 19:28:08 status_blue 0<br />
2018-12-12 19:28:08 status_brightness 61<br />
2018-12-12 19:28:08 status_effect 0<br />
2018-12-12 19:28:08 status_gain 26<br />
2018-12-12 19:28:08 status_green 0<br />
2018-12-12 19:28:08 status_ison true<br />
2018-12-12 19:28:08 status_mode color<br />
2018-12-12 19:28:08 status_red 255<br />
2018-12-12 19:28:08 status_temp 3250<br />
2018-12-12 19:28:08 status_white 0<br />
Attributes:<br />
IODev MQTT2_FHEM_Server<br />
readingList shellybulb_3CC533:shellies/shellybulb-3CC533/color/0/status:.* { json2nameValue($EVENT, 'status_') }<br />
room MQTT2_DEVICE<br />
[[Bild:MQTT2 Shellybulb.png|400px|thumb|Darstellung in FHEMWEB nach Anwendung des template]]Dann bei den set-Anweisungen das attrTemplate "shellybulb" auswählen und setzen. Es erscheint eine Abfrage, ob die vorhandenen Readings gelöscht werden sollen. Diese bitte bestätigen und die Seite neu laden. Danach einmal An- und Ausschalten, damit die Readings auch durch einen neuen Status initialisiert werden und die Seite im Browser neu laden.<br />
<br />
=== Shelly Plug S ===<br />
Über die Leistungsmessung des Shelly Plug S lässt sich sehr einfach auch eine Erkennung des Betriebszustandes des angeschlossenen Gerätes realisieren. Dazu stellt man zuerst fest, wieviel Leistung das Gerät in jedem Betriebszustand verbraucht und kann dann z.B. für einen angeschlossenen Fernseher, der im Standby 1 Watt und im Betrieb > 100 Watt verbraucht, den Zustand erkennen und als on/off Status anzeigen. Dazu wird das state Reading wie folgt definiert:<br />
attr readingList shellies/shellyplug-s-123456/relay/0/power:.* { { state => $EVTPART0<100?"off":"on" } }<br />
Der Status des MQTT2 Devices zeigt dann bei <100W "off" und sonst "on" an.<br />
<br />
=== HTTP-Commands ===<br />
In diesem {{Link2Forum|Topic=102369|LinkText=Forumsbeitrag}} wird eine Lösung vorgestellt, um über [[99 myUtils anlegen|myUtils-Code]] weitere Kommandos bereitzustellen, die sonst nur direkt über das Web-Interface zu erreichen sind.<br />
<br />
== OpenMQTTGateway ==<br />
Um verschiedene Systeme wie BLE usw. auf MQTT zu bringen bietet sich [https://github.com/1technophile/OpenMQTTGateway OpenMQTTGateway] an, z.B. wird für das Auslesen vieler BLE-Seonsoren lediglich ein ESP32-Board ohne Zusatzhardware (ab ca. 5,- Euro in Fernost erhältlich) benötigt, auf das dann eine vorkompilierte firmware geflasht wird (hierfür wird ein USB-seriell-Wandler benötigt).<br />
<br />
Nähere Details sind im Artikel [[OpenMQTTGateway]] zu finden.<br />
<br />
== 8-Port-Ethernet Board ==<br />
<gallery><br />
datei:8-relais-ethernetboard closed.jpg|mit Gehäuse<br />
datei:8-Port-MQTT-Relais-Board.jpg|ohne Gehäuse<br />
</gallery><br />
In diesem {{Link2Forum|Topic=107536|Message=1016379|LinkText=Forenbeitrag}} bzw. dem betreffenden Thread wurde ein Relais-Board vorgestellt, mit dem 8 Relais über Ethernetkabel verbunden werden, die Kommunikation erfolgt dann über MQTT. Über die verwendete Software ist wenig bekannt, es könnte jedoch sein, dass diese Art der Einbindung auch bei weiteren Boards funktioniert, die einen bestimmten Ethernet-Chipset von TI (DP83848) und eine Cortex M3 MCU verwenden.<br />
<br />
== Milight-Bridge ==<br />
=== Vorbemerkung ===<br />
Der [https://github.com/sidoh/esp8266_milight_hub esp8266_milight_hub] ist ein open source- Projekt, mit dem auf Basis von ''openmili'' eine Vielzahl von MiLight-Geräten gesteuert werden können. Der MiLight-Hub erstetzt dabei eine beliebige Zahl von Milight-Bridges und ist auch zu verschiedenen Versionen des MiLight-Protokols kompatibel.<br />
Neben MQTT kann dieser auch mit HTTPMOD oder Wifilight (bzw. den MiLight-Modulen) gesteuert werden. Die Hardware entspricht dabei im Wesentlichen einem MySensors-Wifi-Gateway<ref>Es wird lediglich ein anderer CS-PIN genutzt. Dies kann einfach in der Web-Oberfläche der Firmware umgestellt werden.</ref>.<br />
Hier wird vorausgesetzt, dass eine funktionierende Bridge vorhanden ist.<br />
Der Vorteil der MQTT-Lösung liegt darin, dass man bei kompatiblen Fernbedienungen auch direkt Informationen über Schaltvorgänge erhält, die mit der Fernbedienung ausgelöst werden.<br />
<br />
=== Einstellungen am MiLight-Hub ===<br />
Die zum FHEM-Server bzw. dem MQTT2_SERVER passenden Vorgaben sind im Web-Interface des Hub einzustellen. Gegebenenfalls passen Sie die vom Hub zurückzugebenden Elemente im Web-Interface des Hub an.<br />
Die Einstellungen für ''MQTT topic pattern'' usw. können auf den default-Werten<ref>Diese sind: <br>''milight/:device_id/:device_type/:group_id'' für "topic pattern"<br>''milight/updates/:hex_device_id/:device_type/:group_id'' für "update topic pattern"<br>''milight/states/:hex_device_id/:device_type/:group_id'' für "state topic pattern". Der Autor hat derzeit folgende Infotypen zum Senden markiert: "status, brightness, hue, color, mode, color_temp, bulb_mode, computed_color, hex_color" (enthält eventuell zu viele Angaben. Bei einem Eventhandler muss man uU. darauf achten, dass kurz hintereinander zweimal dasselbe Event kommen kann (für ON/OFF)).</ref> belassen werden, für die seit Mitte 2019 vorhandene Option, eine LWT-Message zu senden (''MQTT Client Status Topic''), tragen Sie ''milight/LWT'' ein und aktivieren ''Detailed''.<br />
<br />
=== FHEM-Devices ===<br />
[[Bild:MQTT2 MiLight.png|400px|thumb|Milight: Darstellung in FHEMWEB]]<br />
==== Bridge ====<br />
Wird nun über den Hub oder eine von diesem erkannte Fernbedienung ein vorhandenes Leuchtmittel geschaltet, wird bei eingeschaltetem autocreate ein erstes Device erstellt, die zunächst erstellte Definition sieht typischerweise etwa so aus:<br />
defmod MQTT2_milight_hub_1370325 MQTT2_DEVICE milight_hub_1370325<br />
attr MQTT2_milight_hub_1370325 IODev MQTT2_FHEM_Server<br />
attr MQTT2_milight_hub_1370325 readingList milight_hub_1370325:milight/updates/0xBE59/rgbw/1:.* { json2nameValue($EVENT, '1_', $JSONMAP) }<br />
attr MQTT2_milight_hub_1370325 room MQTT2_DEVICE<br />
<br />
Auf dieses Device wird nun das ''template'' '''esp_milight_hub_bridge''' angewandt.<br />
<br />
==== Einzelne Leuchtmittel ====<br />
<br />
Wird nun nochmals das oben verwendete Leuchtmittel geschaltet, erstellt autocreate ein weiteres Device:<br />
defmod MQTT2_milight_0xBE59_1 MQTT2_DEVICE milight_0xBE59_1<br />
attr MQTT2_milight_0xBE59_1 IODev MQTT2_FHEM_Server<br />
attr MQTT2_milight_0xBE59_1 readingList milight/states/0xBE59/rgbw/1:.* { json2nameValue($EVENT, '1_', $JSONMAP) }<br />
attr MQTT2_milight_0xBE59_1 room MQTT2_DEVICE<br />
<br />
Auf dieses wird nun eines der Bulb-templates angewendet. Wählt man das template X_01_esp_milight_hub_rgbw_bulb, wird eine einfache Variante erstellt, die neben einem toggelnden Icon nur Regler für Helligkeit, die Farbe und zwei Schaltflächen für den Weiß- und Nachtmodus enthält. Wer mehr oder andere Steuerelemente erhalten möchte, verwendet ein anderes template. Nicht benötigte Elemente kann man dabei einfach aus der Definition löschen.<br />
<br />
Alle weiteren Devices werden genauso erstellt. <br />
<br />
Um ein Device zu erhalten, mit dem sich alle Kanäle gleichzeitig steuern lassen, kann das template ''X_01a_esp_milight_hub_make_rgbw_group'' verwendet werden. Dieses verändert nicht das aktuelle Device, sondern erstellt '''eine Kopie''', die dann modifiziert wird. Diese Kopie ist unter dem Namen ''milight_<RemoteID>_0'' im selben Raum zu finden wie das Ausgangsgerät und kann ebenfalls an die eigenen Wünsche angepasst werden. <br />
<br />
Weitere Beispiele:<br />
Beispiel für ein RGB-CCT-Device:<br />
defmod Licht_Wz_all MQTT2_DEVICE<br />
attr Licht_Wz_all IODev MQTT2_Broker<br />
attr Licht_Wz_all eventMap /set_white:Weiss/night_mode:Nacht/white_mode:white/on:on/off:off/ON:on/OFF:off/next_mode:Mode/mode_speed_up:Up/mode_speed_down:Down/<br />
attr Licht_Wz_all group Licht<br />
attr Licht_Wz_all icon light_control<br />
attr Licht_Wz_all readingList milight/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\<br />
milight/updates/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\<br />
milight/states/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\<br />
<br />
attr Licht_Wz_all room Wohnzimmer<br />
attr Licht_Wz_all setList on milight/0x5D02/rgb_cct/0 {"status":"ON"}\<br />
off milight/0x5D02/rgb_cct/0 {"status":"OFF"}\<br />
level milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
hue:colorpicker,HUE,0,1,359 milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
command:uzsuSelectRadio,Weiss,Nacht,Mode,Up,Down milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
brightness:colorpicker,BRI,0,1,255 milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
next_mode milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
mode_speed_up milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
mode_speed_down milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
saturation:colorpicker,BRI,0,1,100 milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
color_temp:colorpicker,CT,153,1,370 milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
device_id milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
effect milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
mode milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
commands milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}<br />
attr Licht_Wz_all sortby 1<br />
attr Licht_Wz_all webCmd command:brightness:saturation:color_temp:hue<br />
attr Licht_Wz_all webCmdLabel command\ <br />
:brightness:saturation\<br />
:color_temp:hue<br />
==== Ein Leuchtmittel, mehrere Fernbedienungen ====<br />
Pairt man mehrere Fernbedienungen mit einem Leuchtmittel, sollten auch alle entsprechenden Fernbedienungscodes in das readingList-Attribut übernommen werden. Dazu übernimmt man am einfachsten die Einträge aus den zusätzlichen MQTT2_DEVICEs. Benötigt man das zusätzliche Device nicht separat, um z.B. eine getrennte Gruppenschaltung zu realisieren, kann man dieses löschen. Beispiel-readingList für ein Device, das auf zwei Fernbedienungscodes und zwei Gruppen "hört":<br />
<br />
attr Licht_Wz_all readingList milight/states/0x1234/rgbw/2:.* {json2nameValue($EVENT) }\<br />
milight/updates/0x1234/rgbw/2:.* { json2nameValue($EVENT) }\<br />
milight/states/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\<br />
milight/updates/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\<br />
milight/states/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\<br />
milight/updates/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\<br />
milight/states/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }\<br />
milight/updates/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }<br />
<br />
==== Fernbedienung als Input-Device nutzen ====<br />
In diesem {{Link2Forum|Topic=103493|LinkText=Thread}} ist dargestellt, wie man eine Fernbedingung des Typs FUT089 dazu verwenden kann, einen [[MPD]] oder Rollladenaktoren zu steuern, oder diese Fernbedienung für [[Hue#HUE-Device|HUEDevice]]-Leuchtmittel zu nutzen.<br />
Um hier nur Differenz-Meldungen direkt an die betreffende myUtils-Funktion zu übergeben und doppelte Events zu verhindern, sollte hier die readingList so angepasst werden, dass nur Messages aus dem "updates"-Zweig ausgewertet werden: <br />
defmod MiLight_RC1_0 MQTT2_DEVICE milight_0xABCD_0<br />
attr MiLight_RC1_0 readingList milight/states/0xABCD/fut089/[0-8]:.* {}<br />
milight/updates/0xABCD/fut089/0:.* { FHEM::attrT_MiLight_Utils::MPDcontrol('myMPD',$EVENT, 'Yamaha_Main') }\<br />
milight/updates/0x5D47/fut089/1:.* { FHEM::attrT_MiLight_Utils::FUT_to_RGBW('Licht_Stehlampe_links',$EVENT) }\<br />
milight/updates/0x5D47/fut089/2:.* { FHEM::attrT_MiLight_Utils::FUT_to_RGBW('Licht_Stehlampe_rechts',$EVENT) }\<br />
milight/updates/0x5D47/fut089/3:.* { FHEM::attrT_MiLight_Utils::four_Lights_matrix($EVENT, 'Licht_WoZi_Vorn_Aussen', 'Licht_WoZi_Vorn_Mitte', 'Licht_WoZi_Hinten_Aussen', 'Licht_WoZi_Hinten_Mitte') }\<br />
milight/updates/0x5D47/fut089/4:.* { FHEM::attrT_MiLight_Utils::shuttercontrol('Jalousie_WZ',$EVENT) }\<br />
milight/updates/0x5D47/fut089/5:.* { FHEM::attrT_MiLight_Utils::shuttercontrol('Rollladen_WZ_SSO',$EVENT) }\<br />
milight/updates/0x5D47/fut089/6:.* { FHEM::attrT_MiLight_Utils::shuttercontrol('Rollladen_WZ_SSW',$EVENT) }\<br />
milight/updates/0x5D47/fut089/7:.* {}\<br />
milight/updates/0x5D47/fut089/8:.* {}<br />
attr MiLight_RC_WZ stateFormat CommandSet<br />
<br />
<br />
== eBus ==<br />
An dieser Stelle sollen lediglich die Grundzüge erläutert werden, eine ausführliche Anleitung über die Konfiguration des [[EBUS-MQTT2|eBus mit MQTT2 gibt es hier]].<br />
<br />
=== Vorbereitung und Definition am eBus ===<br />
Vorausgesetzt wird ein laufender eBus-Dämon. Dessen Einrichtung wird im Artikel [[EBUS#Software|EBUS]] beschrieben.<br />
In der Konfiguration des Dämons ( /etc/default/ebusd ) ist die Kommunikation über MQTT zu aktivieren und die Topic-Struktur festzulegen, z.B. ''ebusd/%circuit/%name''.<br />
--accesslevel=* --mqttport=1883 --mqttjson --mqtthost=IpAdresseMQTTSERVER --mqtttopic=ebusd/%circuit/%name<br />
{{Hinweis|Nachfolgend wird davon ausgegangen, dass als Vorgabe für mqtttopic ''ebusd'' verwendet wurde. Dies kann geändert werden, es wird aber dringend empfohlen, das mqtttopic in jedem Fall mit ''ebus...'' zu beginnen!}}<br />
<br />
=== Vorbereitung und Definition in FHEM ===<br />
Unabhängig von dem konkret genutzten IO-Modul (MQTT2_SERVER oder MQTT2_CLIENT) sollte an diesem '''''vor''''' den nachfolgenden Schritten zunächst das autocreate ausgeschaltet werden. Weiter sollte geprüft werden, ob es bereits MQTT2_DEVICE-Geräte gibt, die Einträge in der ''readingList'' enthalten, die vom ebus stammen. Da wir die ''readingList'' anschließend mit erweiterten JSON-Optionen erstellen wollen, müssen zumindest sämtliche ''readingList''-Attribute entsprechend bereinigt oder gelöscht werden; in der Regel ist es einfacher, diese Geräte nach dem Deaktivieren des autocreate am IO zu löschen.<br />
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT als IO nutzen, sollte für das weitere Vorgehen eine Kopie des MQTT2-"Sammeldevices" genutzt werden, und dessen ''CID'' auf ''ebusd'' geändert werden. Nach Anwendung des ebusd-splitter-templates müssen dann alle den ebus betreffenden Einträge aus der ''readingList'' des "Sammeldevices" gelöscht werden oder diese ganz gelöscht.}}Ist der ebus-Dämon lauffähig und für MQTT konfiguriert, sendet dieser regelmäßige Messages. <br />
<br />
Sind die Vorbereitungen abgeschlossen, aktivieren wir ''autocreate'' wieder, allerdings wählen wir als autocreate-Methode ''complex'' aus, da der eBus-Dämon teilweise<ref>Dies betrifft vorrangig die Statusmeldungen</ref> eine weiter verschachtelte JSON-Struktur zum Versenden der Informationen verwendet als üblich. Danach wird wie bei den anderen o.g. Geräten automatisch ein neues MQTT2_DEVICE angelegt<ref>Bei Verwendung des MQTT2_CLIENT wird dann die ''readingList'' am bereits definierten MQTT2_DEVICE aus der Kopie des "Sammeldevice" automatisch wieder erstellt bzw. gefüllt.</ref><br />
<br />
==== "ebus-Bridge" ====<br />
Auf das von ''autocreate'' erstellte MQTT2_DEVICE wird nunmehr das template ''eBus_daemon_splitter'' angewendet. Nach einiger Zeit sollte sowohl die readingList an diesem Device erweitert worden sein, wie auch ein oder mehrere neue MQTT2_DEVICE-Geräte angelegt. <br />
Dieses Device liefert zukünftig Readings zum Dämon selbst, wie dessen ''uptime'', alle weiteren am eBus angeschlossenen Teilnehmer werden dagegen zweckmäßigerweise durch ein oder mehrere weitere MQTT2_DEVICE-Geräte dargestellt. <br />
<br />
Das ''attrTemplate'' läd eine weitere ''attrTemplate''-file und [[99 myUtils anlegen|99_myUtils-Code]] vom FHEM-Server nach. Beides steht dann auch unmittelbar zur Nutzung zur Verfügung. <br />
==== "ebusd_bai" und weitere Geräte ====<br />
{{Hinweis|Der eBus-Dämon sendet nicht alle Informationen zu allen am eBus angeschlossenen Geräte automatisch. Diese müssen teilweise erst aktiv angefragt werden. Wie das im einzelnen erfolgen kann, ist dem o.g. Detailartikel zu entnehmen.}}<br />
Funktioniert die Kommunikation zwischen dem eBus-Dämon und FHEM, sollte nach einigen Minuten zumindest ein weiteres Gerät namens ''MQTT2_ebus_bai'' angelegt worden sein.<br />
<br />
== Sonos2Mqtt ==<br />
Aus einem Versuch heraus ist ein {{Link2Forum|Topic=111711|LinkText=kleines Projekt}} geworden: Die Sonos Umgebung mit Hilfe von sonos2mqtt als generisches MQTT2_DEVICE komfortabel in FHEM einzubinden.<br />
<br />
Mit Hilfe von ein paar Templates ist die grundlegende Einbindung in FHEM nach einer kleinen Installation auf Systemebene schnell erledigt. Es läuft derzeit noch zahlreiche Entwicklung und Ideenfindung, die Fortschritte sind live im Thread oder [[Sonos2mqtt|konsolidiert im Wiki]] zu finden.<br />
<br />
=== Setup im System ===<br />
Für dies Funktion wird der nodejs Server [https://github.com/svrooij/sonos2mqtt sonos2mqtt] benötigt. Entweder installiert man den lokal, irgendwo im Netzwerk oder nutzt den [[MQTT2-Module - Praxisbeispiele#Verwendung des Docker Containers|Docker Container.]]<br />
<br />
Der nodejs Server sonos2mqtt kann aus Sicht von FHEM irgendwo im Netzwerk stehen - aber er muss im gleichen Netzwerk wie die Sonosplayer stehen. Das UPNP Sonosnetzwerk funktioniert nicht über Netzwerksegmente hinweg.<br />
<br />
Eine Beschreibung aller Startparameter für sonos2mqtt findet man [https://svrooij.io/sonos2mqtt/getting-started.html in der offiziellen Doku].<br />
<br />
Erreicht der nodejs Server sonos2mqtt den MQTT Server nicht über - default: localhost, Port 1883, keine Anmeldung" - muss der Parameter --mqtt gesetzt werden! <br />
<br />
Beispiele:<br />
:<code>--mqtt mqtt://myuser:the_secret_password@192.168.0.3:1800</code> # alles gesetzt<br />
:<code>--mqtt mqtt://192.168.0.3:1800</code> # IP Adresse und Port gesetzt, keine Anmeldung am MQTT Server<br />
:<code>--mqtt mqtt://192.168.0.3</code> # IP Adresse gesetzt, Port ist Standard 1883<br />
<br />
Erfolgt der Start mit pm2, werden die Parameter mit einem ''zusätzlichen'' doppelten Bindestrich (--) hinter dem nodejs Modul übergeben.<br />
<br />
Beispiel:<br />
<syntaxhighlight lang="perl"><br />
pm2 start sonos2mqtt -- --mqtt mqtt://myuser:the_secret_password@192.168.0.3:1800<br />
</syntaxhighlight><br />
<br />
'''Lokales Setup'''<br />
<br />
Voraussetzung: nodejs und pm2 ist installiert und für alle Benutzer verfügbar. <syntaxhighlight lang="bash"><br />
sudo npm install -g sonos2mqtt<br />
</syntaxhighlight><br />
Je nach Entwicklungsstand sind auch Betaversionen verfügbar. Für aktuelle Betaversionen wird dieser Zusatz beim Setup verwendet. -> sonosmqtt@3.1.0-beta.1<br />
<br />
Wird der sonos2mqtt Server auf einer anderen Maschine eingerichtet, ist der Start entsprechend diesem Absatz [[MQTT2-Module - Praxisbeispiele#Autostart von sonos2mqtt im System mit pm2 .28Alternative.29|Autostart von Sonos2mqtt im System mit pm2]] einzurichten.<br />
<br />
=== Setup in FHEM ===<br />
Man definiert lediglich ein Bridge Device, der Rest wird automatisch erledigt.<br />
<br />
Voraussetzung: <br />
* autocreate im System ist aktiv. <br />
* Der verwendete MQTT2_SERVER steht auf '''autocreate simple''' (default/Standard).<br />
* Templates aktuell kann man leicht in der FHEM Kommandozeile aktualisieren:<br />
<pre><br />
{ Svn_GetFile("FHEM/lib/AttrTemplate/mqtt2.template", "FHEM/lib/AttrTemplate/mqtt2.template", sub(){ AttrTemplate_Initialize() }) }<br />
</pre><br />
Bei der Anwendung des Templates für die Bridge wird das Attribut devicetopic ausgelesen oder auf default sonos gesetzt! Wird ein anderer Devicetopic verwendet, muss der bei der Anlage der Bridge gesetzt werden!<br />
<br />
'''Achtung dieser Code muss "am Block" in der Raw Def ausgeführt werden!'''<br />
# man kopiert diesen Codeblock, <br />
# drückt im [[Raw definition|Webinterface]] das große {{Taste|+}},<br />
# und fügt den Code ins Editorfenster ein. <br />
# Dort muss/kann man die persönlichen Anpassungen machen. <br />
# Zum Abschluss execute - fertig<br />
Im folgenden Code muss der Name des MQTT2 Servers ersetzt werden! <br />
<syntaxhighlight lang="perl"><br />
define SonosBridge MQTT2_DEVICE<br />
attr SonosBridge room MQTT2_DEVICE<br />
set SonosBridge attrTemplate sonos2mqtt_bridge_comfort<br />
</syntaxhighlight><br />
Das Template sonos2mqtt_bridge_comfort:<br />
* setzt das Template sonos2mqtt_bridge auf das Device,<br />
* lädt die Datei 99_sonos2mqttUtils.pm aus dem contrib Ordner nach,<br />
* definiert ein notify, dies erledigt im weiteren Betrieb die automatische Konfiguration der automatisch erzeugten MQTT2_DEVICEs. <br />
** mit dem Template sonos2mqtt_speaker (das Template kann auch manuell auf vorhandene Player angewendet werden, die automatische Erzeugung der Player wird aber empfohlen)<br />
** Ermittelt Detailinformation des jeweiligen Players (vor allem IP Adresse und Modelnumber)<br />
** Lädt die Sonosgeräte Icons von den UPNP Devices herunter<br />
** erweitert das setList input Kommando um den TV Eingang (HDMI, spdif) bzw. Line_IN Eingang falls vorhanden (Modelnumber)<br />
* Die Player werden automatisch einzeln erzeugt wenn sie mqtt Nachrichten senden (Play/Stop) oder (alle sofort) wenn der sonos2mqtt Server gestartet wird. <br />
<br />
==== Wozu dient die Bridge? ====<br />
Sie stellt ein paar wesentliche Funktionen zu Verfügung<br />
# Auffangen von nicht benötigten MQTT Nachrichten.<br />
# Erzeugung/Weiterleitung von Nachrichten für die einzelnen Player - damit auch die Erzeugung von separaten Playern nach dem Schema MQTT2_RINCON12345678901234567.<br />
# Statusanzeige sonos2mqtt als Reading connected (0 offline, 1 connected, 2 Player connected).<br />
Sie kann zusätzlich als zentrales Device verwendet werden, um die Sonos Umgebung abzubilden, z.B. Readings für Favoriten u.ä.<br />
<br />
==== Start sonos2mqtt lokal ====<br />
Der Start / Stop des sonos2mqtt Servers innerhalb von FHEM ist nur lokal simpel möglich. Ist der Server irgendwo im Netzwerk oder im Docker Container, muss man andere Möglichkeiten finden. Der Neustart aus FHEM ist zwar praktisch, aber nicht erforderlich. <br />
<br />
Wird eine existierenden Sonos Landschaft inhaltlich verändert (Player dazu/weg), muss der Server neu gestartet werden. Werden Player temporär abgeschaltet, merkt das der Server nach einer Zeit selbst, oder man forciert dies mit einem CheckSubscription an der Bridge.<br />
<br />
Soll das Modul sonos2mqtt mit seinen default Einstellungen gestartet werden, genügt dieser kurze Befehl (in der FHEM Kommandozeile):<br />
<syntaxhighlight lang="bash"><br />
"pm2 start sonos2mqtt"<br />
</syntaxhighlight><br />
Tipp: Verwendet man anstatt "Befehl" den Syntax {qx(Befehl)} in der FHEM Kommandozeile, wirkt der Befehl zwar blockierend aber die Ausgabe erfolgt im Browser und nicht im Logfile. Mit dem Parameter -s erfolgt keine Ausgabe.<br />
<br />
==== Autostart von sonos2mqtt mit FHEM ====<br />
Der Code startet sowohl das sonso2mqtt Modul sofort und implementiert ein notify für den zukünftigen automatischen Start beim Start von FHEM.<br />
<syntaxhighlight lang="perl"><br />
define n_pm2_sonos notify global:INITIALIZED|n_pm2_sonos:start "pm2 -s start sonos2mqtt"<br />
trigger n_pm2_sonos start<br />
</syntaxhighlight> <br />
<br />
=== Autostart von sonos2mqtt im System mit pm2 (Alternative) ===<br />
Der obige Code startet das sonos2mqtt nodejs Modul mit pm2 beim Start von FHEM. Sollte das nicht funktionieren oder nicht ins gesamte Konzept passen (weil z.B. mehrere nodejs Module geladen werden) kann der automatische Start direkt im System erfolgen. Zunächst dafür das oben eventuell schon definierte notify löschen!<syntaxhighlight lang="perl"><br />
delete n_pm2_sonos<br />
</syntaxhighlight>Der Start des Modul muss nicht mit erhöhten Rechten geschehen! Im Terminal folgendes eingeben (unter dem angemeldeten Benutzer wird sonos2mqtt später immer gestartet):<syntaxhighlight lang="bash"><br />
pm2 start sonos2mqtt<br />
pm2 startup<br />
</syntaxhighlight><br />
Der letzte Befehl "redet", d.h. es gibt eine Ausgabe in der Art:<br />
<syntaxhighlight lang="bash"><br />
[PM2] To setup the Startup Script, copy/paste the following command:<br />
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi<br />
</syntaxhighlight><br />
Man tut einfach genau das, was dasteht: die letzte Zeile kopieren und wieder einfügen und ausführen. Danach muss man die Konfiguration von pm2 noch sichern:<br />
<syntaxhighlight lang="bash"><br />
pm2 save<br />
</syntaxhighlight><br />
<br />
=== Verwendung des Docker Containers ===<br />
Beim Container findet die Konfiguration der Verbindung zum FHEM in den Environment Variablen statt:<br />
<syntaxhighlight lang="perl"><br />
environment:<br />
- SONOS2MQTT_DEVICE=192.168.56.207 # hier muss einer der Sonos Lautsprecher stehen<br />
- SONOS2MQTT_MQTT=mqtt://192.168.56.121:1883 # mqtt2_server FHEM, erweiterter Syntax siehe oben<br />
- SONOS_LISTENER_HOST=192.168.56.121 # Docker host IP<br />
</syntaxhighlight><br />
<br />
=== Sonos2mqtt mit mehr Komfort ===<br />
Im Wiki Artikel [[Sonos2mqtt]] geht es weiter.<br />
<br />
== Owntracks GPS Tracking in FHEM ==<br />
Das hier gezeiget Beispiel verwendet eine MQTT Instanz im Internet, die mit einem MQTT2_CLIENT angebunden wird. Da wenig Traffic benötigt wird, genügt z.B. eine kostenfreie Instanz z.B. bei myqtthub (Stand. Dezember 2020)<br />
<br />
Alternativ kann man einen MQTT2_SERVER auch direkt verfügbar machen, wenn man sich sicher ist was man da tut! Siehe {{Link2Forum|Topic=99666|Message=1028576|LinkText=diesen Forenbeitrag}}. Das Bridge Device wird dabei genau so benötigt, nur der IODev ist dann der MQTT2_SERVER.<br />
<br />
=== owntracks auf dem Smartphone konfigurieren ===<br />
Menü / Einstellung / Verbindung <br />
<br />
Dort sind insgesamt 4 Registerkarten mit Werten zu füllen (Beispiel):<br />
* Modus -> MQTT<br />
* Hostname -> <br />
** Hostnamen: host.cloud.com <br />
** Port: 8883 <br />
** ClientID: ID vom Provider <br />
** WebSockets (nicht nutzen)<br />
* Identifikation -> <br />
** Benutzername: user-name <br />
** Passwort: user-password <br />
** GeräteID: mi6 (erscheint in FHEM im Device Namen verwendet)<br />
** TrackerID: hk (nur zweistellig, erscheint als ID in der owntracks Karte)<br />
* Sicherheit -> TLS aktivieren<br />
=== Definition in FHEM ===<br />
Der MQTT2_CLIENT wird so eingerichtet, man braucht eine andere ClientID als auf dem Smartphone! Stimmt alles sollte das Gerät sofort open anzeigen.<syntaxhighlight lang="perl"><br />
MQTT2_CLIENT einrichten, autocreate simpel<br />
define mqtt2Cloud MQTT2_CLIENT host.cloud.com:8883<br />
attr mqtt2Cloud SSL 1<br />
attr mqtt2Cloud autocreate simple<br />
attr mqtt2Cloud clientId fhem1<br />
attr mqtt2Cloud room MQTT2_IO<br />
attr mqtt2Cloud username user-name<br />
set mqtt2Cloud password user-password<br />
</syntaxhighlight>Für die automatische Erzeugung der Trackergeräte in FHEM richtig man zuerst ein Bridge Device ein:<syntaxhighlight lang="perl"><br />
define MQTT2_Cloud_bridge MQTT2_DEVICE<br />
attr MQTT2_Cloud_bridge IODev mqtt2Cloud<br />
attr MQTT2_Cloud_bridge autocreate 1<br />
attr MQTT2_Cloud_bridge room MQTT2_DEVICE<br />
</syntaxhighlight>Dies wird entweder mit dem Template allgemein konfiguriert<syntaxhighlight lang="perl"><br />
set MQTT2_Cloud_bridge attrTemplate MQTT2_CLIENT_general_bridge<br />
</syntaxhighlight>oder manuell nur für owntracks eingerichtet<syntaxhighlight lang="perl"><br />
attr MQTT2_Cloud_bridge bridgeRegexp owntracks/[^/]+/([^/:]+).* "owntracks_$1"<br />
</syntaxhighlight>MQTT2 Geräte für owntracks werden jetzt automatisch mit dem Namen MQTT2_owntracks_<GeräteID> erzeugt. Diese werden einfach mit dem Template owntracks_device fertig konfiguriert. Bei einem IOS Gerät kann man danach noch das Template owntracks_device_IOS als Erweiterung anwenden.<br />
<br />
==== Anwesenheitserkennung ====<br />
Die Anwesenheit kann im owntracks Device direkt für die selbst definierten Plätze abgelesen werden: entweder steht im reading place der jeweilige Ort oder away. Um hier noch eine gewisse Einheitlichkeit in der Verwendung zu bekommen kann man ein PRESENCE Device verwenden: <syntaxhighlight lang="perl"><br />
define OT_Mi6 PRESENCE event MQTT2_owntracks_mi6:place:.away MQTT2_owntracks_mi6:place:.<Home><br />
</syntaxhighlight>Im Move Modus erfolgt die Erkennung sehr schnell und damit einige Sekunden eher als eine BT Erkennung im Haus - der Akkuverbrauch steigt enorm. Im Significant Modus kann es schon mal ein paar Minuten dauern - ein relevanter Akku Verbrauch ist nicht erkennbar.<br />
<br />
== Allgemeine Hinweise ==<br />
=== MQTT2_SERVER und MQTT2_CLIENT für Debugging nutzen ===<br />
Nutzt man das rawEvents-Attribut am MQTT2-IO<ref>z.B. <code>attr MQTT2_FHEM_Server rawEvents .*</code>, der regex-Filter kann wie üblich angepasst werden</ref>, kann man den Datenverkehr des Servers am Event-Monitor mitschneiden. Dies ist insbesondere für unbekannte Geräte nützlich, deren Topic- und Payload-Struktur noch nicht bekannt ist.<br />
Um den kompletten MQTT Datenaustausch mitzuschneiden, kann man mit <code>attr mqtt2_server verbose 5</code> auch alles ins FHEM-Log schreiben lassen.<br />
<br />
=== autocreate funktioniert anscheinend nicht? ===<br />
In der Regel wird bei neu eingehenden MQTT-Messages über ''autocreate'' ein neues Device erstellt, wenn Nachrichten von einem bisher unbekannten Gerät kommen. Geschieht dies nicht, sollten folgende Punkte geprüft werden:<br />
# (nur bei MQTT2_SERVER:) Der Client muss eine ClientID angeben, diese darf nicht den defaults von ''mosquito_sub'' entsprechen.<br />
# Ein allgemeines {{Link2CmdRef|Anker=autocreate|Lang=en|Label=autocreate}}-Device (''TYPE=autocreate'') muss vorhanden und aktiv sein.<br />
# ''autocreate'' am IO muss eingeschaltet sein, was für MQTT2_SERVER bedeutet, dass es nicht auf "0" stehen darf (hier ist dann ''simple'' die aktive Voreinstellung), für MQTT2_CLIENT sollte ebenfalls ''simple'' verwendet werden; dies muss hier allerdings explizit gesetzt werden.<br />
<br />
Wird dann immer noch kein Device erstellt, gibt es in aller Regel ein Device, das bereits einen entsprechenden Eintrag in der readingList enthält, oder es sind keine Nachrichten eingegangen. Überprüfen Sie daher dann ggf. die Einstellungen am Client-Gerät (z.B. im Web-Interface des Shelly oder Tasmota-geflashten ESP8266).<br />
<br />
Das ''autocreate'' am Device schließlich bestimmt, ob die ''readingsList'' erweitert werden darf, wenn Informationen über bisher nicht über die readingList abgedeckte Topics empfangen werden und vom MQTT2-IO als zu diesem Device/ClientID gehörend identifiziert wurden.<br />
<br />
=== attrTemplate ===<br />
Zur Konfiguration von MQTT2_DEVICE-Geräten kann die Funktion ''[[AttrTemplate|attrTemplate]]'' genutzt werden. <br />
Die Anwendung für MQTT2_DEVICE ist [[MQTT2 DEVICE#attrTemplate|hier]] beschrieben.<br />
<br />
{{Hinweis|In einigen Fällen kann es vorkommen, dass die template-Bezeichnung zwischenzeitlich geändert wurde. Seit 21.09.2019 erfolgt die Sortierung der auswählbaren templates nicht mehr nur nach den Namen, so dass die entsprechenden Namensbestandteile entfallen sind, die einer besseren Sortierung dienten.}}<br />
<br />
=== attrTemplate: Es werden nicht alle templates angezeigt ===<br />
Siehe Beitrag [[AttrTemplate#Warum finde ich das Template xyz nicht.3F|AttrTemplate: Warum finde ich das Template xyz nicht.]]<br />
<br />
=== attrTemplate und Sprachsteuerung ===<br />
Konfiguriert man MQTT2_DEVICE-Geräte mit attrTemplate, werden in der Regel auch direkt die für die Sprachsteuerung der Geräte erforderlichen Attribute mit gesetzt. Weiterführende Hinweise sind auch zu diesem Teilaspekt von ''[[AttrTemplate|attrTemplate]]'' dem betreffenden Hauptartikel zu entnehmen.<br />
<br />
=== bridgeRegexp ===<br />
[[Datei:Mqtt2 server.png|300px|thumb|left|Logische Verortung der bridgeRegexp-Angaben]]{{Randnotiz|RNTyp=y|RNText=Beachten Sie, dass aufgrund des geschilderten Prinzips eine Änderung einer bridgeRegexp bei einem Gerät auch dazu führt, dass alle Readings eines Geräts und alle readingList-Einträge gelöscht werden.}}Üblicherweise werden alle Informationen, die aus einer Quelle stammen auch '''''einem''''' ''MQTT2_DEVICE'' zugeordnet, wobei im Falle des dort nicht aktivierten autocreate-Attributs entsprechende readingList-Einträge erzeugt werden. In dem nebenstehenden Schaubild wären dies die Geräte ''A'' bis ''D''. Das '''Attribut''' ''bridgeRegexp'' kann dazu genutzt werden, um neue, bisher unbekannte Topic-Strukturen im Rahmen des autocreate-Vorgangs anders zu strukturieren. Diese werden dabei im Ergebnis einem '''anderen Device''' (das ggf. erst erstellt wird) zugeschlagen, sollte eine zu der topic-Struktur passende regex in diesem Attribut gesetzt sein. Für dessen CID und die Bildung des Names wird die im 2. Teil jedes Eintrags als ''newClientId'' hinterlegte Angabe verwendet. In nebenstehendem Schaubild ist dies exemplarisch für die Gerätegruppe ''D'' mit dem ''bridge''-Device ''D'' und dessen ''Satelliten'' ''D1'' bis ''D4'' dargestellt.<br />
Dementsprechend sind in den hier aufgeführten Beispielen ''bridgeRegexp''-Attribute immer dort zu finden, wo ein Gerät oder Dienst dazu dient, mit weiteren, ggf. auf andere Weise kommunizierende Geräte oder Baugruppen zu kommunizieren, wie z.B. für über hier dargestellten ''zigbee2mqtt'' oder ''zigbee2tasmota''. Ein Sonderfall hierbei ist das template ''MQTT2_CLIENT_general_bridge'' zur Verwendung mit dem [[MQTT2_CLIENT#Anwendung|MQTT2_CLIENT]], denn aus dessen Sicht stammen alle Informationen aus derselben Quelle, nämlich z.B. dem ''mosquitto''-Server und würden sonst alle einem einem MQTT2_DEVICE zugewiesen.<br />
<br />
=== Ständig neue Devices? ===<br />
MQTT2_SERVER kann zwischen verschiedenen Geräten auch anhand der ClientID unterscheiden. Für jedes neu erkannte Gerät wird auch ein eigenes MQTT2_DEVICE angelegt. Abhilfemaßnahmen:<br />
==== Vergabe einer ClientID ====<br />
Die meisten MQTT-fähigen Geräte enthalten Optionen zur Vergabe einer eindeutigen ClientID (siehe das Beispiel des zigbee2mqtt-Dienstes oben). <br />
Wird keine ClientID vergeben, verwenden manche Clients für jede Verbindung wieder neue ID's. Es wird empfohlen, möglichst von diesen Einstelloptionen Gebrauch zu machen.<br />
<br />
==== Löschen der ClientID aus der readingList usw. ====<br />
Ist dies nicht möglich oder erwünscht, kann man auch die ClientID aus den readingList-, setList- und getList-Attributen entfernen. Dies ist jedenfalls solange unschädlich als nicht mehrere Geräte identische Topic-Pfade verwenden (daher die Empfehlung, insbesondere bei Tasmota-Geräten den ''default'' "sonoff" zu ändern).<br />
Beispielsweise wäre <code>attr Milight_Bridge readingList milight_hub_1370325:milight/LWT:.* {json2nameValue($EVENT) }</code> zu ändern in <code>attr Milight_Bridge readingList milight/LWT:.* {json2nameValue($EVENT) }</code><br />
Die über ''attrTemplate'' verfügbaren Konfigurationen verwenden in der Regel keine ClientID's bzw. entfernen diese.<br />
<br />
=== Wildcards in readingList und setList ===<br />
Auch in readingList und in setList sollten sich sog. wildcards verwenden lassen. Die Vorgehensweise ist jedoch unterschiedlich:<br />
<br />
In ''readingList'' werden normale regex-Ausdrücke verwendet. Ein Punkt steht daher z.B. für ein beliebiges Zeichen, alles zwischen zwei Topic-Tree-Elementen (getrennt typischerweise durch einen "/") kann man so schreiben: "[^/]+" (entspricht: "Mindestens ein Zeichen, das kein Schrägstrich ist"). Ergänzender Hinweis: Will man z.B. Informationen aus einem beliebigen Teil des Topic-trees extrahieren und als Reading-Namen verwenden, kann dies im Rahmen eines Perl-Aufrufs geschehen. Beispiele aus der mqtt2.template-file: OpenMQTTGateway_BT_scanner und OpenMQTTGateway_BT_gtag (letzteres überführt die Information, über welches Gateway bestimmte Informationen eingegangen ist jeweils in eigene Readings pro Gateway).<br />
<br />
In ''setList'' gelten dagegen die wildcard-Konventionen aus der MQTT-Welt. Dort steht "+" für einen austauschbaren Teil des Topic-Trees (zwischen zwei Schrägstrichen). Anmerkung: Bitte vorher prüfen, ob es wirklich sinnvoll ist, derart unspezifische Publishes vorzunehmen. Meist gibt es "Gruppen-Topics", auf die mehrere Geräte eines bestimmten Typs hören bzw. man kann dies dort (in der firmware bzw. auf den Konfigurationsseiten der Geräte) einstellen.<br />
<br />
=== Die JSON-Daten sollen ausnahmsweise nicht ausgepackt werden ===<br />
In manchen Fällen ist das automatische Auspacken der JSON-Payload nicht erwünscht. In diesen Fällen kann man einfach den gewünschten Reading-Namen in die readingList eintragen, statt der Anweisung, den JSON an json2NameValue() zu übergeben. Aus<br />
<pre><br />
attr MQTT_OwnTracks readingList owntracks/clouduser/mi6:.* { json2nameValue($EVENT) }\<br />
owntracks/clouduser/mi6/waypoints:.* { json2nameValue($EVENT) }\<br />
owntracks/clouduser/mi6/event:.* { json2nameValue($EVENT) }<br />
</pre><br />
wird dann:<br />
<pre><br />
attr MQTT_OwnTracks readingList owntracks/clouduser/mi6:.* json_mi6\<br />
owntracks/clouduser/mi6/waypoints:.* json_waypoints\<br />
owntracks/clouduser/mi6/event:.* json_event<br />
</pre><br />
Erforderlichenfalls kann man die Einträge auch doppelt erstellen, um sowohl den JSON wie auch die ausgepackten Readings zu erhalten.<br />
<br />
=== Die JSON-Daten vor dem auspacken manipulieren ===<br />
Aus diversen Gründen kann es zweckmäßig sein, einen bestimmten Wert der JSON-Payload zu ignorieren.<br />
Z.B. sendet ein Client statt eines Messwertes die Info "bad". Dieser Fehlerwert soll aus der JSON-Payload "ausgefiltert" werden:<br />
<pre><br />
attr DEVICE readingList <your topic>:.* { my $rets = json2nameValue($EVENT,'',$JSONMAP);; my %cleaned = map { $_,$rets->{$_} } grep { 'bad' ne $rets->{$_} } keys %{$rets};; return \%cleaned }<br />
</pre><br />
<br />
Oder auch einen Wert umzubenennen wenn die JSON-Payload nur ein Objekt beinhaltet:<br />
<pre><br />
attr DEVICE readingList <your topic>:.* {my %h=(0=>'SofortLaden',1=>'MinPV',2=>'NurPV',3=>'Stop',4=>'Standby');; return {ChargeMode=>$h{$EVENT}}}<br />
</pre><br />
<br />
=== Unnötige Konfigurationsinformationen verwerfen ===<br />
Siehe Einleitung und den [[MQTT2_CLIENT#ignoreRegexp|ignoreRegexp-Abschnitt zu MQTT2_CLIENT]].<br />
<br />
=== Weiterführende Themen ===<br />
==== Verbinden mehrerer FHEM-Instanzen über MQTT ====<br />
Wie im Hauptartikel zu [[MQTT#Kommunikation zu sonstigen FHEM-Geräten über MQTT|MQTT]] erläutert, gibt es mehrere Varianten, wie man mit Hilfe von FHEM aus Events an beliebigen Geräten MQTT-Messages erzeugen kann. So kann man z.B. Messdaten eines Systems über ein ''notify'' iVm. einer einfachen ''publish''-Anweisung an ein zweites FHEM schicken, das diese Daten dann z.B. mit Hilfe der MQTT2-Module auswerten kann.<br />
Damit dabei Nachrichten unterschiedlicher Quellen auch als getrennte Readings bzw. ggf. auch gesonderten MQTT2_DEVICE-Instanzen zugeordnet werden, sollte man entsprechende Topic-Strukturen wählen, die dann auch mit Hilfe einer geeigneten ''bridgeRegexp'' automatisiert ausgewertet werden kann, siehe z.B. dieser {{Link2Forum|Topic=107145|LinkText=Forumsthread}}:<br />
attr MQTT2_myMqttServer bridgeRegexp \<br />
SmartHome/MqttGenericBridge2/([A-Za-z0-9]*)/.*:.* "mgb2_$1"<br />
Dabei werden die betreffenden Informationen der entfernten FHEM-Instanz alle nach dem Schema ''SmartHome/MqttGenericBridge2/<Device-Name>/<Reading-Name>'' versendet.<br />
<br />
==== Umstellung von MQTT_DEVICE (und Derivaten wie XiaomiMQTTDevice) zu MQTT2_DEVICE ====<br />
Wer beabsichtigt, von der Implementierung MQTT+MQTT_DEVICE zu MQTT2-IO und MQTT2_DEVICE zu wechseln, sollte einige Punkte beachten. Viele diesbezügliche Fragen sind vor allem in {{Link2Forum|Topic=103762|LinkText=diesem Foren-Thread}}<br />
<br />
näher erläutert.<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=91394|LinkText=Thread, aus dem diese Anleitung ursprünglich entstanden ist}}<br />
* {{Link2Forum|Topic=91807|LinkText=Thread zum Tasmota-Device}}<br />
* {{Link2Forum|Topic=97989|LinkText=Thread, aus dem diese Anleitung für den eBus ursprünglich entstanden ist}}<br />
* {{Link2Forum|Topic=94495|LinkText=Neue templates einreichen}}<br />
* {{Link2Forum|Topic=94494|LinkText=Fragen, Wünsche und Kritik zu mqtt2.template}}<br />
<br />
== Hinweise ==<br />
<references /><br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:MQTT]]<br />
[[Kategorie:IP Components|IP Komponenten]]<br />
[[Kategorie:Other Components]]<br />
[[Kategorie:Interfaces]]</div>Otto123http://wiki.fhem.de/w/index.php?title=E-Mail_senden&diff=36191E-Mail senden2021-11-10T09:56:44Z<p>Otto123: /* Keine Mail mit TLS Verschlüsselung */</p>
<hr />
<div>Um aus FHEM heraus '''E-Mail senden''' zu können, sind abhängig von der verwendeten Platform unterschiedliche Vorgehensweisen erforderlich.<br />
{{Randnotiz|RNTyp=y|RNText=Anleitung zur Einrichtung von Exim4 auf Debian mit GMX als Smarthost:[[Media:Anleitung_Exim4_Debian_GMX.pdf|PDF]]}}<br />
== Linux ==<br />
=== FritzBox 7170 (non-chroot) oder "reine" Linuxe ===<br />
Datei 99_email.pm im Modul-Verzeichnis mit folgender Funktion anlegen (oder in bestehende 99_irgendwas.pm kopieren):<br />
<syntaxhighlight lang="perl"><br />
sub fb_mail {<br />
my $rcpt = $_[0];<br />
my $subject = $_[1];<br />
my $text = $_[2];<br />
system(&quot;/bin/echo \&quot;$text\&quot; | /usr/bin/mail send -i - -s \&quot;$subject\&quot; -t \&quot;$rcpt\&quot;&quot;);<br />
}<br />
</syntaxhighlight><br />
Aufruf dann mittels <br />
:<code>{ fb_mail('empfaenger@mail.de','Subject','text 123') }</code><br />
Darauf achten, dass der fhem-User Mails senden darf (in richtige Gruppe eintragen. Ggf. vorher einmal su fhem und probieren).<br />
<br />
=== Fritz!Box 7390 ===<br />
Auf der [[AVM Fritz!Box|FritzBox 7390]] ist diese Funktion seit 10/2012 Bestandteil der FHEM Standardauslieferung. Sie ist untergebracht in FritzBoxUtils.pm und heisst dort FB_mail($$$) (Groß-Kleinschreibung beachten).<br />
<br />
Da der Dateiname von FritzBoxUtils.pm nicht mit 99_ beginnt, wird diese Programmdatei nicht automatisch beim Start von FHEM geladen. FHEM muss zum Laden dieser Programmdatei aufgefordert werden. Dazu (z.&nbsp;B. in 99_myUtils.pm) die Zeile ''use FritzBoxUtils;'' einfügen.<br />
<br />
Mit dem Install von AVM.de wird fhem in einer chroot-Umgebung ausgeführt, die den Zugriff auf die Mailfunktion der Fritzbox nicht zulässt. Daher muss FHEM in der [http://fhem.de/fhem.html#Download Version von fhem.de] installiert sein. Sollte Ihre Fritzbox bisher mit dem install von AVM laufen, kann (nach einem backup!) das image von fhem.de einfach drüberinstalliert werden. Es sollten dabei alle Einstellungen erhalten bleiben.<br />
<br />
<syntaxhighlight lang="perl"><br />
sub fb_mail {<br />
my $rcpt = $_[0];<br />
my $subject = $_[1];<br />
my $text = $_[2];<br />
system(&quot;/bin/echo \&quot;$text\&quot; &gt; /var/tmp/fhem_nachricht.txt&quot;);<br />
system(&quot;/sbin/mailer send -i '/var/tmp/fhem_nachricht.txt' -s \&quot;$subject\&quot; -t \&quot;$rcpt\&quot;&quot;);<br />
system(&quot;rm /var/tmp/fhem_nachricht.txt&quot;);<br />
}<br />
</syntaxhighlight><br />
<br />
Aufruf dann mittels <br />
:<code>{ fb_mail('empfaenger@mail.de','Subject','text 123') }</code><br />
bzw. <br />
:<code>{ FB_mail('empfaenger@mail.de','Subject','text 123') }</code><br />
<br />
Dem Mailer können noch weitere Parameter hinzugefügt werden. Mehr dazu siehe: [http://www.wehavemorefun.de/fritzbox/Mailer Mailer]<br />
<br />
=== OpenWRT ===<br />
Die Anleitung wurde mit einer frühen Beta von Barrier Breaker (r391xx) mit einem TP_Lind WDR 4900 getestet. Da "sendEmail" nicht als Package vorliegt wird in dieser Anleitung "ssmtp" verwendet.<br />
Die Installation erfolgt mittels:<br />
<br />
<syntaxhighlight lang="bash"><br />
opkg update<br />
opkg install ssmtp_2.64-4_mpc85xx.ipk <br />
</syntaxhighlight><br />
<br />
Hierbei werden die Pakete libopenssl und zlib mit installiert. Damit ssmtp funktioniert müssen die Dateien /etc/ssmtp/ssmtp.conf und /etc/ssmtp/revaliases angepasst werden.<br />
<br />
/etc/ssmtp/ssmtp.conf <br />
<syntaxhighlight lang="text"><br />
root=arnold@gmx.net<br />
mailhub=mail.gmx.net:465<br />
rewriteDomain=gmx.net<br />
hostname=gmx.net<br />
FromLineOverride=YES<br />
UseTLS=YES<br />
#UseSTARTTLS=YES<br />
AuthUser=arnold@gmx.net<br />
AuthPass=Passwort_von_arnold@gmx.net<br />
</syntaxhighlight><br />
<br />
/etc/ssmtp/revaliases<br />
<syntaxhighlight lang="text"><br />
root:arnold@gmx.net:mail.gmx.net:465<br />
</syntaxhighlight><br />
<br />
In der [[99_myUtils_anlegen|99_myUtils]] folgende Unterroutine einfügen (von der RPi-Anleitung übernommen):<br />
<br />
<syntaxhighlight lang="perl"><br />
sub OpenWRTMail <br />
{ <br />
my $rcpt = shift;<br />
my $subject = shift; <br />
my $text = shift; <br />
my $ret = "";<br />
my $sender = "dockstar\@heye-tammo.de"; <br />
Log 1, "sendEmail RCP: $rcpt, Subject: $subject, Text: $text";<br />
$ret .= qx(echo -e 'to:$rcpt\n from:$sender\nsubject:$subject\n$text\n' | ssmtp $rcpt);<br />
$ret =~ s,[\r\n]*,,g; # remove CR from return-string <br />
Log 1, "sendEmail returned: $ret"; <br />
}<br />
</syntaxhighlight><br />
<br />
Ab hier den entsprechenden Abschnitt unter "Raspberry Pi" lesen.<br />
<br />
=== Synology DiskStation ===<br />
Beim DSM 3.2 gab es keinen <code>sendmail</code>-Befehl, sondern nur eine Funktion für den Versand der System-Benachrichtigungen. Interessanterweise funktionierte aber der <code>php-mail</code>-Befehl, so dass man mittels folgendem Modul Mails frei versenden kann:<br />
<syntaxhighlight lang="perl"><br />
sub sendmail($$$) {<br />
my($empf, $subj, $nachricht) = @_;<br />
system(&quot;php -r 'mail(\&quot;$empf\&quot;,\&quot;$subj\&quot;,\&quot;$nachricht\&quot;);'&quot;);<br />
undef;<br />
}<br />
</syntaxhighlight><br />
<br />
=== Raspberry Pi ===<br />
{{Randnotiz|RNTyp=o|RNText=In früheren Distributionen wurde das Paket sowie der Aufruf uU. mit großem "E" geschrieben: ''sendEmail''.}}Auf einem [[Raspberry Pi]] muß noch sendemail nachinstalliert werden. Diese Anleitung funktioniert ab der Stretch-Version von Raspbian bzw. '''Debian''' sowie unter '''Ubuntu''' seit ca. Version 16.04.<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get update<br />
sudo apt-get install sendemail libio-socket-ssl-perl libnet-ssleay-perl perl<br />
</syntaxhighlight><br />
<br />
Man kann die korrekte Funktion im Terminal (ohne <code>{qx()}</code> ) oder auch in der FHEM Kommandozeile testen (Hinweis: manche Provider (z.B. gmail) lassen diesen Zugang erst nach Freischaltung zu!).<br />
<syntaxhighlight lang="perl"><br />
{qx(sendemail -f 'Ab\@send.er' -t 'Emp\@faeng.er' -u 'subject' -m 'text' -a 'DateinameOderLeer' -s 'smtpFQDN:port' -xu 'MailUser' -xp 'PasswortOhneKlammeraffen')}<br />
</syntaxhighlight><br />
<br />
In der [[99_myUtils_anlegen|99_myUtils]] folgende Unterroutine einfügen:<br />
<syntaxhighlight lang="perl"><br />
######## DebianMail Mail auf dem RPi versenden ############ <br />
# $provider für SMTP Server anpassen. <br />
# Einmal in der FHEM Kommandozeile, user und password anpassen:<br />
# {setKeyValue("myEmailKonto",'user@domain');;setKeyValue("myEmailPasswrd",'password')}<br />
sub DebianMail <br />
{ <br />
my $rcpt = shift;<br />
my $subject = shift; <br />
my $text = shift; <br />
my $attach = shift; <br />
my $ret = "";<br />
my $error;<br />
my $konto = getKeyValue("myEmailKonto"); <br />
my $passwrd = getKeyValue("myEmailPasswrd"); <br />
my $from = $konto; # or use different KeyValue if konto is not the from email address<br />
my $provider = "smtp.1und1.de"; # smtp.domain.tld:port see provider documentation<br />
#Log 1, "sendEmail RCP: $rcpt";<br />
#Log 1, "sendEmail Subject: $subject";<br />
#Log 1, "sendEmail Text: $text";<br />
#Log 1, "sendEmail Anhang: $attach";<br />
if (not defined($attach)){$attach=''}<br />
$ret .= qx(sendemail -f '$from' -t '$rcpt' -u '$subject' -m '$text' -a '$attach' -s '$provider' -xu '$konto' -xp '$passwrd' -o tls=auto -o message-charset=utf-8);<br />
$ret =~ s,[\r\n]*,,g; # remove CR from return-string <br />
Log 1, "sendemail returned: $ret"; <br />
}<br />
###############################################################################<br />
</syntaxhighlight><br />
<br />
Die Zugangsdaten für den Email-Account müssen dabei FHEM-intern gespeichert werden. Dazu gibt man einmalig über die Kommandozeile folgendes ein (user@domain und password müssen auf den Email Account geändert werden):<br />
:<code><nowiki> {setKeyValue("myEmailKonto",'user@domain');;setKeyValue("myEmailPasswrd",'password')}</nowiki></code><br />
<br />
Um die TLS Verschlüsselung (ehem. SSL) nicht zu nutzen, muss in der viertletzten Zeile tls=no verwendet und der Port des Mailproviders auf 25 eigetragen werden. Sollte anschließend keine Mail verschickt werden, siehe Probleme.<br />
<br />
Falls der Body-Text in einem (Android-)Mailer auf dem Handy nicht gezeigt wird, kann der Parameter '''-o message-content-type=html''' helfen.<br />
<br />
Die Funktion kann beispielsweise folgendermaßen aufgerufen werden:<br />
{{Randnotiz|RNTyp=g|RNText=Bei allen Feldern können generell doppelte " oder einfache ' Anführungszeichen verwendet werden. Innerhalb von "" müssen Sonderzeichen wie @ aber maskiert werden, da sie sonst als Steuerzeichen interpretiert werden:<br />
:<code><nowiki>"email\@email.domain" oder 'email@email.domain'</nowiki></code><br />
}}<br />
Direkt in der FHEM Kommandozeile (ohne Anhang)<br />
:<code><nowiki>{DebianMail("email\@email.domain","Subject","Text")}</nowiki></code><br />
Die ordnungsgemäße Ausführung wird mit 71 quittiert.<br />
Oder im notify mit mehreren Anhängen<br />
:<code><nowiki>define Sonstiges notify Fenster:Window:.*,.*Low.Batt*. {\ DebianMail("email\@email.domain","Subject","Text","'Anhang1' 'Anhang2' ...");;\ }</nowiki></code><br />
<br />
oder (mehr als einen Empfänger, diese können durch Leerzeichen, Semikolon oder Komma getrennt sein)<br />
<br />
<syntaxhighlight lang="text"><br />
define Sonstiges at *01:00:00 {\<br />
DebianMail('email@email.domain,email2@email.domain',"Subject","Text","'Anhang1' 'Anhang2' ...");;\<br />
}<br />
</syntaxhighlight><br />
<br />
Es ist wichtig, die Dateinamen mit ' ' zu klammern, da hierdurch auch Leerzeichen im Pfad/Dateinamen möglich sind.<br />
{{Hinweis|Eine erweiterte - nicht blockierende - Version des Scripts, ist [[SSCAM_-_Steuerung_von_Kameras_in_Synology_Surveillance_Station#Mail mit Snapshot im Anhang und Aufnahmelink versenden (sendEmail)|hier]] zu finden}}<br />
<br />
=== BeagleBoard-xM ===<br />
Auf einem [[:Kategorie:BeagleBoard-xM|BeagleBoard-xM]] mit einem [http://en.opensuse.org/HCL:BeagleBoard-xM OpenSUSE 12.2] kann man ebenfalls das Perl-Programm ''sendEmail'' wie beim RPi nutzen. Dies gibt es aber nicht in den Repositories von openSUSE, sondern man muss sich ''sendEmail'' als Source herunterladen. Das geht am einfachsten per ''wget'', welches man ebenfalls erst installieren muss (aber aus einem Repository).<br />
<syntaxhighlight lang="bash"><br />
$ zypper in wget<br />
$ cd /opt<br />
$ wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz<br />
$ tar xvfz sendEmail-v1.56.tar.gz<br />
$ cd sendEmail-v1.56<br />
$ cp sendMail /usr/local/bin<br />
</syntaxhighlight><br />
Dann geht man weiter vor wie unter RPi beschrieben (anlegen der SUB-Routine in 99_myUtils usw.).<br />
<br />
'''Hinweis:''' Die Version 1.56 von ''sendEmail'' ist Stand Januar 2013 die aktuelle. Da diese Programmversion von 2009 stammt, ist mit neuen Versionen selten zu rechnen. Vielleicht schauen Sie trotzdem vorher auf der [http://caspian.dotconf.net/menu/Software/SendEmail/ Homepage von sendEmail] nach.<br />
<br />
== Windows ==<br />
# Kopiere die Datei sendEmail.exe* in Dein FHEM Verzeichnis (hier c:\fhem-5.0\); Quelle: [http://caspian.dotconf.net/menu/Software/SendEmail/ Homepage von sendEmail]<br />
# Erstelle im FHEM Verzeichnis die Datei wmail.bat mit folgendem Inhalt (eine Zeile):<br />
:<code>sendEmail -f absender@domain.de -u "%1" -m " " -s SMTP-SERVERAdresse -xu SMTP_USERNAME -xp SMTP_PASSWORT -t empfänger@domain.de -o message-header="X-Message-Flag: FHEM"</code><br />
# Beispiel fhem.cfg<br />
## Mail wenn sich der Status von Heizung.* oder Hzg.* ändert <br><code>define Mail_Heizung notify Heizung.*|Hzg.* { system("wmail $NAME:$EVENT")}</code><br />
## Mail bei Signal Aussentemperatur (für dieses Beispiel wird [http://fhem.de/commandref.html#getstate http://fhem.de/commandref.html#getstate getstate] benötigt) <br><code>define Mail_Aussentemperatur notify Aussentemperatur {\</code><br><code>my ($val);;\</code><br><code>$val = fhem "getstate $NAME";;\</code><br><code>system("wmail \"$NAME: $val\"");;\</code><br><code>}</code><br />
<br />
== Probleme ==<br />
=== sendEmail / sendemail (Schreibweise alt / neu ) ===<br />
Erhält man Fehler bez. TLS (''ERROR => TLS setup failed: SSL connect attempt failed error: ...'' ), sind eventuell die ca-certificates veraltet oder nicht installiert. Prüfung:<br />
:<code>apt-cache policy ca-certificates</code><br />
Falls man keine E-Mails verschicken kann, kann man in einem ersten Test prüfen, ob sendEmail als solches funktioniert und die Konfiguration (Benutzer, Passwort, Server-Name usw.) des Mail-Kontos, über das die Mails abgesetzt werden sollen, richtig ist.<br />
<br />
Hierzu setzt man in der FHEM-Befehlszeile die folgende Anweisung ab:<br />
:<code>{ SUB-Routinen-Name('EMailAdresse@Mail.Domain','Test','Test-Text');; }</code><br />
und ersetzt ''SUB-Routinen-Name'' durch den Namen der in 99_myUtils erzeugten Prozedur. Statt ''EMailAdresse@Mail.Domain'' trägt man noch eine gültige E-Mail-Adresse ein und bestätigt den Befehl dann mittels &lt;Enter&gt; (nicht "save"). Empfangen Sie nicht kurzfristig eine entsprechende E-Mail, ist sehr wahrscheinlich an den Zugangsdaten etwas verkehrt. <br />
<br />
Vor dem testen der Routine oben kann sendEmail auch über die Konsole (z.&nbsp;B. via ssh) getestet werden:<br />
:<code>sendEmail -vv -f 'Absender@AbsDomain.de' -t 'Empfänger@EmpfDomain.de' -u 'subject' -m 'body' -s 'smtp.AbsDomain.de' -xu 'AbsenderBenutzername' -xp 'AbsenderPasswort' -o tls=yes</code><br />
<br />
=== Keine Mail mit TLS Verschlüsselung ===<br />
{{Hinweis|Diese Information trifft nur auf alte System zu, aktuell (2021) befindet sich in Zeile 1933 der korrekte Code}}<br />
Prüfung mit <code>grep -n SSLv /usr/bin/sendEmail</code><br />
<br />
Den Test über die Konsole durchführen. Erhält man folgende Fehlermeldung:<br />
''invalid SSL_version specified at /usr/share/perl5/IO/Socket/SSL.pm line 332''<br />
muss auf dem Raspberry folgende Datei angepasst werden: ''/usr/bin/sendEmail''.<br />
In Zeile 1907 muss<br />
if (! IO::Socket::SSL->start_SSL($SERVER, SSL_version => 'SSLv3 TLSv1')) {<br />
<br />
in folgendes geändert werden<br />
if (! IO::Socket::SSL->start_SSL($SERVER, SSL_version => 'SSLv23:!SSLv2')) {<br />
<br />
Der frühere Tipp direkt in der SSL.pm Datei zu editieren führt zu Problemen wenn man auf FHEM per HTTPS zugreifen will und ist daher nicht zu empfehlen.<br />
<br />
== Email laut Log gesendet aber nicht angekommen? ==<br />
Dann bitte in der Fritzbox Oberfläche überpüfen, ob unter "System" -> "Push Service" selbiger eingerichtet und aktiviert wurde. <br />
<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:FritzBox]]<br />
[[Kategorie:BeagleBoard-xM]]<br />
[[Kategorie:Raspberry Pi]]<br />
[[Kategorie:E-Mail]]</div>Otto123http://wiki.fhem.de/w/index.php?title=E-Mail_senden&diff=36190E-Mail senden2021-11-10T09:56:10Z<p>Otto123: /* Keine Mail mit TLS Verschlüsselung */ Hinweis eingefügt</p>
<hr />
<div>Um aus FHEM heraus '''E-Mail senden''' zu können, sind abhängig von der verwendeten Platform unterschiedliche Vorgehensweisen erforderlich.<br />
{{Randnotiz|RNTyp=y|RNText=Anleitung zur Einrichtung von Exim4 auf Debian mit GMX als Smarthost:[[Media:Anleitung_Exim4_Debian_GMX.pdf|PDF]]}}<br />
== Linux ==<br />
=== FritzBox 7170 (non-chroot) oder "reine" Linuxe ===<br />
Datei 99_email.pm im Modul-Verzeichnis mit folgender Funktion anlegen (oder in bestehende 99_irgendwas.pm kopieren):<br />
<syntaxhighlight lang="perl"><br />
sub fb_mail {<br />
my $rcpt = $_[0];<br />
my $subject = $_[1];<br />
my $text = $_[2];<br />
system(&quot;/bin/echo \&quot;$text\&quot; | /usr/bin/mail send -i - -s \&quot;$subject\&quot; -t \&quot;$rcpt\&quot;&quot;);<br />
}<br />
</syntaxhighlight><br />
Aufruf dann mittels <br />
:<code>{ fb_mail('empfaenger@mail.de','Subject','text 123') }</code><br />
Darauf achten, dass der fhem-User Mails senden darf (in richtige Gruppe eintragen. Ggf. vorher einmal su fhem und probieren).<br />
<br />
=== Fritz!Box 7390 ===<br />
Auf der [[AVM Fritz!Box|FritzBox 7390]] ist diese Funktion seit 10/2012 Bestandteil der FHEM Standardauslieferung. Sie ist untergebracht in FritzBoxUtils.pm und heisst dort FB_mail($$$) (Groß-Kleinschreibung beachten).<br />
<br />
Da der Dateiname von FritzBoxUtils.pm nicht mit 99_ beginnt, wird diese Programmdatei nicht automatisch beim Start von FHEM geladen. FHEM muss zum Laden dieser Programmdatei aufgefordert werden. Dazu (z.&nbsp;B. in 99_myUtils.pm) die Zeile ''use FritzBoxUtils;'' einfügen.<br />
<br />
Mit dem Install von AVM.de wird fhem in einer chroot-Umgebung ausgeführt, die den Zugriff auf die Mailfunktion der Fritzbox nicht zulässt. Daher muss FHEM in der [http://fhem.de/fhem.html#Download Version von fhem.de] installiert sein. Sollte Ihre Fritzbox bisher mit dem install von AVM laufen, kann (nach einem backup!) das image von fhem.de einfach drüberinstalliert werden. Es sollten dabei alle Einstellungen erhalten bleiben.<br />
<br />
<syntaxhighlight lang="perl"><br />
sub fb_mail {<br />
my $rcpt = $_[0];<br />
my $subject = $_[1];<br />
my $text = $_[2];<br />
system(&quot;/bin/echo \&quot;$text\&quot; &gt; /var/tmp/fhem_nachricht.txt&quot;);<br />
system(&quot;/sbin/mailer send -i '/var/tmp/fhem_nachricht.txt' -s \&quot;$subject\&quot; -t \&quot;$rcpt\&quot;&quot;);<br />
system(&quot;rm /var/tmp/fhem_nachricht.txt&quot;);<br />
}<br />
</syntaxhighlight><br />
<br />
Aufruf dann mittels <br />
:<code>{ fb_mail('empfaenger@mail.de','Subject','text 123') }</code><br />
bzw. <br />
:<code>{ FB_mail('empfaenger@mail.de','Subject','text 123') }</code><br />
<br />
Dem Mailer können noch weitere Parameter hinzugefügt werden. Mehr dazu siehe: [http://www.wehavemorefun.de/fritzbox/Mailer Mailer]<br />
<br />
=== OpenWRT ===<br />
Die Anleitung wurde mit einer frühen Beta von Barrier Breaker (r391xx) mit einem TP_Lind WDR 4900 getestet. Da "sendEmail" nicht als Package vorliegt wird in dieser Anleitung "ssmtp" verwendet.<br />
Die Installation erfolgt mittels:<br />
<br />
<syntaxhighlight lang="bash"><br />
opkg update<br />
opkg install ssmtp_2.64-4_mpc85xx.ipk <br />
</syntaxhighlight><br />
<br />
Hierbei werden die Pakete libopenssl und zlib mit installiert. Damit ssmtp funktioniert müssen die Dateien /etc/ssmtp/ssmtp.conf und /etc/ssmtp/revaliases angepasst werden.<br />
<br />
/etc/ssmtp/ssmtp.conf <br />
<syntaxhighlight lang="text"><br />
root=arnold@gmx.net<br />
mailhub=mail.gmx.net:465<br />
rewriteDomain=gmx.net<br />
hostname=gmx.net<br />
FromLineOverride=YES<br />
UseTLS=YES<br />
#UseSTARTTLS=YES<br />
AuthUser=arnold@gmx.net<br />
AuthPass=Passwort_von_arnold@gmx.net<br />
</syntaxhighlight><br />
<br />
/etc/ssmtp/revaliases<br />
<syntaxhighlight lang="text"><br />
root:arnold@gmx.net:mail.gmx.net:465<br />
</syntaxhighlight><br />
<br />
In der [[99_myUtils_anlegen|99_myUtils]] folgende Unterroutine einfügen (von der RPi-Anleitung übernommen):<br />
<br />
<syntaxhighlight lang="perl"><br />
sub OpenWRTMail <br />
{ <br />
my $rcpt = shift;<br />
my $subject = shift; <br />
my $text = shift; <br />
my $ret = "";<br />
my $sender = "dockstar\@heye-tammo.de"; <br />
Log 1, "sendEmail RCP: $rcpt, Subject: $subject, Text: $text";<br />
$ret .= qx(echo -e 'to:$rcpt\n from:$sender\nsubject:$subject\n$text\n' | ssmtp $rcpt);<br />
$ret =~ s,[\r\n]*,,g; # remove CR from return-string <br />
Log 1, "sendEmail returned: $ret"; <br />
}<br />
</syntaxhighlight><br />
<br />
Ab hier den entsprechenden Abschnitt unter "Raspberry Pi" lesen.<br />
<br />
=== Synology DiskStation ===<br />
Beim DSM 3.2 gab es keinen <code>sendmail</code>-Befehl, sondern nur eine Funktion für den Versand der System-Benachrichtigungen. Interessanterweise funktionierte aber der <code>php-mail</code>-Befehl, so dass man mittels folgendem Modul Mails frei versenden kann:<br />
<syntaxhighlight lang="perl"><br />
sub sendmail($$$) {<br />
my($empf, $subj, $nachricht) = @_;<br />
system(&quot;php -r 'mail(\&quot;$empf\&quot;,\&quot;$subj\&quot;,\&quot;$nachricht\&quot;);'&quot;);<br />
undef;<br />
}<br />
</syntaxhighlight><br />
<br />
=== Raspberry Pi ===<br />
{{Randnotiz|RNTyp=o|RNText=In früheren Distributionen wurde das Paket sowie der Aufruf uU. mit großem "E" geschrieben: ''sendEmail''.}}Auf einem [[Raspberry Pi]] muß noch sendemail nachinstalliert werden. Diese Anleitung funktioniert ab der Stretch-Version von Raspbian bzw. '''Debian''' sowie unter '''Ubuntu''' seit ca. Version 16.04.<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get update<br />
sudo apt-get install sendemail libio-socket-ssl-perl libnet-ssleay-perl perl<br />
</syntaxhighlight><br />
<br />
Man kann die korrekte Funktion im Terminal (ohne <code>{qx()}</code> ) oder auch in der FHEM Kommandozeile testen (Hinweis: manche Provider (z.B. gmail) lassen diesen Zugang erst nach Freischaltung zu!).<br />
<syntaxhighlight lang="perl"><br />
{qx(sendemail -f 'Ab\@send.er' -t 'Emp\@faeng.er' -u 'subject' -m 'text' -a 'DateinameOderLeer' -s 'smtpFQDN:port' -xu 'MailUser' -xp 'PasswortOhneKlammeraffen')}<br />
</syntaxhighlight><br />
<br />
In der [[99_myUtils_anlegen|99_myUtils]] folgende Unterroutine einfügen:<br />
<syntaxhighlight lang="perl"><br />
######## DebianMail Mail auf dem RPi versenden ############ <br />
# $provider für SMTP Server anpassen. <br />
# Einmal in der FHEM Kommandozeile, user und password anpassen:<br />
# {setKeyValue("myEmailKonto",'user@domain');;setKeyValue("myEmailPasswrd",'password')}<br />
sub DebianMail <br />
{ <br />
my $rcpt = shift;<br />
my $subject = shift; <br />
my $text = shift; <br />
my $attach = shift; <br />
my $ret = "";<br />
my $error;<br />
my $konto = getKeyValue("myEmailKonto"); <br />
my $passwrd = getKeyValue("myEmailPasswrd"); <br />
my $from = $konto; # or use different KeyValue if konto is not the from email address<br />
my $provider = "smtp.1und1.de"; # smtp.domain.tld:port see provider documentation<br />
#Log 1, "sendEmail RCP: $rcpt";<br />
#Log 1, "sendEmail Subject: $subject";<br />
#Log 1, "sendEmail Text: $text";<br />
#Log 1, "sendEmail Anhang: $attach";<br />
if (not defined($attach)){$attach=''}<br />
$ret .= qx(sendemail -f '$from' -t '$rcpt' -u '$subject' -m '$text' -a '$attach' -s '$provider' -xu '$konto' -xp '$passwrd' -o tls=auto -o message-charset=utf-8);<br />
$ret =~ s,[\r\n]*,,g; # remove CR from return-string <br />
Log 1, "sendemail returned: $ret"; <br />
}<br />
###############################################################################<br />
</syntaxhighlight><br />
<br />
Die Zugangsdaten für den Email-Account müssen dabei FHEM-intern gespeichert werden. Dazu gibt man einmalig über die Kommandozeile folgendes ein (user@domain und password müssen auf den Email Account geändert werden):<br />
:<code><nowiki> {setKeyValue("myEmailKonto",'user@domain');;setKeyValue("myEmailPasswrd",'password')}</nowiki></code><br />
<br />
Um die TLS Verschlüsselung (ehem. SSL) nicht zu nutzen, muss in der viertletzten Zeile tls=no verwendet und der Port des Mailproviders auf 25 eigetragen werden. Sollte anschließend keine Mail verschickt werden, siehe Probleme.<br />
<br />
Falls der Body-Text in einem (Android-)Mailer auf dem Handy nicht gezeigt wird, kann der Parameter '''-o message-content-type=html''' helfen.<br />
<br />
Die Funktion kann beispielsweise folgendermaßen aufgerufen werden:<br />
{{Randnotiz|RNTyp=g|RNText=Bei allen Feldern können generell doppelte " oder einfache ' Anführungszeichen verwendet werden. Innerhalb von "" müssen Sonderzeichen wie @ aber maskiert werden, da sie sonst als Steuerzeichen interpretiert werden:<br />
:<code><nowiki>"email\@email.domain" oder 'email@email.domain'</nowiki></code><br />
}}<br />
Direkt in der FHEM Kommandozeile (ohne Anhang)<br />
:<code><nowiki>{DebianMail("email\@email.domain","Subject","Text")}</nowiki></code><br />
Die ordnungsgemäße Ausführung wird mit 71 quittiert.<br />
Oder im notify mit mehreren Anhängen<br />
:<code><nowiki>define Sonstiges notify Fenster:Window:.*,.*Low.Batt*. {\ DebianMail("email\@email.domain","Subject","Text","'Anhang1' 'Anhang2' ...");;\ }</nowiki></code><br />
<br />
oder (mehr als einen Empfänger, diese können durch Leerzeichen, Semikolon oder Komma getrennt sein)<br />
<br />
<syntaxhighlight lang="text"><br />
define Sonstiges at *01:00:00 {\<br />
DebianMail('email@email.domain,email2@email.domain',"Subject","Text","'Anhang1' 'Anhang2' ...");;\<br />
}<br />
</syntaxhighlight><br />
<br />
Es ist wichtig, die Dateinamen mit ' ' zu klammern, da hierdurch auch Leerzeichen im Pfad/Dateinamen möglich sind.<br />
{{Hinweis|Eine erweiterte - nicht blockierende - Version des Scripts, ist [[SSCAM_-_Steuerung_von_Kameras_in_Synology_Surveillance_Station#Mail mit Snapshot im Anhang und Aufnahmelink versenden (sendEmail)|hier]] zu finden}}<br />
<br />
=== BeagleBoard-xM ===<br />
Auf einem [[:Kategorie:BeagleBoard-xM|BeagleBoard-xM]] mit einem [http://en.opensuse.org/HCL:BeagleBoard-xM OpenSUSE 12.2] kann man ebenfalls das Perl-Programm ''sendEmail'' wie beim RPi nutzen. Dies gibt es aber nicht in den Repositories von openSUSE, sondern man muss sich ''sendEmail'' als Source herunterladen. Das geht am einfachsten per ''wget'', welches man ebenfalls erst installieren muss (aber aus einem Repository).<br />
<syntaxhighlight lang="bash"><br />
$ zypper in wget<br />
$ cd /opt<br />
$ wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz<br />
$ tar xvfz sendEmail-v1.56.tar.gz<br />
$ cd sendEmail-v1.56<br />
$ cp sendMail /usr/local/bin<br />
</syntaxhighlight><br />
Dann geht man weiter vor wie unter RPi beschrieben (anlegen der SUB-Routine in 99_myUtils usw.).<br />
<br />
'''Hinweis:''' Die Version 1.56 von ''sendEmail'' ist Stand Januar 2013 die aktuelle. Da diese Programmversion von 2009 stammt, ist mit neuen Versionen selten zu rechnen. Vielleicht schauen Sie trotzdem vorher auf der [http://caspian.dotconf.net/menu/Software/SendEmail/ Homepage von sendEmail] nach.<br />
<br />
== Windows ==<br />
# Kopiere die Datei sendEmail.exe* in Dein FHEM Verzeichnis (hier c:\fhem-5.0\); Quelle: [http://caspian.dotconf.net/menu/Software/SendEmail/ Homepage von sendEmail]<br />
# Erstelle im FHEM Verzeichnis die Datei wmail.bat mit folgendem Inhalt (eine Zeile):<br />
:<code>sendEmail -f absender@domain.de -u "%1" -m " " -s SMTP-SERVERAdresse -xu SMTP_USERNAME -xp SMTP_PASSWORT -t empfänger@domain.de -o message-header="X-Message-Flag: FHEM"</code><br />
# Beispiel fhem.cfg<br />
## Mail wenn sich der Status von Heizung.* oder Hzg.* ändert <br><code>define Mail_Heizung notify Heizung.*|Hzg.* { system("wmail $NAME:$EVENT")}</code><br />
## Mail bei Signal Aussentemperatur (für dieses Beispiel wird [http://fhem.de/commandref.html#getstate http://fhem.de/commandref.html#getstate getstate] benötigt) <br><code>define Mail_Aussentemperatur notify Aussentemperatur {\</code><br><code>my ($val);;\</code><br><code>$val = fhem "getstate $NAME";;\</code><br><code>system("wmail \"$NAME: $val\"");;\</code><br><code>}</code><br />
<br />
== Probleme ==<br />
=== sendEmail / sendemail (Schreibweise alt / neu ) ===<br />
Erhält man Fehler bez. TLS (''ERROR => TLS setup failed: SSL connect attempt failed error: ...'' ), sind eventuell die ca-certificates veraltet oder nicht installiert. Prüfung:<br />
:<code>apt-cache policy ca-certificates</code><br />
Falls man keine E-Mails verschicken kann, kann man in einem ersten Test prüfen, ob sendEmail als solches funktioniert und die Konfiguration (Benutzer, Passwort, Server-Name usw.) des Mail-Kontos, über das die Mails abgesetzt werden sollen, richtig ist.<br />
<br />
Hierzu setzt man in der FHEM-Befehlszeile die folgende Anweisung ab:<br />
:<code>{ SUB-Routinen-Name('EMailAdresse@Mail.Domain','Test','Test-Text');; }</code><br />
und ersetzt ''SUB-Routinen-Name'' durch den Namen der in 99_myUtils erzeugten Prozedur. Statt ''EMailAdresse@Mail.Domain'' trägt man noch eine gültige E-Mail-Adresse ein und bestätigt den Befehl dann mittels &lt;Enter&gt; (nicht "save"). Empfangen Sie nicht kurzfristig eine entsprechende E-Mail, ist sehr wahrscheinlich an den Zugangsdaten etwas verkehrt. <br />
<br />
Vor dem testen der Routine oben kann sendEmail auch über die Konsole (z.&nbsp;B. via ssh) getestet werden:<br />
:<code>sendEmail -vv -f 'Absender@AbsDomain.de' -t 'Empfänger@EmpfDomain.de' -u 'subject' -m 'body' -s 'smtp.AbsDomain.de' -xu 'AbsenderBenutzername' -xp 'AbsenderPasswort' -o tls=yes</code><br />
<br />
=== Keine Mail mit TLS Verschlüsselung ===<br />
{{Hinweis|Diese Information trifft nur auf alte System zu, aktuell (2021) befindet sich in Zeile 1933 der korrekte Code}}<br />
Prüfung mit <code>grep -n SSLv /usr/bin/sendEmail</code><br />
Den Test über die Konsole durchführen. Erhält man folgende Fehlermeldung:<br />
''invalid SSL_version specified at /usr/share/perl5/IO/Socket/SSL.pm line 332''<br />
muss auf dem Raspberry folgende Datei angepasst werden: ''/usr/bin/sendEmail''.<br />
In Zeile 1907 muss<br />
if (! IO::Socket::SSL->start_SSL($SERVER, SSL_version => 'SSLv3 TLSv1')) {<br />
<br />
in folgendes geändert werden<br />
if (! IO::Socket::SSL->start_SSL($SERVER, SSL_version => 'SSLv23:!SSLv2')) {<br />
<br />
Der frühere Tipp direkt in der SSL.pm Datei zu editieren führt zu Problemen wenn man auf FHEM per HTTPS zugreifen will und ist daher nicht zu empfehlen.<br />
<br />
== Email laut Log gesendet aber nicht angekommen? ==<br />
Dann bitte in der Fritzbox Oberfläche überpüfen, ob unter "System" -> "Push Service" selbiger eingerichtet und aktiviert wurde. <br />
<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:FritzBox]]<br />
[[Kategorie:BeagleBoard-xM]]<br />
[[Kategorie:Raspberry Pi]]<br />
[[Kategorie:E-Mail]]</div>Otto123http://wiki.fhem.de/w/index.php?title=E-Mail_senden&diff=36178E-Mail senden2021-11-05T14:46:16Z<p>Otto123: /* Probleme */</p>
<hr />
<div>Um aus FHEM heraus '''E-Mail senden''' zu können, sind abhängig von der verwendeten Platform unterschiedliche Vorgehensweisen erforderlich.<br />
{{Randnotiz|RNTyp=y|RNText=Anleitung zur Einrichtung von Exim4 auf Debian mit GMX als Smarthost:[[Media:Anleitung_Exim4_Debian_GMX.pdf|PDF]]}}<br />
<br />
== Linux ==<br />
=== FritzBox 7170 (non-chroot) oder "reine" Linuxe ===<br />
Datei 99_email.pm im Modul-Verzeichnis mit folgender Funktion anlegen (oder in bestehende 99_irgendwas.pm kopieren):<br />
<syntaxhighlight lang="perl"><br />
sub fb_mail {<br />
my $rcpt = $_[0];<br />
my $subject = $_[1];<br />
my $text = $_[2];<br />
system(&quot;/bin/echo \&quot;$text\&quot; | /usr/bin/mail send -i - -s \&quot;$subject\&quot; -t \&quot;$rcpt\&quot;&quot;);<br />
}<br />
</syntaxhighlight><br />
Aufruf dann mittels <br />
:<code>{ fb_mail('empfaenger@mail.de','Subject','text 123') }</code><br />
Darauf achten, dass der fhem-User Mails senden darf (in richtige Gruppe eintragen. Ggf. vorher einmal su fhem und probieren).<br />
<br />
=== Fritz!Box 7390 ===<br />
Auf der [[AVM Fritz!Box|FritzBox 7390]] ist diese Funktion seit 10/2012 Bestandteil der FHEM Standardauslieferung. Sie ist untergebracht in FritzBoxUtils.pm und heisst dort FB_mail($$$) (Groß-Kleinschreibung beachten).<br />
<br />
Da der Dateiname von FritzBoxUtils.pm nicht mit 99_ beginnt, wird diese Programmdatei nicht automatisch beim Start von FHEM geladen. FHEM muss zum Laden dieser Programmdatei aufgefordert werden. Dazu (z.&nbsp;B. in 99_myUtils.pm) die Zeile ''use FritzBoxUtils;'' einfügen.<br />
<br />
Mit dem Install von AVM.de wird fhem in einer chroot-Umgebung ausgeführt, die den Zugriff auf die Mailfunktion der Fritzbox nicht zulässt. Daher muss FHEM in der [http://fhem.de/fhem.html#Download Version von fhem.de] installiert sein. Sollte Ihre Fritzbox bisher mit dem install von AVM laufen, kann (nach einem backup!) das image von fhem.de einfach drüberinstalliert werden. Es sollten dabei alle Einstellungen erhalten bleiben.<br />
<br />
<syntaxhighlight lang="perl"><br />
sub fb_mail {<br />
my $rcpt = $_[0];<br />
my $subject = $_[1];<br />
my $text = $_[2];<br />
system(&quot;/bin/echo \&quot;$text\&quot; &gt; /var/tmp/fhem_nachricht.txt&quot;);<br />
system(&quot;/sbin/mailer send -i '/var/tmp/fhem_nachricht.txt' -s \&quot;$subject\&quot; -t \&quot;$rcpt\&quot;&quot;);<br />
system(&quot;rm /var/tmp/fhem_nachricht.txt&quot;);<br />
}<br />
</syntaxhighlight><br />
<br />
Aufruf dann mittels <br />
:<code>{ fb_mail('empfaenger@mail.de','Subject','text 123') }</code><br />
bzw. <br />
:<code>{ FB_mail('empfaenger@mail.de','Subject','text 123') }</code><br />
<br />
Dem Mailer können noch weitere Parameter hinzugefügt werden. Mehr dazu siehe: [http://www.wehavemorefun.de/fritzbox/Mailer Mailer]<br />
<br />
=== OpenWRT ===<br />
Die Anleitung wurde mit einer frühen Beta von Barrier Breaker (r391xx) mit einem TP_Lind WDR 4900 getestet. Da "sendEmail" nicht als Package vorliegt wird in dieser Anleitung "ssmtp" verwendet.<br />
Die Installation erfolgt mittels:<br />
<br />
<syntaxhighlight lang="bash"><br />
opkg update<br />
opkg install ssmtp_2.64-4_mpc85xx.ipk <br />
</syntaxhighlight><br />
<br />
Hierbei werden die Pakete libopenssl und zlib mit installiert. Damit ssmtp funktioniert müssen die Dateien /etc/ssmtp/ssmtp.conf und /etc/ssmtp/revaliases angepasst werden.<br />
<br />
/etc/ssmtp/ssmtp.conf <br />
<nowiki>root=arnold@gmx.net<br />
mailhub=mail.gmx.net:465<br />
rewriteDomain=gmx.net<br />
hostname=gmx.net<br />
FromLineOverride=YES<br />
UseTLS=YES<br />
#UseSTARTTLS=YES<br />
AuthUser=arnold@gmx.net<br />
AuthPass=Passwort_von_arnold@gmx.net<br />
</nowiki><br />
<br />
/etc/ssmtp/revaliases<br />
<nowiki><br />
root:arnold@gmx.net:mail.gmx.net:465</nowiki><br />
<br />
In der [[99_myUtils_anlegen|99_myUtils]] folgende Unterroutine einfügen (von der RPi-Anleitung übernommen):<br />
<br />
<syntaxhighlight lang="perl"><br />
sub OpenWRTMail <br />
{ <br />
my $rcpt = shift;<br />
my $subject = shift; <br />
my $text = shift; <br />
my $ret = "";<br />
my $sender = "dockstar\@heye-tammo.de"; <br />
Log 1, "sendEmail RCP: $rcpt, Subject: $subject, Text: $text";<br />
$ret .= qx(echo -e 'to:$rcpt\n from:$sender\nsubject:$subject\n$text\n' | ssmtp $rcpt);<br />
$ret =~ s,[\r\n]*,,g; # remove CR from return-string <br />
Log 1, "sendEmail returned: $ret"; <br />
}<br />
</syntaxhighlight><br />
<br />
Ab hier den entsprechenden Abschnitt unter "Raspberry Pi" lesen.<br />
<br />
=== Synology DiskStation ===<br />
Beim DSM 3.2 gab es keinen <code>sendmail</code>-Befehl, sondern nur eine Funktion für den Versand der System-Benachrichtigungen. Interessanterweise funktionierte aber der <code>php-mail</code>-Befehl, so dass man mittels folgendem Modul Mails frei versenden kann:<br />
<syntaxhighlight lang="perl"><br />
sub sendmail($$$) {<br />
my($empf, $subj, $nachricht) = @_;<br />
system(&quot;php -r 'mail(\&quot;$empf\&quot;,\&quot;$subj\&quot;,\&quot;$nachricht\&quot;);'&quot;);<br />
undef;<br />
}<br />
</syntaxhighlight><br />
<br />
=== Raspberry Pi ===<br />
{{Randnotiz|RNTyp=o|RNText=In früheren Distributionen wurde das Paket sowie der Aufruf uU. mit großem "E" geschrieben: ''sendEmail''.}}Auf einem [[Raspberry Pi]] muß noch sendemail nachinstalliert werden. Diese Anleitung funktioniert ab der Stretch-Version von Raspbian bzw. '''Debian''' sowie unter '''Ubuntu''' seit ca. Version 16.04.<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get update<br />
sudo apt-get install sendemail libio-socket-ssl-perl libnet-ssleay-perl perl<br />
</syntaxhighlight><br />
<br />
Man kann die korrekte Funktion im Terminal (ohne <code>{qx()}</code> ) oder auch in der FHEM Kommandozeile testen (Hinweis: manche Provider (z.B. gmail) lassen diesen Zugang erst nach Freischaltung zu!).<br />
<syntaxhighlight lang="perl"><br />
{qx(sendemail -f 'Ab\@send.er' -t 'Emp\@faeng.er' -u 'subject' -m 'text' -a 'DateinameOderLeer' -s 'smtpFQDN:port' -xu 'MailUser' -xp 'PasswortOhneKlammeraffen')}<br />
</syntaxhighlight><br />
<br />
In der [[99_myUtils_anlegen|99_myUtils]] folgende Unterroutine einfügen:<br />
<syntaxhighlight lang="perl"><br />
######## DebianMail Mail auf dem RPi versenden ############ <br />
# $provider für SMTP Server anpassen. <br />
# Einmal in der FHEM Kommandozeile, user und password anpassen:<br />
# {setKeyValue("myEmailKonto",'user@domain');;setKeyValue("myEmailPasswrd",'password')}<br />
sub DebianMail <br />
{ <br />
my $rcpt = shift;<br />
my $subject = shift; <br />
my $text = shift; <br />
my $attach = shift; <br />
my $ret = "";<br />
my $error;<br />
my $konto = getKeyValue("myEmailKonto"); <br />
my $passwrd = getKeyValue("myEmailPasswrd"); <br />
my $from = $konto; # or use different KeyValue if konto is not the from email address<br />
my $provider = "smtp.1und1.de"; # smtp.domain.tld:port see provider documentation<br />
#Log 1, "sendEmail RCP: $rcpt";<br />
#Log 1, "sendEmail Subject: $subject";<br />
#Log 1, "sendEmail Text: $text";<br />
#Log 1, "sendEmail Anhang: $attach";<br />
if (not defined($attach)){$attach=''}<br />
$ret .= qx(sendemail -f '$from' -t '$rcpt' -u '$subject' -m '$text' -a '$attach' -s '$provider' -xu '$konto' -xp '$passwrd' -o tls=auto -o message-charset=utf-8);<br />
$ret =~ s,[\r\n]*,,g; # remove CR from return-string <br />
Log 1, "sendemail returned: $ret"; <br />
}<br />
###############################################################################<br />
</syntaxhighlight><br />
<br />
Die Zugangsdaten für den Email-Account müssen dabei FHEM-intern gespeichert werden. Dazu gibt man einmalig über die Kommandozeile folgendes ein (user@domain und password müssen auf den Email Account geändert werden):<br />
:<code><nowiki> {setKeyValue("myEmailKonto",'user@domain');;setKeyValue("myEmailPasswrd",'password')}</nowiki></code><br />
<br />
Um die TLS Verschlüsselung (ehem. SSL) nicht zu nutzen, muss in der viertletzten Zeile tls=no verwendet und der Port des Mailproviders auf 25 eigetragen werden. Sollte anschließend keine Mail verschickt werden, siehe Probleme.<br />
<br />
Falls der Body-Text in einem (Android-)Mailer auf dem Handy nicht gezeigt wird, kann der Parameter '''-o message-content-type=html''' helfen.<br />
<br />
Die Funktion kann beispielsweise folgendermaßen aufgerufen werden:<br />
{{Randnotiz|RNTyp=g|RNText=Bei allen Feldern können generell doppelte " oder einfache ' Anführungszeichen verwendet werden. Innerhalb von "" müssen Sonderzeichen wie @ aber maskiert werden, da sie sonst als Steuerzeichen interpretiert werden:<br />
:<code><nowiki>"email\@email.domain" oder 'email@email.domain'</nowiki></code><br />
}}<br />
Direkt in der FHEM Kommandozeile (ohne Anhang)<br />
:<code><nowiki>{DebianMail("email\@email.domain","Subject","Text")}</nowiki></code><br />
Die ordnungsgemäße Ausführung wird mit 71 quittiert.<br />
Oder im notify mit mehreren Anhängen<br />
:<code><nowiki>define Sonstiges notify Fenster:Window:.*,.*Low.Batt*. {\ DebianMail("email\@email.domain","Subject","Text","'Anhang1' 'Anhang2' ...");;\ }</nowiki></code><br />
<br />
oder (mehr als einen Empfänger, diese können durch Leerzeichen, Semikolon oder Komma getrennt sein)<br />
<br />
<syntaxhighlight lang="text"><br />
define Sonstiges at *01:00:00 {\<br />
DebianMail('email@email.domain,email2@email.domain',"Subject","Text","'Anhang1' 'Anhang2' ...");;\<br />
}<br />
</syntaxhighlight><br />
<br />
Es ist wichtig, die Dateinamen mit ' ' zu klammern, da hierdurch auch Leerzeichen im Pfad/Dateinamen möglich sind.<br />
{{Hinweis|Eine erweiterte - nicht blockierende - Version des Scripts, ist [[SSCAM_-_Steuerung_von_Kameras_in_Synology_Surveillance_Station#Mail mit Snapshot im Anhang und Aufnahmelink versenden (sendEmail)|hier]] zu finden}}<br />
<br />
=== BeagleBoard-xM ===<br />
Auf einem [[:Kategorie:BeagleBoard-xM|BeagleBoard-xM]] mit einem [http://en.opensuse.org/HCL:BeagleBoard-xM OpenSUSE 12.2] kann man ebenfalls das Perl-Programm ''sendEmail'' wie beim RPi nutzen. Dies gibt es aber nicht in den Repositories von openSUSE, sondern man muss sich ''sendEmail'' als Source herunterladen. Das geht am einfachsten per ''wget'', welches man ebenfalls erst installieren muss (aber aus einem Repository).<br />
<syntaxhighlight lang="bash"><br />
$ zypper in wget<br />
$ cd /opt<br />
$ wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz<br />
$ tar xvfz sendEmail-v1.56.tar.gz<br />
$ cd sendEmail-v1.56<br />
$ cp sendMail /usr/local/bin<br />
</syntaxhighlight><br />
Dann geht man weiter vor wie unter RPi beschrieben (anlegen der SUB-Routine in 99_myUtils usw.).<br />
<br />
'''Hinweis:''' Die Version 1.56 von ''sendEmail'' ist Stand Januar 2013 die aktuelle. Da diese Programmversion von 2009 stammt, ist mit neuen Versionen selten zu rechnen. Vielleicht schauen Sie trotzdem vorher auf der [http://caspian.dotconf.net/menu/Software/SendEmail/ Homepage von sendEmail] nach.<br />
<br />
== Windows ==<br />
# Kopiere die Datei sendEmail.exe* in Dein FHEM Verzeichnis (hier c:\fhem-5.0\); Quelle: [http://caspian.dotconf.net/menu/Software/SendEmail/ Homepage von sendEmail]<br />
# Erstelle im FHEM Verzeichnis die Datei wmail.bat mit folgendem Inhalt (eine Zeile):<br />
:<code>sendEmail -f absender@domain.de -u "%1" -m " " -s SMTP-SERVERAdresse -xu SMTP_USERNAME -xp SMTP_PASSWORT -t empfänger@domain.de -o message-header="X-Message-Flag: FHEM"</code><br />
# Beispiel fhem.cfg<br />
## Mail wenn sich der Status von Heizung.* oder Hzg.* ändert <br><code>define Mail_Heizung notify Heizung.*|Hzg.* { system("wmail $NAME:$EVENT")}</code><br />
## Mail bei Signal Aussentemperatur (für dieses Beispiel wird [http://fhem.de/commandref.html#getstate http://fhem.de/commandref.html#getstate getstate] benötigt) <br><code>define Mail_Aussentemperatur notify Aussentemperatur {\</code><br><code>my ($val);;\</code><br><code>$val = fhem "getstate $NAME";;\</code><br><code>system("wmail \"$NAME: $val\"");;\</code><br><code>}</code><br />
<br />
== Probleme ==<br />
=== sendEmail / sendemail (Schreibweise alt / neu ) ===<br />
Erhält man Fehler bez. TLS (''ERROR => TLS setup failed: SSL connect attempt failed error: ...'' ), sind eventuell die ca-certificates veraltet oder nicht installiert. Prüfung:<br />
:<code>apt-cache policy ca-certificates</code><br />
Falls man keine E-Mails verschicken kann, kann man in einem ersten Test prüfen, ob sendEmail als solches funktioniert und die Konfiguration (Benutzer, Passwort, Server-Name usw.) des Mail-Kontos, über das die Mails abgesetzt werden sollen, richtig ist.<br />
<br />
Hierzu setzt man in der FHEM-Befehlszeile die folgende Anweisung ab:<br />
:<code>{ SUB-Routinen-Name('EMailAdresse@Mail.Domain','Test','Test-Text');; }</code><br />
und ersetzt ''SUB-Routinen-Name'' durch den Namen der in 99_myUtils erzeugten Prozedur. Statt ''EMailAdresse@Mail.Domain'' trägt man noch eine gültige E-Mail-Adresse ein und bestätigt den Befehl dann mittels &lt;Enter&gt; (nicht "save"). Empfangen Sie nicht kurzfristig eine entsprechende E-Mail, ist sehr wahrscheinlich an den Zugangsdaten etwas verkehrt. <br />
<br />
Vor dem testen der Routine oben kann sendEmail auch über die Konsole (z.&nbsp;B. via ssh) getestet werden:<br />
:<code>sendEmail -vv -f 'Absender@AbsDomain.de' -t 'Empfänger@EmpfDomain.de' -u 'subject' -m 'body' -s 'smtp.AbsDomain.de' -xu 'AbsenderBenutzername' -xp 'AbsenderPasswort' -o tls=yes</code><br />
<br />
=== Keine Mail mit TLS Verschlüsselung ===<br />
Den Test über die Konsole durchführen. Erhält man folgende Fehlermeldung:<br />
''invalid SSL_version specified at /usr/share/perl5/IO/Socket/SSL.pm line 332''<br />
muss auf dem Raspberry folgende Datei angepasst werden: ''/usr/bin/sendEmail''.<br />
In Zeile 1907 muss<br />
if (! IO::Socket::SSL->start_SSL($SERVER, SSL_version => 'SSLv3 TLSv1')) {<br />
<br />
in folgendes geändert werden<br />
if (! IO::Socket::SSL->start_SSL($SERVER, SSL_version => 'SSLv23:!SSLv2')) {<br />
<br />
Der frühere Tipp direkt in der SSL.pm Datei zu editieren führt zu Problemen wenn man auf FHEM per HTTPS zugreifen will und ist daher nicht zu empfehlen.<br />
<br />
== Email laut Log gesendet aber nicht angekommen? ==<br />
Dann bitte in der Fritzbox Oberfläche überpüfen, ob unter "System" -> "Push Service" selbiger eingerichtet und aktiviert wurde. <br />
<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:FritzBox]]<br />
[[Kategorie:BeagleBoard-xM]]<br />
[[Kategorie:Raspberry Pi]]<br />
[[Kategorie:E-Mail]]</div>Otto123