http://wiki.fhem.de/w/api.php?action=feedcontributions&user=Curt&feedformat=atomFHEMWiki - Benutzerbeiträge [de]2024-03-29T07:21:46ZBenutzerbeiträgeMediaWiki 1.39.3http://wiki.fhem.de/w/index.php?title=Webserver_auf_Raspberry&diff=39142Webserver auf Raspberry2024-02-24T21:17:03Z<p>Curt: so besser/sauberer</p>
<hr />
<div>Auf Raspberry-Systemen benötigt man oft einen Webserver. Zwar gibt es bereits Lösungen wie Apache2 oder Nginx, allerdings sind diese rechenzeit- und speicherintensiv. Oft wird auf kleinen Systemen wie dem RaspberryPi Zero eine Lösung gesucht, die ohne viel Ressourcen beispielsweise nur den Inhalt einer Datei via http ausliefert. Da bietet sich Gatling von Fefe an; diese Lösung soll hier vorgestellt werden.<br />
<br />
==Installation==<br />
<syntaxhighlight lang="bash"><br />
apt install gatling<br />
</syntaxhighlight><br />
<br />
Es muss sodann /lib/systemd/system/gatling.service erstellt werden:<br />
<syntaxhighlight lang="html"><br />
#!/bin/sh<br />
<br />
[Unit]<br />
Description=Control gatling webserver<br />
After=networking.target<br />
<br />
[Service]<br />
Type=simple<br />
ExecStart=/usr/bin/gatling -u www-data -V -F -S -D -c /var/www/<br />
ExecReload=/bin/kill $MAINPID && /usr/bin/gatling -u www-data -V -F -S -D -c /var/www/<br />
<br />
[Install]<br />
WantedBy=multi-user.target<br />
</syntaxhighlight><br />
<br />
Danach muss diese Datei noch verlinkt werden:<br />
<syntaxhighlight lang="bash"><br />
cd /etc/systemd/system/multi-user.target.wants/<br />
ln -s /lib/systemd/system/gatling.service gatling.service<br />
</syntaxhighlight><br />
<br />
In /etc/default/gatling müssen die Kommentarzeichen vor den Zeilen<br />
<syntaxhighlight lang="bash"><br />
START_DAEMON="YES"<br />
DAEMON="gatling"<br />
</syntaxhighlight><br />
entfernt werden.<br />
<br />
Und nun starten:<br />
<syntaxhighlight lang="bash"><br />
# systemctl unmask gatling<br />
# systemctl restart gatling<br />
# systemctl enable gatling<br />
</syntaxhighlight><br />
<br />
(Der Autor hat Zugriffsrechte nicht geprüft. Idealerweise sollten nun Dateien aus /var/www/ ausgeliefert werden.)<br />
<br />
==Alternativen==<br />
Im Forum wurden in {{Link2Forum|Topic=98295|LinkText=diesem Thread}} eine Vielzahl an Alternativen für kleine, leichtgewichtige Webserver genannt. Insbesondere sei auf die Listen unter https://gist.github.com/willurd/5720255 sowie https://www.pcsuggest.com/best-lightweight-web-server-linux/ verwiesen.<br />
<br />
[[Kategorie:Raspberry Pi]]<br />
[[Kategorie:HOWTOS]]</div>Curthttp://wiki.fhem.de/w/index.php?title=Webserver_auf_Raspberry&diff=36038Webserver auf Raspberry2021-09-23T02:50:51Z<p>Curt: /* Installation */</p>
<hr />
<div>Auf Raspberry-Systemen benötigt man oft einen Webserver. Zwar gibt es bereits Lösungen wie Apache2 oder Nginx, allerdings sind diese rechenzeit- und speicherintensiv. Oft wird auf kleinen Systemen wie dem RaspberryPi Zero eine Lösung gesucht, die ohne viel Ressourcen beispielsweise nur den Inhalt einer Datei via http ausliefert. Da bietet sich Gating von Fefe an; diese Lösung soll hier vorgestellt werden.<br />
<br />
==Installation==<br />
<source lang="html"><br />
apt install gatling<br />
</source><br />
<br />
Es muss sodann /lib/systemd/system/gatling.service erstellt werden:<br />
<source lang="html"><br />
#!/bin/sh<br />
<br />
[Unit]<br />
Description=Control gatling webserver<br />
After=network.target<br />
<br />
[Service]<br />
Type=simple<br />
ExecStart=/usr/bin/gatling -u www-data -V -F -S -D -c /var/www/<br />
ExecReload=/bin/kill $MAINPID && /usr/bin/gatling -u www-data -V -F -S -D -c /var/www/<br />
<br />
[Install]<br />
WantedBy=multi-user.target<br />
</source><br />
<br />
Danach muss diese Datei noch verlinkt werden:<br />
<source lang="html"><br />
cd /etc/systemd/system/multi-user.target.wants/<br />
ln -s /lib/systemd/system/gatling.service gatling.service<br />
</source><br />
<br />
In /etc/default/gatling müssen die Kommentarzeichen vor den Zeilen<br />
<source lang="html"><br />
START_DAEMON="YES"<br />
DAEMON="gatling"<br />
</source><br />
entfernt werden.<br />
<br />
Und nun starten:<br />
<source lang="html"><br />
# systemctl unmask gatling<br />
# systemctl restart gatling<br />
# systemctl enable gatling<br />
<br />
</source><br />
<br />
(Der Autor hat Zugriffsrechte nicht geprüft. Idealerweise sollten nun Dateien aus /var/www/ ausgeliefert werden.)<br />
<br />
==Alternativen==<br />
Im Forum wurden im Thread https://forum.fhem.de/index.php/topic,98295.15.html eine Vielzahl an Alternativen für kleine, leichtgewichtige Webserver genannt. Insbesondere sei auf die Listen unter https://gist.github.com/willurd/5720255 sowie https://www.pcsuggest.com/best-lightweight-web-server-linux/ verwiesen.<br />
<br />
[[Kategorie:Raspberry Pi]]<br />
[[Kategorie:HOWTOS]]</div>Curthttp://wiki.fhem.de/w/index.php?title=Webserver_auf_Raspberry&diff=36037Webserver auf Raspberry2021-09-23T02:47:08Z<p>Curt: /* Installation */</p>
<hr />
<div>Auf Raspberry-Systemen benötigt man oft einen Webserver. Zwar gibt es bereits Lösungen wie Apache2 oder Nginx, allerdings sind diese rechenzeit- und speicherintensiv. Oft wird auf kleinen Systemen wie dem RaspberryPi Zero eine Lösung gesucht, die ohne viel Ressourcen beispielsweise nur den Inhalt einer Datei via http ausliefert. Da bietet sich Gating von Fefe an; diese Lösung soll hier vorgestellt werden.<br />
<br />
==Installation==<br />
<source lang="html"><br />
apt install gatling<br />
</source><br />
<br />
Es muss sodann /lib/systemd/system/gatling.service erstellt werden:<br />
<source lang="html"><br />
#!/bin/sh<br />
<br />
[Unit]<br />
Description=Control gatling webserver<br />
After=network.target<br />
<br />
[Service]<br />
Type=simple<br />
ExecStart=/usr/bin/gatling -u www-data -V -F -S -D -c /var/www/<br />
ExecReload=/bin/kill $MAINPID && /usr/bin/gatling -u www-data -V -F -S -D -c /var/www/<br />
<br />
[Install]<br />
WantedBy=multi-user.target<br />
</source><br />
<br />
Danach muss diese Datei noch verlinkt werden:<br />
<source lang="html"><br />
cd /etc/systemd/system/multi-user.target.wants/<br />
ln -s /lib/systemd/system/gatling.service gatling.service<br />
</source><br />
<br />
In /etc/default/gatling müssen die Kommentarzeichen vor den Zeilen<br />
<source lang="html"><br />
START_DAEMON="YES"<br />
DAEMON="gatling"<br />
</source><br />
entfernt werden.<br />
<br />
Und nun starten:<br />
<source lang="html"><br />
service gatling restart<br />
</source><br />
<br />
(Der Autor hat Zugriffsrechte nicht geprüft. Idealerweise sollten nun Dateien aus /var/www/ ausgeliefert werden.)<br />
<br />
==Alternativen==<br />
Im Forum wurden im Thread https://forum.fhem.de/index.php/topic,98295.15.html eine Vielzahl an Alternativen für kleine, leichtgewichtige Webserver genannt. Insbesondere sei auf die Listen unter https://gist.github.com/willurd/5720255 sowie https://www.pcsuggest.com/best-lightweight-web-server-linux/ verwiesen.<br />
<br />
[[Kategorie:Raspberry Pi]]<br />
[[Kategorie:HOWTOS]]</div>Curthttp://wiki.fhem.de/w/index.php?title=Webserver_auf_Raspberry&diff=36036Webserver auf Raspberry2021-09-23T02:45:31Z<p>Curt: /* Installation */</p>
<hr />
<div>Auf Raspberry-Systemen benötigt man oft einen Webserver. Zwar gibt es bereits Lösungen wie Apache2 oder Nginx, allerdings sind diese rechenzeit- und speicherintensiv. Oft wird auf kleinen Systemen wie dem RaspberryPi Zero eine Lösung gesucht, die ohne viel Ressourcen beispielsweise nur den Inhalt einer Datei via http ausliefert. Da bietet sich Gating von Fefe an; diese Lösung soll hier vorgestellt werden.<br />
<br />
==Installation==<br />
<source lang="html"><br />
apt install gatling<br />
</source><br />
<br />
Es muss sodann /lib/systemd/system/gatling.service erstellt werden:<br />
<source lang="html"><br />
#!/bin/sh<br />
<br />
[Unit]<br />
Description=Control gatling webserver<br />
After=network.target<br />
<br />
[Service]<br />
Type=simple<br />
ExecStart=/usr/bin/gatling -u www-data -V -F -S -D -c /var/www/<br />
ExecReload=/bin/kill $MAINPID && /usr/bin/gatling -u www-data -V -F -S -D -c /var/www/<br />
<br />
[Install]<br />
WantedBy=multi-user.target<br />
</source><br />
<br />
Danach muss diese Datei noch verlinkt werden:<br />
<source lang="html"><br />
cd /etc/systemd/system/multi-user.target.wants/<br />
ln -s /lib/systemd/system/gatling.service gatling.service<br />
</source><br />
<br />
In /etc/default/gatling müssen die Kommentarzeichen vor den Zeilen<br />
<source lang="html"><br />
START_DAEMON="YES"<br />
DAEMON="gatling"<br />
</source><br />
entfernt werden.<br />
<br />
Und nun starten:<br />
<source lang="html"><br />
service gatling start<br />
</source><br />
<br />
(Der Autor hat Zugriffsrechte nicht geprüft. Idealerweise sollten nun Dateien aus /var/www/ ausgeliefert werden.)<br />
<br />
==Alternativen==<br />
Im Forum wurden im Thread https://forum.fhem.de/index.php/topic,98295.15.html eine Vielzahl an Alternativen für kleine, leichtgewichtige Webserver genannt. Insbesondere sei auf die Listen unter https://gist.github.com/willurd/5720255 sowie https://www.pcsuggest.com/best-lightweight-web-server-linux/ verwiesen.<br />
<br />
[[Kategorie:Raspberry Pi]]<br />
[[Kategorie:HOWTOS]]</div>Curthttp://wiki.fhem.de/w/index.php?title=Webserver_auf_Raspberry&diff=36035Webserver auf Raspberry2021-09-23T02:43:45Z<p>Curt: /* Installation */ erweitert</p>
<hr />
<div>Auf Raspberry-Systemen benötigt man oft einen Webserver. Zwar gibt es bereits Lösungen wie Apache2 oder Nginx, allerdings sind diese rechenzeit- und speicherintensiv. Oft wird auf kleinen Systemen wie dem RaspberryPi Zero eine Lösung gesucht, die ohne viel Ressourcen beispielsweise nur den Inhalt einer Datei via http ausliefert. Da bietet sich Gating von Fefe an; diese Lösung soll hier vorgestellt werden.<br />
<br />
==Installation==<br />
<source lang="html"><br />
apt install gatling<br />
</source><br />
<br />
Es muss sodann /lib/systemd/system/gatling.service erstellt werden:<br />
<source lang="html"><br />
#!/bin/sh<br />
<br />
[Unit]<br />
Description=Control gatling webserver<br />
After=network.target<br />
<br />
[Service]<br />
Type=simple<br />
ExecStart=/usr/bin/gatling -u www-data -V -F -S -D -c /var/www/<br />
ExecReload=/bin/kill $MAINPID && /usr/bin/gatling -u www-data -V -F -S -D -c /var/www/<br />
<br />
[Install]<br />
WantedBy=multi-user.target<br />
</source><br />
<br />
Danach muss diese Datei noch verlinkt werden:<br />
<source lang="html"><br />
cd /etc/systemd/system/multi-user.target.wants/<br />
ln -s /lib/systemd/system/gatling.service gatling.service<br />
</source><br />
<br />
In /etc/default/gatling müssen die Kommentarzeichen vor der Zeile<br />
<source lang="html"><br />
START_DAEMON="YES"<br />
DAEMON="gatling"<br />
</source><br />
entfernt werden.<br />
<br />
Und nun starten:<br />
<source lang="html"><br />
service gatling start<br />
</source><br />
<br />
(Der Autor hat Zugriffsrechte nicht geprüft. Idealerweise sollten nun Dateien aus /var/www/ ausgeliefert werden.)<br />
<br />
==Alternativen==<br />
Im Forum wurden im Thread https://forum.fhem.de/index.php/topic,98295.15.html eine Vielzahl an Alternativen für kleine, leichtgewichtige Webserver genannt. Insbesondere sei auf die Listen unter https://gist.github.com/willurd/5720255 sowie https://www.pcsuggest.com/best-lightweight-web-server-linux/ verwiesen.<br />
<br />
[[Kategorie:Raspberry Pi]]<br />
[[Kategorie:HOWTOS]]</div>Curthttp://wiki.fhem.de/w/index.php?title=%C3%9Cberwachung_linuxbasierter_Server&diff=36034Überwachung linuxbasierter Server2021-09-23T02:34:10Z<p>Curt: /* Installation JSON-Script auf Clients */ so besser verständlich</p>
<hr />
<div>{{Baustelle}} <br />
<br />
Beachte: Artikel derzeit fragmentarisch, daher NICHT nutzbar.<br />
<br />
[[Datei:2019-03-13-serverueberwachung-1.jpg|right|500px]]<br />
<br />
In diesem Artikel wird im Sinne eines '''proof of concept''' die Möglichkeit der Überwachung vieler linuxbasierter Server auf ausstehende Updates, Plattenplatz usw. beschrieben. <br />
<!-- Falls das Inhaltsverzeichnis komplett darunter starten soll diese und die übernächste Zeile löschen...<br />
<br clear=all><br />
--><br />
==Vorbemerkung==<br />
Es gibt bereits mehrere, recht ausgefeilte Lösungen zur Überwachung von Servern: Angefangen von Nagios <br />
bis hin zum Modul [[SYSMON]]. Dem soll keine weitere Lösung hinzugefügt werden, es geht in diesem Projekt '''nicht''' um die minutengenaue Überwachung von Serverparametern. Hier geht es um einen '''täglichen''' Status aller Server im Hausnetz: Liegen Updates an, ist noch Plattenplatz frei? - Dabei ist der Fokus gelegt auf minimale Belastung der zu überwachenden Server (die im Folgenden "Clients" genannt werden) und des Netzes.<br />
<br />
==Begriffsbestimmung==<br />
In diesem Artikel ist "Server" das Gerät, auf dem FHEM läuft. Client/Clients sind Maschinen, die linuxbasiert (Debian, Ubuntu, Raspian) sind, beispielsweise kleine, leistungsschwache Raspberry Pi Zero. Obwohl auf diesen Clients ein Webserver erforderlich ist, installiert sein muss, werden sie der sprachlichen Klarheit wegen als "Client" benannt.<br />
<br />
==Installation auf den Clients==<br />
Jeder Client muss künftig zwei Bedingungen erfüllen: Erstens muss er täglich eine JSON-Datei seines Zustands bereitstellen. Zweitens muss ein Webserver diese Datei dem Server ausliefern können.<br />
<br />
===Installation Webserver auf Clients===<br />
Sofern noch kein Webserver installiert ist, sollte bei kleinen, schwachen Geräten ein möglichst leichtgewichtiger, ressourcensparender Webserver installiert werden. Ein Beispiel wird im Artikel [[Webserver auf Raspberry]] beschrieben, dort sind weitere Alternativen benannt. - Der Webserver sollte von /var/www ausliefern, dort ist händisch sodann ein Unterverzeichnis "html" anzulegen.<br />
<br />
===Installation JSON-Script auf Clients===<br />
Danach muss jeder Client in die Lage versetzt werden, eine JSON-Datei mit den tagesbezogenen Zustandsdaten des Client bereitzustellen. Dafür werden keinerlei Java oder Javascript (und im Sinne der Schlankheit auch nicht diesbezügliche riesige Pakete) benötigt. Das folgende bash-Script wird als status-pruefen unter /etc/cron.daily abgelegt, es erstellt täglich eine JSON-Datei unter /var/www/html, welche durch den Webserver auf Anfrage ausgeliefert wird:<br />
<br />
<source lang=html><br />
#!/bin/bash<br />
<br />
# Aufbau:<br />
# ab V0.2 JSON<br />
#<br />
# 2018-12-18 V0.5b me nur die 1. IP nehmen<br />
# 2018-12-14 V0.5a me Plattenbelegung Root-Partition<br />
# 2018-12-13 V0.3 me Filterung Temperatur Debian, Leerzeichen IP korrigiert<br />
# leere Variabeln nicht ausgeben<br />
# 2018-11-22 V0.3 me Vereinheitlichung der JSON-Variablen<br />
# 2018-11-19 V0.2 me Umbau auf JSON<br />
#<br />
<br />
# Diese Datei muss in /etc/cron.daily<br />
# Die Datei darf keine Extension haben!<br />
<br />
#<br />
# allgemeine Definitionen<br />
#<br />
<br />
# Root-Verzeichnis des Webservers - Name der Statusdatei<br />
# Verzeichnis ggf. anpassen!<br />
#<br />
ZIEL=/var/www/html/status2fhem.txt<br />
<br />
# Ab hier nichts veränder!<br />
VERS="V0.5b"<br />
<br />
DATE=`date +%Y-%m-%d`<br />
<br />
HOSTNAME=`/bin/hostname`<br />
<br />
SYS1=`/bin/cat /etc/issue`<br />
<br />
SYS2=`/bin/uname -a`<br />
<br />
IP1=`/bin/hostname -I | awk '{print $1}'`<br />
<br />
IPwlan0=`/sbin/ip addr show wlan0 | /bin/grep -vw "inet6" | /bin/grep "global" | /bin/grep -w "inet" | /usr/bin/cut -d/ -f1 | /usr/bin/awk '{ print $2 }'`<br />
<br />
UPDATE=`/usr/bin/apt-get dist-upgrade -qq -y -s | /bin/grep '^Inst ' | /usr/bin/wc -l`<br />
<br />
# gilt nur für RPi. Hier fehlt eine Weiche (weil es auch noch Debian und Ubuntu gibt)!<br />
# <br />
if [ -x /usr/bin/vcgencmd ]<br />
then RPitemp=`/usr/bin/vcgencmd measure_temp |/bin/sed -e s/temp=// |/bin/sed -e s/\'C//`<br />
fi<br />
<br />
# für Linux-like Systeme wie Debian muss es der Befehl "sensors" sein. Hier für APU, da ist die Ausgabe von sensors anders<br />
# das geht schief, wenn lm-sensors installiert ist, aber mit Fehler zurück kommt<br />
#<br />
if [ -x /usr/bin/sensors ]<br />
then APUtemp=$( /usr/bin/sensors | awk '/temp1/ {print $2}' | /bin/sed -e s/\+// | /bin/sed -e s/°C// )<br />
fi<br />
<br />
# Belegung der Root-Partition in %:<br />
PLATTE=`/bin/df --output=pcent / | /usr/bin/tail -1 | /bin/sed -e s/\ //g | /bin/sed -e s/\%//`<br />
<br />
# Ende der Befehle<br />
<br />
# testweise: Wann wird das Script eigentlich aufgerufen?<br />
/bin/cp /dev/null /tmp/timestamp<br />
<br />
# das JSON bauen:<br />
<br />
echo "{" > $ZIEL<br />
echo " "\"date\"\: \"$DATE\", >> $ZIEL<br />
# etwas wild: hinten 6 Zeichen Unfug abschneiden:<br />
echo " "\"sys-state\"\: \"${SYS1::-6}\", >> $ZIEL<br />
echo " "\"sys-detail\"\: \"$SYS2\", >> $ZIEL<br />
echo " "\"hostname\"\: \"$HOSTNAME\", >> $ZIEL<br />
if [ -n "$IP1" ] ; then echo " "\"IP\"\: \"$IP1\", >> $ZIEL ; fi<br />
if [ -n "$IPwlan0" ] ; then echo " "\"IPwlan0\"\: \"$IPwlan0\", >> $ZIEL ; fi<br />
echo " "\"update\"\: $UPDATE, >> $ZIEL<br />
if [ $RPitemp ]<br />
then echo " "\"temp\"\: $RPitemp, >> $ZIEL <br />
fi<br />
if [ $APUtemp ]<br />
then echo " "\"temp\"\: $APUtemp, >> $ZIEL<br />
fi<br />
echo " "\"platten\"\: $PLATTE, >> $ZIEL<br />
echo " "\"version\"\: \"$VERS\" >> $ZIEL<br />
echo "}" >> $ZIEL<br />
<br />
</source><br />
<br />
==Installationen auf dem Server==<br />
...<br />
===FHEM Scripte und Devices=== <br />
<br />
Sofern eine IP 24 Stunden nicht erreichbar war, wird die entsprechende Device automatisch gelöscht:<br />
<source lang="html"><br />
##########<br />
# alte IP-Devices rausschmeissen<br />
# https://forum.fhem.de/index.php/topic,94475.0.html<br />
# <br />
<br />
sub check_dead() {<br />
my $maxAge = 86400;<br />
my @checkDev = devspec2array("192.168.*");<br />
my $alive = 0;<br />
<br />
foreach my $d (@checkDev){<br />
$alive = 0;<br />
foreach my $r (keys %{$defs{$d}{READINGS}}){<br />
my $age = ReadingsAge($d,$r,0);<br />
$alive = 1 if ($age < $maxAge);<br />
Debug "device: $d reading: $r age: $age";<br />
}<br />
# Debug "delete $d" unless $alive;<br />
CommandDelete(undef,$d) unless $alive;<br />
}<br />
}<br />
</source><br />
<br />
<br />
===[[FTUI]] Kachel=== <br />
<br />
<br />
===Fakultative Installation auf dem Server=== <br />
...<br />
<br />
==Danksagung==<br />
Bei der Umsetzung der Idee halfen -manchmal ohne es zu wissen- mehrere Teilnehmer des FHEM-Forums, denen der Primärautor des Beitrags für ihre uneigennützige, freundliche Hilfe zu Dank verpflichtet ist.</div>Curthttp://wiki.fhem.de/w/index.php?title=%C3%9Cberwachung_linuxbasierter_Server&diff=36033Überwachung linuxbasierter Server2021-09-23T02:31:45Z<p>Curt: /* Installation JSON-Script auf Clients */</p>
<hr />
<div>{{Baustelle}} <br />
<br />
Beachte: Artikel derzeit fragmentarisch, daher NICHT nutzbar.<br />
<br />
[[Datei:2019-03-13-serverueberwachung-1.jpg|right|500px]]<br />
<br />
In diesem Artikel wird im Sinne eines '''proof of concept''' die Möglichkeit der Überwachung vieler linuxbasierter Server auf ausstehende Updates, Plattenplatz usw. beschrieben. <br />
<!-- Falls das Inhaltsverzeichnis komplett darunter starten soll diese und die übernächste Zeile löschen...<br />
<br clear=all><br />
--><br />
==Vorbemerkung==<br />
Es gibt bereits mehrere, recht ausgefeilte Lösungen zur Überwachung von Servern: Angefangen von Nagios <br />
bis hin zum Modul [[SYSMON]]. Dem soll keine weitere Lösung hinzugefügt werden, es geht in diesem Projekt '''nicht''' um die minutengenaue Überwachung von Serverparametern. Hier geht es um einen '''täglichen''' Status aller Server im Hausnetz: Liegen Updates an, ist noch Plattenplatz frei? - Dabei ist der Fokus gelegt auf minimale Belastung der zu überwachenden Server (die im Folgenden "Clients" genannt werden) und des Netzes.<br />
<br />
==Begriffsbestimmung==<br />
In diesem Artikel ist "Server" das Gerät, auf dem FHEM läuft. Client/Clients sind Maschinen, die linuxbasiert (Debian, Ubuntu, Raspian) sind, beispielsweise kleine, leistungsschwache Raspberry Pi Zero. Obwohl auf diesen Clients ein Webserver erforderlich ist, installiert sein muss, werden sie der sprachlichen Klarheit wegen als "Client" benannt.<br />
<br />
==Installation auf den Clients==<br />
Jeder Client muss künftig zwei Bedingungen erfüllen: Erstens muss er täglich eine JSON-Datei seines Zustands bereitstellen. Zweitens muss ein Webserver diese Datei dem Server ausliefern können.<br />
<br />
===Installation Webserver auf Clients===<br />
Sofern noch kein Webserver installiert ist, sollte bei kleinen, schwachen Geräten ein möglichst leichtgewichtiger, ressourcensparender Webserver installiert werden. Ein Beispiel wird im Artikel [[Webserver auf Raspberry]] beschrieben, dort sind weitere Alternativen benannt. - Der Webserver sollte von /var/www ausliefern, dort ist händisch sodann ein Unterverzeichnis "html" anzulegen.<br />
<br />
===Installation JSON-Script auf Clients===<br />
Danach muss jeder Client in die Lage versetzt werden, eine JSON-Datei mit den tagesbezogenen Zustandsdaten des Client bereitzustellen. Dafür werden keinerlei Java oder Javascript (und im Sinne der Schlankheit auch nicht diesbezügliche riesige Pakete) benötigt. Die folgende Datei wird als status-pruefen unter /etc/cron.daily abgelegt:<br />
<br />
<source lang=html><br />
#!/bin/bash<br />
<br />
# Aufbau:<br />
# ab V0.2 JSON<br />
#<br />
# 2018-12-18 V0.5b me nur die 1. IP nehmen<br />
# 2018-12-14 V0.5a me Plattenbelegung Root-Partition<br />
# 2018-12-13 V0.3 me Filterung Temperatur Debian, Leerzeichen IP korrigiert<br />
# leere Variabeln nicht ausgeben<br />
# 2018-11-22 V0.3 me Vereinheitlichung der JSON-Variablen<br />
# 2018-11-19 V0.2 me Umbau auf JSON<br />
#<br />
<br />
# Diese Datei muss in /etc/cron.daily<br />
# Die Datei darf keine Extension haben!<br />
<br />
#<br />
# allgemeine Definitionen<br />
#<br />
<br />
# Root-Verzeichnis des Webservers - Name der Statusdatei<br />
# Verzeichnis ggf. anpassen!<br />
#<br />
ZIEL=/var/www/html/status2fhem.txt<br />
<br />
# Ab hier nichts veränder!<br />
VERS="V0.5b"<br />
<br />
DATE=`date +%Y-%m-%d`<br />
<br />
HOSTNAME=`/bin/hostname`<br />
<br />
SYS1=`/bin/cat /etc/issue`<br />
<br />
SYS2=`/bin/uname -a`<br />
<br />
IP1=`/bin/hostname -I | awk '{print $1}'`<br />
<br />
IPwlan0=`/sbin/ip addr show wlan0 | /bin/grep -vw "inet6" | /bin/grep "global" | /bin/grep -w "inet" | /usr/bin/cut -d/ -f1 | /usr/bin/awk '{ print $2 }'`<br />
<br />
UPDATE=`/usr/bin/apt-get dist-upgrade -qq -y -s | /bin/grep '^Inst ' | /usr/bin/wc -l`<br />
<br />
# gilt nur für RPi. Hier fehlt eine Weiche (weil es auch noch Debian und Ubuntu gibt)!<br />
# <br />
if [ -x /usr/bin/vcgencmd ]<br />
then RPitemp=`/usr/bin/vcgencmd measure_temp |/bin/sed -e s/temp=// |/bin/sed -e s/\'C//`<br />
fi<br />
<br />
# für Linux-like Systeme wie Debian muss es der Befehl "sensors" sein. Hier für APU, da ist die Ausgabe von sensors anders<br />
# das geht schief, wenn lm-sensors installiert ist, aber mit Fehler zurück kommt<br />
#<br />
if [ -x /usr/bin/sensors ]<br />
then APUtemp=$( /usr/bin/sensors | awk '/temp1/ {print $2}' | /bin/sed -e s/\+// | /bin/sed -e s/°C// )<br />
fi<br />
<br />
# Belegung der Root-Partition in %:<br />
PLATTE=`/bin/df --output=pcent / | /usr/bin/tail -1 | /bin/sed -e s/\ //g | /bin/sed -e s/\%//`<br />
<br />
# Ende der Befehle<br />
<br />
# testweise: Wann wird das Script eigentlich aufgerufen?<br />
/bin/cp /dev/null /tmp/timestamp<br />
<br />
# das JSON bauen:<br />
<br />
echo "{" > $ZIEL<br />
echo " "\"date\"\: \"$DATE\", >> $ZIEL<br />
# etwas wild: hinten 6 Zeichen Unfug abschneiden:<br />
echo " "\"sys-state\"\: \"${SYS1::-6}\", >> $ZIEL<br />
echo " "\"sys-detail\"\: \"$SYS2\", >> $ZIEL<br />
echo " "\"hostname\"\: \"$HOSTNAME\", >> $ZIEL<br />
if [ -n "$IP1" ] ; then echo " "\"IP\"\: \"$IP1\", >> $ZIEL ; fi<br />
if [ -n "$IPwlan0" ] ; then echo " "\"IPwlan0\"\: \"$IPwlan0\", >> $ZIEL ; fi<br />
echo " "\"update\"\: $UPDATE, >> $ZIEL<br />
if [ $RPitemp ]<br />
then echo " "\"temp\"\: $RPitemp, >> $ZIEL <br />
fi<br />
if [ $APUtemp ]<br />
then echo " "\"temp\"\: $APUtemp, >> $ZIEL<br />
fi<br />
echo " "\"platten\"\: $PLATTE, >> $ZIEL<br />
echo " "\"version\"\: \"$VERS\" >> $ZIEL<br />
echo "}" >> $ZIEL<br />
<br />
</source><br />
<br />
==Installationen auf dem Server==<br />
...<br />
===FHEM Scripte und Devices=== <br />
<br />
Sofern eine IP 24 Stunden nicht erreichbar war, wird die entsprechende Device automatisch gelöscht:<br />
<source lang="html"><br />
##########<br />
# alte IP-Devices rausschmeissen<br />
# https://forum.fhem.de/index.php/topic,94475.0.html<br />
# <br />
<br />
sub check_dead() {<br />
my $maxAge = 86400;<br />
my @checkDev = devspec2array("192.168.*");<br />
my $alive = 0;<br />
<br />
foreach my $d (@checkDev){<br />
$alive = 0;<br />
foreach my $r (keys %{$defs{$d}{READINGS}}){<br />
my $age = ReadingsAge($d,$r,0);<br />
$alive = 1 if ($age < $maxAge);<br />
Debug "device: $d reading: $r age: $age";<br />
}<br />
# Debug "delete $d" unless $alive;<br />
CommandDelete(undef,$d) unless $alive;<br />
}<br />
}<br />
</source><br />
<br />
<br />
===[[FTUI]] Kachel=== <br />
<br />
<br />
===Fakultative Installation auf dem Server=== <br />
...<br />
<br />
==Danksagung==<br />
Bei der Umsetzung der Idee halfen -manchmal ohne es zu wissen- mehrere Teilnehmer des FHEM-Forums, denen der Primärautor des Beitrags für ihre uneigennützige, freundliche Hilfe zu Dank verpflichtet ist.</div>Curthttp://wiki.fhem.de/w/index.php?title=%C3%9Cberwachung_linuxbasierter_Server&diff=36032Überwachung linuxbasierter Server2021-09-23T02:30:52Z<p>Curt: /* Installation JSON-Script auf Clients */ Formatierung</p>
<hr />
<div>{{Baustelle}} <br />
<br />
Beachte: Artikel derzeit fragmentarisch, daher NICHT nutzbar.<br />
<br />
[[Datei:2019-03-13-serverueberwachung-1.jpg|right|500px]]<br />
<br />
In diesem Artikel wird im Sinne eines '''proof of concept''' die Möglichkeit der Überwachung vieler linuxbasierter Server auf ausstehende Updates, Plattenplatz usw. beschrieben. <br />
<!-- Falls das Inhaltsverzeichnis komplett darunter starten soll diese und die übernächste Zeile löschen...<br />
<br clear=all><br />
--><br />
==Vorbemerkung==<br />
Es gibt bereits mehrere, recht ausgefeilte Lösungen zur Überwachung von Servern: Angefangen von Nagios <br />
bis hin zum Modul [[SYSMON]]. Dem soll keine weitere Lösung hinzugefügt werden, es geht in diesem Projekt '''nicht''' um die minutengenaue Überwachung von Serverparametern. Hier geht es um einen '''täglichen''' Status aller Server im Hausnetz: Liegen Updates an, ist noch Plattenplatz frei? - Dabei ist der Fokus gelegt auf minimale Belastung der zu überwachenden Server (die im Folgenden "Clients" genannt werden) und des Netzes.<br />
<br />
==Begriffsbestimmung==<br />
In diesem Artikel ist "Server" das Gerät, auf dem FHEM läuft. Client/Clients sind Maschinen, die linuxbasiert (Debian, Ubuntu, Raspian) sind, beispielsweise kleine, leistungsschwache Raspberry Pi Zero. Obwohl auf diesen Clients ein Webserver erforderlich ist, installiert sein muss, werden sie der sprachlichen Klarheit wegen als "Client" benannt.<br />
<br />
==Installation auf den Clients==<br />
Jeder Client muss künftig zwei Bedingungen erfüllen: Erstens muss er täglich eine JSON-Datei seines Zustands bereitstellen. Zweitens muss ein Webserver diese Datei dem Server ausliefern können.<br />
<br />
===Installation Webserver auf Clients===<br />
Sofern noch kein Webserver installiert ist, sollte bei kleinen, schwachen Geräten ein möglichst leichtgewichtiger, ressourcensparender Webserver installiert werden. Ein Beispiel wird im Artikel [[Webserver auf Raspberry]] beschrieben, dort sind weitere Alternativen benannt. - Der Webserver sollte von /var/www ausliefern, dort ist händisch sodann ein Unterverzeichnis "html" anzulegen.<br />
<br />
===Installation JSON-Script auf Clients===<br />
Danach muss jeder Client in die Lage versetzt werden, eine JSON-Datei mit den tagesbezogenen Zustandsdaten des Client bereitzustellen. Dafür werden keinerlei Java oder Javascript (und im Sinne der Schlankheit auch nicht diesbezügliche riesige Pakete) benötigt. Die folgende Datei wird als status-pruefen unter /etc/cron.daily abgelegt:<br />
<br />
[source lang=html]<br />
#!/bin/bash<br />
<br />
# Aufbau:<br />
# ab V0.2 JSON<br />
#<br />
# 2018-12-18 V0.5b me nur die 1. IP nehmen<br />
# 2018-12-14 V0.5a me Plattenbelegung Root-Partition<br />
# 2018-12-13 V0.3 me Filterung Temperatur Debian, Leerzeichen IP korrigiert<br />
# leere Variabeln nicht ausgeben<br />
# 2018-11-22 V0.3 me Vereinheitlichung der JSON-Variablen<br />
# 2018-11-19 V0.2 me Umbau auf JSON<br />
#<br />
<br />
# Diese Datei muss in /etc/cron.daily<br />
# Die Datei darf keine Extension haben!<br />
<br />
#<br />
# allgemeine Definitionen<br />
#<br />
<br />
# Root-Verzeichnis des Webservers - Name der Statusdatei<br />
# Verzeichnis ggf. anpassen!<br />
#<br />
ZIEL=/var/www/html/status2fhem.txt<br />
<br />
# Ab hier nichts veränder!<br />
VERS="V0.5b"<br />
<br />
DATE=`date +%Y-%m-%d`<br />
<br />
HOSTNAME=`/bin/hostname`<br />
<br />
SYS1=`/bin/cat /etc/issue`<br />
<br />
SYS2=`/bin/uname -a`<br />
<br />
IP1=`/bin/hostname -I | awk '{print $1}'`<br />
<br />
IPwlan0=`/sbin/ip addr show wlan0 | /bin/grep -vw "inet6" | /bin/grep "global" | /bin/grep -w "inet" | /usr/bin/cut -d/ -f1 | /usr/bin/awk '{ print $2 }'`<br />
<br />
UPDATE=`/usr/bin/apt-get dist-upgrade -qq -y -s | /bin/grep '^Inst ' | /usr/bin/wc -l`<br />
<br />
# gilt nur für RPi. Hier fehlt eine Weiche (weil es auch noch Debian und Ubuntu gibt)!<br />
# <br />
if [ -x /usr/bin/vcgencmd ]<br />
then RPitemp=`/usr/bin/vcgencmd measure_temp |/bin/sed -e s/temp=// |/bin/sed -e s/\'C//`<br />
fi<br />
<br />
# für Linux-like Systeme wie Debian muss es der Befehl "sensors" sein. Hier für APU, da ist die Ausgabe von sensors anders<br />
# das geht schief, wenn lm-sensors installiert ist, aber mit Fehler zurück kommt<br />
#<br />
if [ -x /usr/bin/sensors ]<br />
then APUtemp=$( /usr/bin/sensors | awk '/temp1/ {print $2}' | /bin/sed -e s/\+// | /bin/sed -e s/°C// )<br />
fi<br />
<br />
# Belegung der Root-Partition in %:<br />
PLATTE=`/bin/df --output=pcent / | /usr/bin/tail -1 | /bin/sed -e s/\ //g | /bin/sed -e s/\%//`<br />
<br />
# Ende der Befehle<br />
<br />
# testweise: Wann wird das Script eigentlich aufgerufen?<br />
/bin/cp /dev/null /tmp/timestamp<br />
<br />
# das JSON bauen:<br />
<br />
echo "{" > $ZIEL<br />
echo " "\"date\"\: \"$DATE\", >> $ZIEL<br />
# etwas wild: hinten 6 Zeichen Unfug abschneiden:<br />
echo " "\"sys-state\"\: \"${SYS1::-6}\", >> $ZIEL<br />
echo " "\"sys-detail\"\: \"$SYS2\", >> $ZIEL<br />
echo " "\"hostname\"\: \"$HOSTNAME\", >> $ZIEL<br />
if [ -n "$IP1" ] ; then echo " "\"IP\"\: \"$IP1\", >> $ZIEL ; fi<br />
if [ -n "$IPwlan0" ] ; then echo " "\"IPwlan0\"\: \"$IPwlan0\", >> $ZIEL ; fi<br />
echo " "\"update\"\: $UPDATE, >> $ZIEL<br />
if [ $RPitemp ]<br />
then echo " "\"temp\"\: $RPitemp, >> $ZIEL <br />
fi<br />
if [ $APUtemp ]<br />
then echo " "\"temp\"\: $APUtemp, >> $ZIEL<br />
fi<br />
echo " "\"platten\"\: $PLATTE, >> $ZIEL<br />
echo " "\"version\"\: \"$VERS\" >> $ZIEL<br />
echo "}" >> $ZIEL<br />
<br />
[/source]<br />
<br />
==Installationen auf dem Server==<br />
...<br />
===FHEM Scripte und Devices=== <br />
<br />
Sofern eine IP 24 Stunden nicht erreichbar war, wird die entsprechende Device automatisch gelöscht:<br />
<source lang="html"><br />
##########<br />
# alte IP-Devices rausschmeissen<br />
# https://forum.fhem.de/index.php/topic,94475.0.html<br />
# <br />
<br />
sub check_dead() {<br />
my $maxAge = 86400;<br />
my @checkDev = devspec2array("192.168.*");<br />
my $alive = 0;<br />
<br />
foreach my $d (@checkDev){<br />
$alive = 0;<br />
foreach my $r (keys %{$defs{$d}{READINGS}}){<br />
my $age = ReadingsAge($d,$r,0);<br />
$alive = 1 if ($age < $maxAge);<br />
Debug "device: $d reading: $r age: $age";<br />
}<br />
# Debug "delete $d" unless $alive;<br />
CommandDelete(undef,$d) unless $alive;<br />
}<br />
}<br />
</source><br />
<br />
<br />
===[[FTUI]] Kachel=== <br />
<br />
<br />
===Fakultative Installation auf dem Server=== <br />
...<br />
<br />
==Danksagung==<br />
Bei der Umsetzung der Idee halfen -manchmal ohne es zu wissen- mehrere Teilnehmer des FHEM-Forums, denen der Primärautor des Beitrags für ihre uneigennützige, freundliche Hilfe zu Dank verpflichtet ist.</div>Curthttp://wiki.fhem.de/w/index.php?title=%C3%9Cberwachung_linuxbasierter_Server&diff=36031Überwachung linuxbasierter Server2021-09-23T02:27:31Z<p>Curt: /* Installation JSON-Script auf Clients */ Der Code</p>
<hr />
<div>{{Baustelle}} <br />
<br />
Beachte: Artikel derzeit fragmentarisch, daher NICHT nutzbar.<br />
<br />
[[Datei:2019-03-13-serverueberwachung-1.jpg|right|500px]]<br />
<br />
In diesem Artikel wird im Sinne eines '''proof of concept''' die Möglichkeit der Überwachung vieler linuxbasierter Server auf ausstehende Updates, Plattenplatz usw. beschrieben. <br />
<!-- Falls das Inhaltsverzeichnis komplett darunter starten soll diese und die übernächste Zeile löschen...<br />
<br clear=all><br />
--><br />
==Vorbemerkung==<br />
Es gibt bereits mehrere, recht ausgefeilte Lösungen zur Überwachung von Servern: Angefangen von Nagios <br />
bis hin zum Modul [[SYSMON]]. Dem soll keine weitere Lösung hinzugefügt werden, es geht in diesem Projekt '''nicht''' um die minutengenaue Überwachung von Serverparametern. Hier geht es um einen '''täglichen''' Status aller Server im Hausnetz: Liegen Updates an, ist noch Plattenplatz frei? - Dabei ist der Fokus gelegt auf minimale Belastung der zu überwachenden Server (die im Folgenden "Clients" genannt werden) und des Netzes.<br />
<br />
==Begriffsbestimmung==<br />
In diesem Artikel ist "Server" das Gerät, auf dem FHEM läuft. Client/Clients sind Maschinen, die linuxbasiert (Debian, Ubuntu, Raspian) sind, beispielsweise kleine, leistungsschwache Raspberry Pi Zero. Obwohl auf diesen Clients ein Webserver erforderlich ist, installiert sein muss, werden sie der sprachlichen Klarheit wegen als "Client" benannt.<br />
<br />
==Installation auf den Clients==<br />
Jeder Client muss künftig zwei Bedingungen erfüllen: Erstens muss er täglich eine JSON-Datei seines Zustands bereitstellen. Zweitens muss ein Webserver diese Datei dem Server ausliefern können.<br />
<br />
===Installation Webserver auf Clients===<br />
Sofern noch kein Webserver installiert ist, sollte bei kleinen, schwachen Geräten ein möglichst leichtgewichtiger, ressourcensparender Webserver installiert werden. Ein Beispiel wird im Artikel [[Webserver auf Raspberry]] beschrieben, dort sind weitere Alternativen benannt. - Der Webserver sollte von /var/www ausliefern, dort ist händisch sodann ein Unterverzeichnis "html" anzulegen.<br />
<br />
===Installation JSON-Script auf Clients===<br />
Danach muss jeder Client in die Lage versetzt werden, eine JSON-Datei mit den tagesbezogenen Zustandsdaten des Client bereitzustellen. Dafür werden keinerlei Java oder Javascript (und im Sinne der Schlankheit auch nicht diesbezügliche riesige Pakete) benötigt.<br />
<br />
[code]<br />
<br />
<nowiki>#</nowiki>!/bin/bash<br />
<br />
<nowiki>#</nowiki> Aufbau:<br />
<br />
<nowiki>#</nowiki> ab V0.2 JSON<br />
<br />
<nowiki>#</nowiki><br />
<br />
<nowiki>#</nowiki> 2018-12-18 V0.5b me nur die 1. IP nehmen<br />
<br />
<nowiki>#</nowiki> 2018-12-14 V0.5a me Plattenbelegung Root-Partition<br />
<br />
<nowiki>#</nowiki> 2018-12-13 V0.3 me Filterung Temperatur Debian, Leerzeichen IP korrigiert<br />
<br />
<nowiki>#</nowiki> leere Variabeln nicht ausgeben<br />
<br />
<nowiki>#</nowiki> 2018-11-22 V0.3 me Vereinheitlichung der JSON-Variablen<br />
<br />
<nowiki>#</nowiki> 2018-11-19 V0.2 me Umbau auf JSON<br />
<br />
<nowiki>#</nowiki><br />
<br />
<nowiki>#</nowiki> Diese Datei muss in /etc/cron.daily<br />
<br />
<nowiki>#</nowiki> Die Datei darf keine Extension haben!<br />
<br />
<nowiki>#</nowiki><br />
<br />
<nowiki>#</nowiki> allgemeine Definitionen<br />
<br />
<nowiki>#</nowiki><br />
<br />
<nowiki>#</nowiki> Root-Verzeichnis des Webservers - Name der Statusdatei<br />
<br />
<nowiki>#</nowiki> Verzeichnis ggf. anpassen!<br />
<br />
<nowiki>#</nowiki><br />
<br />
ZIEL=/var/www/html/status2fhem.txt<br />
<br />
<nowiki>#</nowiki> Ab hier nichts veränder!<br />
<br />
VERS="V0.5b"<br />
<br />
DATE=`date +%Y-%m-%d`<br />
<br />
HOSTNAME=`/bin/hostname`<br />
<br />
SYS1=`/bin/cat /etc/issue`<br />
<br />
SYS2=`/bin/uname -a`<br />
<br />
IP1=`/bin/hostname -I | awk '{print $1}'`<br />
<br />
IPwlan0=`/sbin/ip addr show wlan0 | /bin/grep -vw "inet6" | /bin/grep "global" | /bin/grep -w "inet" | /usr/bin/cut -d/ -f1 | /usr/bin/awk '{ print $2 }'`<br />
<br />
UPDATE=`/usr/bin/apt-get dist-upgrade -qq -y -s | /bin/grep '^Inst ' | /usr/bin/wc -l`<br />
<br />
<nowiki>#</nowiki> gilt nur für RPi. Hier fehlt eine Weiche (weil es auch noch Debian und Ubuntu gibt)!<br />
<br />
<nowiki>#</nowiki> <br />
<br />
if [ -x /usr/bin/vcgencmd ]<br />
<br />
then RPitemp=`/usr/bin/vcgencmd measure_temp |/bin/sed -e s/temp=// |/bin/sed -e s/\'C//`<br />
<br />
fi<br />
<br />
<nowiki>#</nowiki> für Linux-like Systeme wie Debian muss es der Befehl "sensors" sein. Hier für APU, da ist die Ausgabe von sensors anders<br />
<br />
<nowiki>#</nowiki> das geht schief, wenn lm-sensors installiert ist, aber mit Fehler zurück kommt<br />
<br />
<nowiki>#</nowiki><br />
<br />
if [ -x /usr/bin/sensors ]<br />
<br />
then APUtemp=$( /usr/bin/sensors | awk '/temp1/ {print $2}' | /bin/sed -e s/\+// | /bin/sed -e s/°C// )<br />
<br />
fi<br />
<br />
<nowiki>#</nowiki> Belegung der Root-Partition in %:<br />
<br />
PLATTE=`/bin/df --output=pcent / | /usr/bin/tail -1 | /bin/sed -e s/\ //g | /bin/sed -e s/\%//`<br />
<br />
<nowiki>#</nowiki> Ende der Befehle<br />
<br />
<nowiki>#</nowiki> testweise: Wann wird das Script eigentlich aufgerufen?<br />
<br />
/bin/cp /dev/null /tmp/timestamp<br />
<br />
<nowiki>#</nowiki> das JSON bauen:<br />
<br />
echo "{" > $ZIEL<br />
<br />
echo " "\"date\"\: \"$DATE\", >> $ZIEL<br />
<br />
<nowiki>#</nowiki> etwas wild: hinten 6 Zeichen Unfug abschneiden:<br />
<br />
echo " "\"sys-state\"\: \"${SYS1::-6}\", >> $ZIEL<br />
<br />
echo " "\"sys-detail\"\: \"$SYS2\", >> $ZIEL<br />
<br />
echo " "\"hostname\"\: \"$HOSTNAME\", >> $ZIEL<br />
<br />
if [ -n "$IP1" ] ; then echo " "\"IP\"\: \"$IP1\", >> $ZIEL ; fi<br />
<br />
if [ -n "$IPwlan0" ] ; then echo " "\"IPwlan0\"\: \"$IPwlan0\", >> $ZIEL ; fi<br />
<br />
echo " "\"update\"\: $UPDATE, >> $ZIEL<br />
<br />
if [ $RPitemp ]<br />
<br />
then echo " "\"temp\"\: $RPitemp, >> $ZIEL <br />
<br />
fi<br />
<br />
if [ $APUtemp ]<br />
<br />
then echo " "\"temp\"\: $APUtemp, >> $ZIEL<br />
<br />
fi<br />
<br />
echo " "\"platten\"\: $PLATTE, >> $ZIEL<br />
<br />
echo " "\"version\"\: \"$VERS\" >> $ZIEL<br />
<br />
echo "}" >> $ZIEL<br />
<br />
[/code]<br />
<br />
==Installationen auf dem Server==<br />
...<br />
===FHEM Scripte und Devices=== <br />
<br />
Sofern eine IP 24 Stunden nicht erreichbar war, wird die entsprechende Device automatisch gelöscht:<br />
<source lang="html"><br />
##########<br />
# alte IP-Devices rausschmeissen<br />
# https://forum.fhem.de/index.php/topic,94475.0.html<br />
# <br />
<br />
sub check_dead() {<br />
my $maxAge = 86400;<br />
my @checkDev = devspec2array("192.168.*");<br />
my $alive = 0;<br />
<br />
foreach my $d (@checkDev){<br />
$alive = 0;<br />
foreach my $r (keys %{$defs{$d}{READINGS}}){<br />
my $age = ReadingsAge($d,$r,0);<br />
$alive = 1 if ($age < $maxAge);<br />
Debug "device: $d reading: $r age: $age";<br />
}<br />
# Debug "delete $d" unless $alive;<br />
CommandDelete(undef,$d) unless $alive;<br />
}<br />
}<br />
</source><br />
<br />
<br />
===[[FTUI]] Kachel=== <br />
<br />
<br />
===Fakultative Installation auf dem Server=== <br />
...<br />
<br />
==Danksagung==<br />
Bei der Umsetzung der Idee halfen -manchmal ohne es zu wissen- mehrere Teilnehmer des FHEM-Forums, denen der Primärautor des Beitrags für ihre uneigennützige, freundliche Hilfe zu Dank verpflichtet ist.</div>Curthttp://wiki.fhem.de/w/index.php?title=Z-Wave-Eurotronic_Spirit_Thermostat&diff=33904Z-Wave-Eurotronic Spirit Thermostat2020-09-12T00:19:05Z<p>Curt: /* Inklusion */</p>
<hr />
<div>{{Infobox Hardware<br />
|Bild=platzHalter.png<br />
|Bildbeschreibung=todo<br />
|HWProtocol=Z-Wave Plus <br />
|HWType=Aktor, Empfänger und Sender, Sensor<br />
|HWCategory=Z-Wave<br />
|HWComm=Funk 868MHz<br />
|HWChannels=<br />
|HWVoltage=3V<br />
|HWPowerConsumption=<br />
|HWPoweredBy=2xBatterie AA Mignon<br />
|HWSize=<br />
|HWDeviceFHEM=[http://fhem.de/commandref.html#ZWave Z-Wave]<br />
|HWManufacturer=[https://eurotronic.org/ EUROTRONIC Technology GmbH]<br />
}}<br />
<br />
[[Z-Wave-Eurotronic Spirit Thermostat]] ist ein Heizungsthermostat mit Z-Wave 500er-Serie-Chip und Z-Wave Plus-Zertifizierung<br />
<br />
<br />
== Features ==<br />
* [[Z-Wave#FLIRS-Ger.C3.A4te|FLiRS-Gerät]]<br />
* siehe Handbuch<br />
<br />
== Hinweise zum Betrieb mit FHEM ==<br />
=== Inklusion === <br />
Der Aktor wird bei der Inklusion und aktiviertem Autocreate vollautomatisch erkannt und definiert. '''Beachte:''' Es wurde beobachtet, dass bei gesetztem Attribut "ignoreTypes" (bei autocreate) die Inklusion scheitert.<br />
<br />
Eine beispielhafte durch autocreate erzeugte Definition mit Hinweisen zu manuellen Ergänzungen findet sich unter [[#Definition|Definition]].<br />
<br />
=== Assoziation ===<br />
Der Controller muss zur korrekten Funktion in die Assoziationsgruppe 1 des Thermostats aufgenommen werden. Dies geschieht während der Inklusion durch FHEM automatisch durch Absetzen des folgenden Befehls:<br />
:<code>set <device> associationAdd 1 <Controller-NodeID></code><br />
<br />
Die erfolgreiche Ausführung des Befehls während der Inklusion durch Abfrage überprüfen:<br />
:<code>get <device> associationAll</code><br />
<br />
=== Konfiguration ===<br />
Konfigurationsanpassungen des Thermostates an eigene Wunschvorstellungen können anschließend vorgenommen werden.<br />
<br />
Abschließend ist es sinnvoll die Konfiguration zu Sicherungs- und Kontrollzwecken komplett abzurufen:<br />
:<code>get <device> configAll</code><br />
<br />
=== Befehle zur Steuerung ===<br />
{{Hinweis|Das Thermostat antwortet bei Einstellungen per Funk mit einem set-Befehl nicht mit einem Telegramm über die vorgenommene Änderung. Um die entsprechenden Readings aktuell zu halten und die erfolgreiche Ausführung des set-Befehls zu kontrollieren kann der zugehörige get-Befehl, der im Folgenden jeweils aufgeführt wird, verwendet werden. Bei Änderungen über die Bedienung am Gerät wird FHEM hingegen per Telegramm über die vorgenommene Änderung informiert.}}<br />
<br />
==== Betriebsmodi ====<br />
Die nachfolgende Tabelle enthält die Aktivierungsbefehle für alle Betriebsmodi des Thermostats. Weitere Modi (tmCooling, tmAuto, tmFan) werden vom Gerät -obwohl von FHEM angeboten- nicht unterstützt.<br />
<br />
{| class="wikitable"<br />
|-<br />
!Befehl!!Beschreibung<br />
|-<br />
|<code>set <device> tmOff</code>||Aus-Modus: Aus mit Regelung auf 6°C als Frostschutz<br />
|-<br />
|<code>set <device> tmHeating</code>||Komfortmodus: Regelung entsprechend [[#Komfortmodus|Solltemperatur Komfortmodus]]<br />
|-<br />
|<code>set <device> tmEnergySaveHeating</code>||Absenkmodus: Regelung entsprechend [[#Absenkmodus|Solltemperatur Absenkmodus]]<br />
|-<br />
|<code>set <device> tmFullPower</code>||Boostmodus: schnellstmögliche Raumaufheizung für maximal 5 Minuten<br />
|-<br />
|<code>set <device> tmManual</code>||Stellwertmodus (Manufacturer Specific): Ventilöffnung über Command Class SWITCH_MUTILEVEL einstellen<br />
|}<br />
<br />
Abfrage des eingestellten Betriebsmodus mit: <code>get <device> thermostatMode</code><br />
<br />
Steuerungsbefehle der Command Class SWITCH_MUTILEVEL ausschließlich für den Stellwertmodus (tmManual):<br />
<br />
{| class="wikitable"<br />
|-<br />
!Befehl im Stellwertmodus!!Beschreibung<br />
|-<br />
|<code>set <device> dim %</code>|| Ventilöffnung von 0% bis 100%, wobei 99 = 100%<br />
|-<br />
|<code>set <device> on</code>||letzten Ventilöffnungsgrad einstellen; sinnvoll beispielsweise nach Aus-Modus (tmOff)<br />
|-<br />
|<code>set <device> off</code>||kleinstmögliche Ventilöffnung; entspricht 0%<br />
|-<br />
|}<br />
<br />
Im Stellwertmodus erfolgt keine automatische Temperaturregelung durch das Spirit, sondern diese muss durch separate Logik (beispielsweise mit Hilfe von [[PID20 - Der PID-Regler|PID20]]) überwacht und geregelt werden. <br />
<br />
Der Öffnungsstand wird mit <code>get <device> swmStatus</code> abgefragt. Zudem kann mit der Parameternummer 6 der Command Class CONFIGURATION der automatische Versand des Ventilöffnungsgrades bei bestimmten Veränderungen eingeschaltet werden (configValveOpeningPercentageReport).<br />
<br />
==== Solltemperaturen ====<br />
Die Solltemperaturen in den Modi Komfortmodus (tmHeating) und Absenkmodus (tmEnergySaveHeating) lassen sich im Temperaturbereich 8°C bis 28 °C anpassen. Die Solltemperatur für den Absenkmodus lässt sich ausschließlich per Funk anpassen. Im Aus-Modus (tmOff) und Boostmodus (tmFullPower) ist keine Anpassung möglich.<br />
<br />
Die Einstellung der Solltemperaturen erfolgt mit dem set-Befehl <code>thermostatSetpointSet</code> oder dem funktionsgleichen set-Befehl <code>desired-temp</code>. Der letzte Befehl wurde zur Angleichung an andere Module eingeführt und im folgenden genutzt.<br />
<br />
===== Komfortmodus =====<br />
Die Solltemperatur auf NN.N °C wird mit folgendem Kurzbefehl eingestellt:<br />
<br />
<code>set <device> desired-temp NN.N</code><br />
<br />
Dies entspricht dem ausführlichen Befehl:<br />
<br />
<code>set <device> desired-temp NN.N C 1</code><br />
<br />
Die eingestellte Solltemperatur abrufen:<br />
<br />
<code>get <device> setpoint 1</code><br />
<br />
oder mit dem Kurzbefehl<br />
<br />
<code>get <device> setpoint</code><br />
<br />
===== Absenkmodus =====<br />
Die Solltemperatur auf NN.N °C wird mit folgendem Befehl eingestellt:<br />
<br />
<code>set <device> desired-temp NN.N C 11</code><br />
<br />
Die eingestellte Solltemperatur abrufen:<br />
<br />
<code>get <device> setpoint 11</code><br />
<br />
==== Kindersicherung ====<br />
{| class="wikitable"<br />
|-<br />
!Befehl!!Beschreibung<br />
|-<br />
|<code>set <device> protectionOff</code>||Ungeschützt - Bedienung am Gerät uneingeschränkt möglich<br />
|-<br />
|<code>set <device> protectionSeq</code>||Eingeschränkt - Bedienung am Gerät erst nach Entsperrung am Gerät (gleichzeitiges Drücken von {{Taste|+}} und {{Taste|-}} für 3 Sekunden)<br />
|-<br />
|<code>set <device> protectionOn</code>||Deaktiviert - Bedienung am Gerät deaktiviert und Steuerung ausschließlich per Funk<br />
|}<br />
<br />
Abfrage der eingestellten Kindersicherung mit: <code>get <device> protection</code><br />
<br />
=== Definition ===<br />
Ein Beispiel für ein Spirit FHEM-Device enthält der nachfolgende exemplarische Auszug aus der [[Konfiguration]]:<br />
define ZWave_THERMOSTAT_53 ZWave e345c452 53<br />
attr ZWave_THERMOSTAT_53 IODev ZWDongle<br />
attr ZWave_THERMOSTAT_53 classes ZWAVEPLUS_INFO ASSOCIATION ASSOCIATION_GRP_INFO VERSION MANUFACTURER_SPECIFIC DEVICE_RESET_LOCALLY PROTECTION SENSOR_MULTILEVEL SWITCH_MULTILEVEL THERMOSTAT_MODE THERMOSTAT_SETPOINT BATTERY <br />
CONFIGURATION ALARM POWERLEVEL SECURITY SECURITY_S2 TRANSPORT_SERVICE SUPERVISION FIRMWARE_UPDATE_MD<br />
attr ZWave_THERMOSTAT_53 extendedAlarmReadings 1<br />
attr ZWave_THERMOSTAT_53 room ZWave<br />
attr ZWave_THERMOSTAT_53 stateFormat temperature<br />
attr ZWave_THERMOSTAT_53 vclasses ALARM:8 ASSOCIATION:2 ASSOCIATION_GRP_INFO:1 BATTERY:1 CONFIGURATION:1 DEVICE_RESET_LOCALLY:1 FIRMWARE_UPDATE_MD:3 MANUFACTURER_SPECIFIC:1 POWERLEVEL:1 PROTECTION:1 SECURITY:1 SECURITY_S2:1 <br />
SENSOR_MULTILEVEL:5 SUPERVISION:1 SWITCH_MULTILEVEL:1 THERMOSTAT_MODE:3 THERMOSTAT_SETPOINT:3 TRANSPORT_SERVICE:2 VERSION:2 ZWAVEPLUS_INFO:2<br />
Im vorstehenden Beispiel wurde manuell das Attribut <code>extendedAlarmReadings</code> auf <code>1</code> gesetzt, damit für die diversen Alarmarten einfacher unterscheidbare Events erzeugt und separate Readings angelegt werden. Zudem wurde manuell das Attribut <code>stateFormat</code> angelegt. Sämliche anderen Angaben der Defintion nebst Attributen wurden von FHEM bei der Inklusion automatisch durch autocreate angelegt.<br />
<br />
=== Logbeispiel ===<br />
2018-10-19_18:04:14 ZWave_THERMOSTAT_53 setpointTemp: 18.0 C energySaveHeating<br />
2018-10-19_18:04:34 ZWave_THERMOSTAT_53 setpointTemp: 22.0 C heating<br />
2018-10-19_18:04:54 ZWave_THERMOSTAT_53 thermostatMode: heating<br />
2018-10-19_18:05:03 ZWave_THERMOSTAT_53 thermostatSetpointSupported: heating energySaveHeating<br />
2018-10-19_18:05:13 ZWave_THERMOSTAT_53 version: Lib 3 Prot 4.61 App 0.16 HW 49 FWCounter 1 FW 0.10<br />
2018-10-19_18:05:24 ZWave_THERMOSTAT_53 zwavePlusInfo: version:01 role:SleepingListeningSlave node:Z-Wave+Node installerIcon:1200 userIcon:1200<br />
2018-10-19_18:06:32 ZWave_THERMOSTAT_53 alarm_System: Event cleared: unknown event 0, notificationIsOn<br />
2018-10-19_18:08:02 ZWave_THERMOSTAT_53 battery: 100 %<br />
2018-10-19_18:08:02 ZWave_THERMOSTAT_53 batteryState: ok<br />
2018-10-19_18:08:02 ZWave_THERMOSTAT_53 batteryPercent: 100<br />
2018-10-19_18:10:10 ZWave_THERMOSTAT_53 temperature: 23.27 C<br />
2018-10-19_18:18:10 ZWave_THERMOSTAT_53 temperature: 22.73 C<br />
2018-10-19_18:30:10 ZWave_THERMOSTAT_53 temperature: 22.29 C<br />
2018-10-19_19:00:17 ZWave_THERMOSTAT_53 thermostatMode: energySaveHeating<br />
2018-10-19_19:00:55 ZWave_THERMOSTAT_53 thermostatMode: off<br />
2018-10-19_19:06:10 ZWave_THERMOSTAT_53 temperature: 21.75 C<br />
2018-10-19_23:22:18 ZWave_THERMOSTAT_53 thermostatMode: energySaveHeating<br />
2018-10-19_23:27:31 ZWave_THERMOSTAT_53 set_tmHeating<br />
2018-10-19_23:27:32 ZWave_THERMOSTAT_53 tmHeating<br />
<br />
== Links ==<br />
* [https://products.z-wavealliance.org/products/2543 Eintrag in http://products.z-wavealliance.org mit Handbuch und mehr]<br />
* [https://eurotronic.org/wp-content/uploads/2018/08/Spirit_Z-Wave_BAL_web_DE_view_V5.pdf deutsches Handbuch auf Hersteller-Webseite]<br />
* Nutzung eines direkt assozierten Fenstersensors zur Fenster-Offen-Erkennung: {{Link2Forum|Topic=92206}}<br />
* {{Link2Forum|Topic=77598|Message=701397|LinkText=Temperaturwerte eines Nicht-ZWave-Gerätes an das Spirit zur Regelung übermitteln}}<br />
* {{Link2Forum|Topic=77598|Message=854445|LinkText=Nutzung des Modul PID20 zur Temperaturregelung im Stellwertmodus (tmManual)}}<br />
<br />
[[Kategorie:Z-Wave Components|Sensor]]<br />
[[Kategorie:Heizungsventile]]</div>Curthttp://wiki.fhem.de/w/index.php?title=Z-Wave-Eurotronic_Spirit_Thermostat&diff=33903Z-Wave-Eurotronic Spirit Thermostat2020-09-12T00:18:21Z<p>Curt: /* Inklusion */</p>
<hr />
<div>{{Infobox Hardware<br />
|Bild=platzHalter.png<br />
|Bildbeschreibung=todo<br />
|HWProtocol=Z-Wave Plus <br />
|HWType=Aktor, Empfänger und Sender, Sensor<br />
|HWCategory=Z-Wave<br />
|HWComm=Funk 868MHz<br />
|HWChannels=<br />
|HWVoltage=3V<br />
|HWPowerConsumption=<br />
|HWPoweredBy=2xBatterie AA Mignon<br />
|HWSize=<br />
|HWDeviceFHEM=[http://fhem.de/commandref.html#ZWave Z-Wave]<br />
|HWManufacturer=[https://eurotronic.org/ EUROTRONIC Technology GmbH]<br />
}}<br />
<br />
[[Z-Wave-Eurotronic Spirit Thermostat]] ist ein Heizungsthermostat mit Z-Wave 500er-Serie-Chip und Z-Wave Plus-Zertifizierung<br />
<br />
<br />
== Features ==<br />
* [[Z-Wave#FLIRS-Ger.C3.A4te|FLiRS-Gerät]]<br />
* siehe Handbuch<br />
<br />
== Hinweise zum Betrieb mit FHEM ==<br />
=== Inklusion === <br />
Der Aktor wird bei der Inklusion und aktiviertem Autocreate vollautomatisch erkannt und definiert. <nowiki>'''Beachte:'''</nowiki> Es wurde beobachtet, dass bei gesetztem Attribut "ignoreTypes" (bei autocreate) die Inklusion scheitert.<br />
<br />
Eine beispielhafte durch autocreate erzeugte Definition mit Hinweisen zu manuellen Ergänzungen findet sich unter [[#Definition|Definition]].<br />
<br />
=== Assoziation ===<br />
Der Controller muss zur korrekten Funktion in die Assoziationsgruppe 1 des Thermostats aufgenommen werden. Dies geschieht während der Inklusion durch FHEM automatisch durch Absetzen des folgenden Befehls:<br />
:<code>set <device> associationAdd 1 <Controller-NodeID></code><br />
<br />
Die erfolgreiche Ausführung des Befehls während der Inklusion durch Abfrage überprüfen:<br />
:<code>get <device> associationAll</code><br />
<br />
=== Konfiguration ===<br />
Konfigurationsanpassungen des Thermostates an eigene Wunschvorstellungen können anschließend vorgenommen werden.<br />
<br />
Abschließend ist es sinnvoll die Konfiguration zu Sicherungs- und Kontrollzwecken komplett abzurufen:<br />
:<code>get <device> configAll</code><br />
<br />
=== Befehle zur Steuerung ===<br />
{{Hinweis|Das Thermostat antwortet bei Einstellungen per Funk mit einem set-Befehl nicht mit einem Telegramm über die vorgenommene Änderung. Um die entsprechenden Readings aktuell zu halten und die erfolgreiche Ausführung des set-Befehls zu kontrollieren kann der zugehörige get-Befehl, der im Folgenden jeweils aufgeführt wird, verwendet werden. Bei Änderungen über die Bedienung am Gerät wird FHEM hingegen per Telegramm über die vorgenommene Änderung informiert.}}<br />
<br />
==== Betriebsmodi ====<br />
Die nachfolgende Tabelle enthält die Aktivierungsbefehle für alle Betriebsmodi des Thermostats. Weitere Modi (tmCooling, tmAuto, tmFan) werden vom Gerät -obwohl von FHEM angeboten- nicht unterstützt.<br />
<br />
{| class="wikitable"<br />
|-<br />
!Befehl!!Beschreibung<br />
|-<br />
|<code>set <device> tmOff</code>||Aus-Modus: Aus mit Regelung auf 6°C als Frostschutz<br />
|-<br />
|<code>set <device> tmHeating</code>||Komfortmodus: Regelung entsprechend [[#Komfortmodus|Solltemperatur Komfortmodus]]<br />
|-<br />
|<code>set <device> tmEnergySaveHeating</code>||Absenkmodus: Regelung entsprechend [[#Absenkmodus|Solltemperatur Absenkmodus]]<br />
|-<br />
|<code>set <device> tmFullPower</code>||Boostmodus: schnellstmögliche Raumaufheizung für maximal 5 Minuten<br />
|-<br />
|<code>set <device> tmManual</code>||Stellwertmodus (Manufacturer Specific): Ventilöffnung über Command Class SWITCH_MUTILEVEL einstellen<br />
|}<br />
<br />
Abfrage des eingestellten Betriebsmodus mit: <code>get <device> thermostatMode</code><br />
<br />
Steuerungsbefehle der Command Class SWITCH_MUTILEVEL ausschließlich für den Stellwertmodus (tmManual):<br />
<br />
{| class="wikitable"<br />
|-<br />
!Befehl im Stellwertmodus!!Beschreibung<br />
|-<br />
|<code>set <device> dim %</code>|| Ventilöffnung von 0% bis 100%, wobei 99 = 100%<br />
|-<br />
|<code>set <device> on</code>||letzten Ventilöffnungsgrad einstellen; sinnvoll beispielsweise nach Aus-Modus (tmOff)<br />
|-<br />
|<code>set <device> off</code>||kleinstmögliche Ventilöffnung; entspricht 0%<br />
|-<br />
|}<br />
<br />
Im Stellwertmodus erfolgt keine automatische Temperaturregelung durch das Spirit, sondern diese muss durch separate Logik (beispielsweise mit Hilfe von [[PID20 - Der PID-Regler|PID20]]) überwacht und geregelt werden. <br />
<br />
Der Öffnungsstand wird mit <code>get <device> swmStatus</code> abgefragt. Zudem kann mit der Parameternummer 6 der Command Class CONFIGURATION der automatische Versand des Ventilöffnungsgrades bei bestimmten Veränderungen eingeschaltet werden (configValveOpeningPercentageReport).<br />
<br />
==== Solltemperaturen ====<br />
Die Solltemperaturen in den Modi Komfortmodus (tmHeating) und Absenkmodus (tmEnergySaveHeating) lassen sich im Temperaturbereich 8°C bis 28 °C anpassen. Die Solltemperatur für den Absenkmodus lässt sich ausschließlich per Funk anpassen. Im Aus-Modus (tmOff) und Boostmodus (tmFullPower) ist keine Anpassung möglich.<br />
<br />
Die Einstellung der Solltemperaturen erfolgt mit dem set-Befehl <code>thermostatSetpointSet</code> oder dem funktionsgleichen set-Befehl <code>desired-temp</code>. Der letzte Befehl wurde zur Angleichung an andere Module eingeführt und im folgenden genutzt.<br />
<br />
===== Komfortmodus =====<br />
Die Solltemperatur auf NN.N °C wird mit folgendem Kurzbefehl eingestellt:<br />
<br />
<code>set <device> desired-temp NN.N</code><br />
<br />
Dies entspricht dem ausführlichen Befehl:<br />
<br />
<code>set <device> desired-temp NN.N C 1</code><br />
<br />
Die eingestellte Solltemperatur abrufen:<br />
<br />
<code>get <device> setpoint 1</code><br />
<br />
oder mit dem Kurzbefehl<br />
<br />
<code>get <device> setpoint</code><br />
<br />
===== Absenkmodus =====<br />
Die Solltemperatur auf NN.N °C wird mit folgendem Befehl eingestellt:<br />
<br />
<code>set <device> desired-temp NN.N C 11</code><br />
<br />
Die eingestellte Solltemperatur abrufen:<br />
<br />
<code>get <device> setpoint 11</code><br />
<br />
==== Kindersicherung ====<br />
{| class="wikitable"<br />
|-<br />
!Befehl!!Beschreibung<br />
|-<br />
|<code>set <device> protectionOff</code>||Ungeschützt - Bedienung am Gerät uneingeschränkt möglich<br />
|-<br />
|<code>set <device> protectionSeq</code>||Eingeschränkt - Bedienung am Gerät erst nach Entsperrung am Gerät (gleichzeitiges Drücken von {{Taste|+}} und {{Taste|-}} für 3 Sekunden)<br />
|-<br />
|<code>set <device> protectionOn</code>||Deaktiviert - Bedienung am Gerät deaktiviert und Steuerung ausschließlich per Funk<br />
|}<br />
<br />
Abfrage der eingestellten Kindersicherung mit: <code>get <device> protection</code><br />
<br />
=== Definition ===<br />
Ein Beispiel für ein Spirit FHEM-Device enthält der nachfolgende exemplarische Auszug aus der [[Konfiguration]]:<br />
define ZWave_THERMOSTAT_53 ZWave e345c452 53<br />
attr ZWave_THERMOSTAT_53 IODev ZWDongle<br />
attr ZWave_THERMOSTAT_53 classes ZWAVEPLUS_INFO ASSOCIATION ASSOCIATION_GRP_INFO VERSION MANUFACTURER_SPECIFIC DEVICE_RESET_LOCALLY PROTECTION SENSOR_MULTILEVEL SWITCH_MULTILEVEL THERMOSTAT_MODE THERMOSTAT_SETPOINT BATTERY <br />
CONFIGURATION ALARM POWERLEVEL SECURITY SECURITY_S2 TRANSPORT_SERVICE SUPERVISION FIRMWARE_UPDATE_MD<br />
attr ZWave_THERMOSTAT_53 extendedAlarmReadings 1<br />
attr ZWave_THERMOSTAT_53 room ZWave<br />
attr ZWave_THERMOSTAT_53 stateFormat temperature<br />
attr ZWave_THERMOSTAT_53 vclasses ALARM:8 ASSOCIATION:2 ASSOCIATION_GRP_INFO:1 BATTERY:1 CONFIGURATION:1 DEVICE_RESET_LOCALLY:1 FIRMWARE_UPDATE_MD:3 MANUFACTURER_SPECIFIC:1 POWERLEVEL:1 PROTECTION:1 SECURITY:1 SECURITY_S2:1 <br />
SENSOR_MULTILEVEL:5 SUPERVISION:1 SWITCH_MULTILEVEL:1 THERMOSTAT_MODE:3 THERMOSTAT_SETPOINT:3 TRANSPORT_SERVICE:2 VERSION:2 ZWAVEPLUS_INFO:2<br />
Im vorstehenden Beispiel wurde manuell das Attribut <code>extendedAlarmReadings</code> auf <code>1</code> gesetzt, damit für die diversen Alarmarten einfacher unterscheidbare Events erzeugt und separate Readings angelegt werden. Zudem wurde manuell das Attribut <code>stateFormat</code> angelegt. Sämliche anderen Angaben der Defintion nebst Attributen wurden von FHEM bei der Inklusion automatisch durch autocreate angelegt.<br />
<br />
=== Logbeispiel ===<br />
2018-10-19_18:04:14 ZWave_THERMOSTAT_53 setpointTemp: 18.0 C energySaveHeating<br />
2018-10-19_18:04:34 ZWave_THERMOSTAT_53 setpointTemp: 22.0 C heating<br />
2018-10-19_18:04:54 ZWave_THERMOSTAT_53 thermostatMode: heating<br />
2018-10-19_18:05:03 ZWave_THERMOSTAT_53 thermostatSetpointSupported: heating energySaveHeating<br />
2018-10-19_18:05:13 ZWave_THERMOSTAT_53 version: Lib 3 Prot 4.61 App 0.16 HW 49 FWCounter 1 FW 0.10<br />
2018-10-19_18:05:24 ZWave_THERMOSTAT_53 zwavePlusInfo: version:01 role:SleepingListeningSlave node:Z-Wave+Node installerIcon:1200 userIcon:1200<br />
2018-10-19_18:06:32 ZWave_THERMOSTAT_53 alarm_System: Event cleared: unknown event 0, notificationIsOn<br />
2018-10-19_18:08:02 ZWave_THERMOSTAT_53 battery: 100 %<br />
2018-10-19_18:08:02 ZWave_THERMOSTAT_53 batteryState: ok<br />
2018-10-19_18:08:02 ZWave_THERMOSTAT_53 batteryPercent: 100<br />
2018-10-19_18:10:10 ZWave_THERMOSTAT_53 temperature: 23.27 C<br />
2018-10-19_18:18:10 ZWave_THERMOSTAT_53 temperature: 22.73 C<br />
2018-10-19_18:30:10 ZWave_THERMOSTAT_53 temperature: 22.29 C<br />
2018-10-19_19:00:17 ZWave_THERMOSTAT_53 thermostatMode: energySaveHeating<br />
2018-10-19_19:00:55 ZWave_THERMOSTAT_53 thermostatMode: off<br />
2018-10-19_19:06:10 ZWave_THERMOSTAT_53 temperature: 21.75 C<br />
2018-10-19_23:22:18 ZWave_THERMOSTAT_53 thermostatMode: energySaveHeating<br />
2018-10-19_23:27:31 ZWave_THERMOSTAT_53 set_tmHeating<br />
2018-10-19_23:27:32 ZWave_THERMOSTAT_53 tmHeating<br />
<br />
== Links ==<br />
* [https://products.z-wavealliance.org/products/2543 Eintrag in http://products.z-wavealliance.org mit Handbuch und mehr]<br />
* [https://eurotronic.org/wp-content/uploads/2018/08/Spirit_Z-Wave_BAL_web_DE_view_V5.pdf deutsches Handbuch auf Hersteller-Webseite]<br />
* Nutzung eines direkt assozierten Fenstersensors zur Fenster-Offen-Erkennung: {{Link2Forum|Topic=92206}}<br />
* {{Link2Forum|Topic=77598|Message=701397|LinkText=Temperaturwerte eines Nicht-ZWave-Gerätes an das Spirit zur Regelung übermitteln}}<br />
* {{Link2Forum|Topic=77598|Message=854445|LinkText=Nutzung des Modul PID20 zur Temperaturregelung im Stellwertmodus (tmManual)}}<br />
<br />
[[Kategorie:Z-Wave Components|Sensor]]<br />
[[Kategorie:Heizungsventile]]</div>Curthttp://wiki.fhem.de/w/index.php?title=Z-Wave-Eurotronic_Spirit_Thermostat&diff=33902Z-Wave-Eurotronic Spirit Thermostat2020-09-12T00:17:53Z<p>Curt: /* Inklusion */ Problem ignoreTypes</p>
<hr />
<div>{{Infobox Hardware<br />
|Bild=platzHalter.png<br />
|Bildbeschreibung=todo<br />
|HWProtocol=Z-Wave Plus <br />
|HWType=Aktor, Empfänger und Sender, Sensor<br />
|HWCategory=Z-Wave<br />
|HWComm=Funk 868MHz<br />
|HWChannels=<br />
|HWVoltage=3V<br />
|HWPowerConsumption=<br />
|HWPoweredBy=2xBatterie AA Mignon<br />
|HWSize=<br />
|HWDeviceFHEM=[http://fhem.de/commandref.html#ZWave Z-Wave]<br />
|HWManufacturer=[https://eurotronic.org/ EUROTRONIC Technology GmbH]<br />
}}<br />
<br />
[[Z-Wave-Eurotronic Spirit Thermostat]] ist ein Heizungsthermostat mit Z-Wave 500er-Serie-Chip und Z-Wave Plus-Zertifizierung<br />
<br />
<br />
== Features ==<br />
* [[Z-Wave#FLIRS-Ger.C3.A4te|FLiRS-Gerät]]<br />
* siehe Handbuch<br />
<br />
== Hinweise zum Betrieb mit FHEM ==<br />
=== Inklusion === <br />
Der Aktor wird bei der Inklusion und aktiviertem Autocreate vollautomatisch erkannt und definiert. <nowiki>'''</nowiki>Beachte:<nowiki>'''</nowiki> Es wurde beobachtet, dass bei gesetztem Attribut "ignoreTypes" (bei autocreate) die Inklusion scheitert.<br />
<br />
Eine beispielhafte durch autocreate erzeugte Definition mit Hinweisen zu manuellen Ergänzungen findet sich unter [[#Definition|Definition]].<br />
<br />
=== Assoziation ===<br />
Der Controller muss zur korrekten Funktion in die Assoziationsgruppe 1 des Thermostats aufgenommen werden. Dies geschieht während der Inklusion durch FHEM automatisch durch Absetzen des folgenden Befehls:<br />
:<code>set <device> associationAdd 1 <Controller-NodeID></code><br />
<br />
Die erfolgreiche Ausführung des Befehls während der Inklusion durch Abfrage überprüfen:<br />
:<code>get <device> associationAll</code><br />
<br />
=== Konfiguration ===<br />
Konfigurationsanpassungen des Thermostates an eigene Wunschvorstellungen können anschließend vorgenommen werden.<br />
<br />
Abschließend ist es sinnvoll die Konfiguration zu Sicherungs- und Kontrollzwecken komplett abzurufen:<br />
:<code>get <device> configAll</code><br />
<br />
=== Befehle zur Steuerung ===<br />
{{Hinweis|Das Thermostat antwortet bei Einstellungen per Funk mit einem set-Befehl nicht mit einem Telegramm über die vorgenommene Änderung. Um die entsprechenden Readings aktuell zu halten und die erfolgreiche Ausführung des set-Befehls zu kontrollieren kann der zugehörige get-Befehl, der im Folgenden jeweils aufgeführt wird, verwendet werden. Bei Änderungen über die Bedienung am Gerät wird FHEM hingegen per Telegramm über die vorgenommene Änderung informiert.}}<br />
<br />
==== Betriebsmodi ====<br />
Die nachfolgende Tabelle enthält die Aktivierungsbefehle für alle Betriebsmodi des Thermostats. Weitere Modi (tmCooling, tmAuto, tmFan) werden vom Gerät -obwohl von FHEM angeboten- nicht unterstützt.<br />
<br />
{| class="wikitable"<br />
|-<br />
!Befehl!!Beschreibung<br />
|-<br />
|<code>set <device> tmOff</code>||Aus-Modus: Aus mit Regelung auf 6°C als Frostschutz<br />
|-<br />
|<code>set <device> tmHeating</code>||Komfortmodus: Regelung entsprechend [[#Komfortmodus|Solltemperatur Komfortmodus]]<br />
|-<br />
|<code>set <device> tmEnergySaveHeating</code>||Absenkmodus: Regelung entsprechend [[#Absenkmodus|Solltemperatur Absenkmodus]]<br />
|-<br />
|<code>set <device> tmFullPower</code>||Boostmodus: schnellstmögliche Raumaufheizung für maximal 5 Minuten<br />
|-<br />
|<code>set <device> tmManual</code>||Stellwertmodus (Manufacturer Specific): Ventilöffnung über Command Class SWITCH_MUTILEVEL einstellen<br />
|}<br />
<br />
Abfrage des eingestellten Betriebsmodus mit: <code>get <device> thermostatMode</code><br />
<br />
Steuerungsbefehle der Command Class SWITCH_MUTILEVEL ausschließlich für den Stellwertmodus (tmManual):<br />
<br />
{| class="wikitable"<br />
|-<br />
!Befehl im Stellwertmodus!!Beschreibung<br />
|-<br />
|<code>set <device> dim %</code>|| Ventilöffnung von 0% bis 100%, wobei 99 = 100%<br />
|-<br />
|<code>set <device> on</code>||letzten Ventilöffnungsgrad einstellen; sinnvoll beispielsweise nach Aus-Modus (tmOff)<br />
|-<br />
|<code>set <device> off</code>||kleinstmögliche Ventilöffnung; entspricht 0%<br />
|-<br />
|}<br />
<br />
Im Stellwertmodus erfolgt keine automatische Temperaturregelung durch das Spirit, sondern diese muss durch separate Logik (beispielsweise mit Hilfe von [[PID20 - Der PID-Regler|PID20]]) überwacht und geregelt werden. <br />
<br />
Der Öffnungsstand wird mit <code>get <device> swmStatus</code> abgefragt. Zudem kann mit der Parameternummer 6 der Command Class CONFIGURATION der automatische Versand des Ventilöffnungsgrades bei bestimmten Veränderungen eingeschaltet werden (configValveOpeningPercentageReport).<br />
<br />
==== Solltemperaturen ====<br />
Die Solltemperaturen in den Modi Komfortmodus (tmHeating) und Absenkmodus (tmEnergySaveHeating) lassen sich im Temperaturbereich 8°C bis 28 °C anpassen. Die Solltemperatur für den Absenkmodus lässt sich ausschließlich per Funk anpassen. Im Aus-Modus (tmOff) und Boostmodus (tmFullPower) ist keine Anpassung möglich.<br />
<br />
Die Einstellung der Solltemperaturen erfolgt mit dem set-Befehl <code>thermostatSetpointSet</code> oder dem funktionsgleichen set-Befehl <code>desired-temp</code>. Der letzte Befehl wurde zur Angleichung an andere Module eingeführt und im folgenden genutzt.<br />
<br />
===== Komfortmodus =====<br />
Die Solltemperatur auf NN.N °C wird mit folgendem Kurzbefehl eingestellt:<br />
<br />
<code>set <device> desired-temp NN.N</code><br />
<br />
Dies entspricht dem ausführlichen Befehl:<br />
<br />
<code>set <device> desired-temp NN.N C 1</code><br />
<br />
Die eingestellte Solltemperatur abrufen:<br />
<br />
<code>get <device> setpoint 1</code><br />
<br />
oder mit dem Kurzbefehl<br />
<br />
<code>get <device> setpoint</code><br />
<br />
===== Absenkmodus =====<br />
Die Solltemperatur auf NN.N °C wird mit folgendem Befehl eingestellt:<br />
<br />
<code>set <device> desired-temp NN.N C 11</code><br />
<br />
Die eingestellte Solltemperatur abrufen:<br />
<br />
<code>get <device> setpoint 11</code><br />
<br />
==== Kindersicherung ====<br />
{| class="wikitable"<br />
|-<br />
!Befehl!!Beschreibung<br />
|-<br />
|<code>set <device> protectionOff</code>||Ungeschützt - Bedienung am Gerät uneingeschränkt möglich<br />
|-<br />
|<code>set <device> protectionSeq</code>||Eingeschränkt - Bedienung am Gerät erst nach Entsperrung am Gerät (gleichzeitiges Drücken von {{Taste|+}} und {{Taste|-}} für 3 Sekunden)<br />
|-<br />
|<code>set <device> protectionOn</code>||Deaktiviert - Bedienung am Gerät deaktiviert und Steuerung ausschließlich per Funk<br />
|}<br />
<br />
Abfrage der eingestellten Kindersicherung mit: <code>get <device> protection</code><br />
<br />
=== Definition ===<br />
Ein Beispiel für ein Spirit FHEM-Device enthält der nachfolgende exemplarische Auszug aus der [[Konfiguration]]:<br />
define ZWave_THERMOSTAT_53 ZWave e345c452 53<br />
attr ZWave_THERMOSTAT_53 IODev ZWDongle<br />
attr ZWave_THERMOSTAT_53 classes ZWAVEPLUS_INFO ASSOCIATION ASSOCIATION_GRP_INFO VERSION MANUFACTURER_SPECIFIC DEVICE_RESET_LOCALLY PROTECTION SENSOR_MULTILEVEL SWITCH_MULTILEVEL THERMOSTAT_MODE THERMOSTAT_SETPOINT BATTERY <br />
CONFIGURATION ALARM POWERLEVEL SECURITY SECURITY_S2 TRANSPORT_SERVICE SUPERVISION FIRMWARE_UPDATE_MD<br />
attr ZWave_THERMOSTAT_53 extendedAlarmReadings 1<br />
attr ZWave_THERMOSTAT_53 room ZWave<br />
attr ZWave_THERMOSTAT_53 stateFormat temperature<br />
attr ZWave_THERMOSTAT_53 vclasses ALARM:8 ASSOCIATION:2 ASSOCIATION_GRP_INFO:1 BATTERY:1 CONFIGURATION:1 DEVICE_RESET_LOCALLY:1 FIRMWARE_UPDATE_MD:3 MANUFACTURER_SPECIFIC:1 POWERLEVEL:1 PROTECTION:1 SECURITY:1 SECURITY_S2:1 <br />
SENSOR_MULTILEVEL:5 SUPERVISION:1 SWITCH_MULTILEVEL:1 THERMOSTAT_MODE:3 THERMOSTAT_SETPOINT:3 TRANSPORT_SERVICE:2 VERSION:2 ZWAVEPLUS_INFO:2<br />
Im vorstehenden Beispiel wurde manuell das Attribut <code>extendedAlarmReadings</code> auf <code>1</code> gesetzt, damit für die diversen Alarmarten einfacher unterscheidbare Events erzeugt und separate Readings angelegt werden. Zudem wurde manuell das Attribut <code>stateFormat</code> angelegt. Sämliche anderen Angaben der Defintion nebst Attributen wurden von FHEM bei der Inklusion automatisch durch autocreate angelegt.<br />
<br />
=== Logbeispiel ===<br />
2018-10-19_18:04:14 ZWave_THERMOSTAT_53 setpointTemp: 18.0 C energySaveHeating<br />
2018-10-19_18:04:34 ZWave_THERMOSTAT_53 setpointTemp: 22.0 C heating<br />
2018-10-19_18:04:54 ZWave_THERMOSTAT_53 thermostatMode: heating<br />
2018-10-19_18:05:03 ZWave_THERMOSTAT_53 thermostatSetpointSupported: heating energySaveHeating<br />
2018-10-19_18:05:13 ZWave_THERMOSTAT_53 version: Lib 3 Prot 4.61 App 0.16 HW 49 FWCounter 1 FW 0.10<br />
2018-10-19_18:05:24 ZWave_THERMOSTAT_53 zwavePlusInfo: version:01 role:SleepingListeningSlave node:Z-Wave+Node installerIcon:1200 userIcon:1200<br />
2018-10-19_18:06:32 ZWave_THERMOSTAT_53 alarm_System: Event cleared: unknown event 0, notificationIsOn<br />
2018-10-19_18:08:02 ZWave_THERMOSTAT_53 battery: 100 %<br />
2018-10-19_18:08:02 ZWave_THERMOSTAT_53 batteryState: ok<br />
2018-10-19_18:08:02 ZWave_THERMOSTAT_53 batteryPercent: 100<br />
2018-10-19_18:10:10 ZWave_THERMOSTAT_53 temperature: 23.27 C<br />
2018-10-19_18:18:10 ZWave_THERMOSTAT_53 temperature: 22.73 C<br />
2018-10-19_18:30:10 ZWave_THERMOSTAT_53 temperature: 22.29 C<br />
2018-10-19_19:00:17 ZWave_THERMOSTAT_53 thermostatMode: energySaveHeating<br />
2018-10-19_19:00:55 ZWave_THERMOSTAT_53 thermostatMode: off<br />
2018-10-19_19:06:10 ZWave_THERMOSTAT_53 temperature: 21.75 C<br />
2018-10-19_23:22:18 ZWave_THERMOSTAT_53 thermostatMode: energySaveHeating<br />
2018-10-19_23:27:31 ZWave_THERMOSTAT_53 set_tmHeating<br />
2018-10-19_23:27:32 ZWave_THERMOSTAT_53 tmHeating<br />
<br />
== Links ==<br />
* [https://products.z-wavealliance.org/products/2543 Eintrag in http://products.z-wavealliance.org mit Handbuch und mehr]<br />
* [https://eurotronic.org/wp-content/uploads/2018/08/Spirit_Z-Wave_BAL_web_DE_view_V5.pdf deutsches Handbuch auf Hersteller-Webseite]<br />
* Nutzung eines direkt assozierten Fenstersensors zur Fenster-Offen-Erkennung: {{Link2Forum|Topic=92206}}<br />
* {{Link2Forum|Topic=77598|Message=701397|LinkText=Temperaturwerte eines Nicht-ZWave-Gerätes an das Spirit zur Regelung übermitteln}}<br />
* {{Link2Forum|Topic=77598|Message=854445|LinkText=Nutzung des Modul PID20 zur Temperaturregelung im Stellwertmodus (tmManual)}}<br />
<br />
[[Kategorie:Z-Wave Components|Sensor]]<br />
[[Kategorie:Heizungsventile]]</div>Curthttp://wiki.fhem.de/w/index.php?title=FTUI_Widget_Video&diff=31703FTUI Widget Video2019-11-16T04:28:43Z<p>Curt: Auf Wunsch im Forenthread - Link wohl verbesserungswürdig</p>
<hr />
<div>== FTUI Widget Video ==<br />
<br />
Das [[{{PAGENAME}}|Video Widget]] ist ein Widget für [[FHEM Tablet UI]], mit dem ein lokales oder auch Online Video in die FTUI eingebunden werden kann. Die URL des Videos kann entweder fest vorgegeben oder aus einem Reading gelesen werden.<br />
Das Widget ist eine Ableitung aus dem [[FTUI Widget Image|Image Widget]] und generiert eine URL mit dem HTML "<video>" Tag<br />
<br />
==Attribute==<br />
{|class="wikitable"<br />
!Attribut<br />
!Beschreibung<br />
!Standard-Wert<br />
!Beispiel<br />
|-<br />
|'''data-device'''||FHEM-Device, dessen Reading eine Video-URL enthält||||<br />
|-<br />
|'''data-get'''||Name des Readings, das die zu verwendende Video-URL enthält||STATE||data-get="Video-URL"<br />
|-<br />
|'''data-path'''||Erster Teil der URL des anzuzeigenden Videos||||<nowiki>data-path="https://www.example.com/Videos/"</nowiki><br />
|-<br />
|'''data-suffix'''||Letzter Teil der URL des anzuzeigenden Videos||||data-suffix=".mp4"<br />
|-<br />
|'''data-part'''||Mittels RegEx gefiltertes Reading (data-get) mit der URL des anzuzeigenden Videos||||data-part=".*(http.*.mp4).*"<br />
|-<br />
|'''data-substitution'''||Mittels RegEx ersetztes Reading (data-get) mit der URL des anzuzeigenden Videos||||data-substitution="s/.*(http.*.mp4).*/$1"<br />
|-<br />
|'''data-url'''||URL des anzuzeigenden Videos||||<nowiki>data-url="https://example.com/Video.mp4"</nowiki><br />
|-<br />
|'''data-fhem-cmd'''||Befehl, der bei einem Klick auf das Bild des Videos an FHEM gesendet werden soll (Problematisch in Verbindung mit aktiven "controls"||||data-fhem-cmd="set Bulp01 off"<br />
|-<br />
|'''data-state-get'''||Name des Parameters, der den Status-Wert enthält||||data-state-get="STATE"<br />
|-<br />
|'''data-states'''||Ein Array an möglichen Status-Werten||||data-states='["on","off","pending"]'<br />
|-<br />
|'''data-classes'''||Ein Array von CSS-Klassen. Welche Klasse zusätzlich hinzugefügt wird, entscheidet sich durch das ''data-states''-Array||||data-classes='["bg-green","bg-red","bg-yellow"]'<br />
|-<br />
|'''data-size'''||Gewünschte Breite des Videos in Pixel oder Prozent. Die Höhe wird proportional skaliert||50%||data-size="248px"<br />
|-<br />
|'''data-width'''||Gewünschte Breite des Videos in Pixel oder Prozent.||100%||data-size="248px"<br />
|-<br />
|'''data-height'''||Gewünschte Höhe des Videos in Pixel oder Prozent.||auto||data-height="248px"<br />
|-<br />
|'''data-opacity'''||Durchsichtigkeit des Videos (opacity)||1.0||data-opacity="1"<br />
|-<br />
|'''data-refresh'''||Interval in Sekunden, nachdem das Video aktualisiert werden soll||900||data-refresh="3600"<br />
|-<br />
|'''data-hide'''||Reading, nach dessen Wert entschieden wird, ob das Video angezeigt wird, oder nicht.||STATE||data-hide="STATE"<br />
|-<br />
|'''data-hide-on'''||Wert, bei dem das Video nicht angezeigt wird||true,1,on||data-hide-on="aus"<br />
|-<br />
|'''data-hide-off'''||Wert, bei dem das Video angezeigt wird||!on||data-hide-on="an"<br />
|-<br />
|'''data-controls'''||Kann True und False sein, bei "True"werden die Video Controls eingeblendet||||data-controls="True"<br />
|-<br />
|'''data-hide-parents'''||Soll das HTML-Eltern-Element auch versteckt werden, ist hier der jQuery-Selektor einzugeben.||||data-hide-parents="#VideoDiv"<br />
|}<br />
<br />
==CSS Klassen==<br />
{|class="wikitable"<br />
!Klasse!!Beschreibung<br />
{{FTUI Klasse|nocache}}<br />
|}<br />
<br />
==Hinweise==<br />
* Wenn ''data-url'' nicht definiert ist, wird die URL des Videos aus ''data-path'' + ''data-get'' + ''data-suffix'' zusammengesetzt.<br />
* Es kann nur ''data-url'' + ''data-refresh'' oder ''data-device'' + ''data-get'' verwendet werden, nicht beides gleichzeitig.<br />
<br />
==Beispiele==<br />
===Video aus dem Internet anzeigen===<br />
Dieses einfache Beispiel zeigt die Verwendung des [[FTUI Widget Video|Video-Widgets]] mit einer fest vorgegebenen Internetadresse.<br />
<syntaxhighlight lang="html"><br />
<div data-type="video"<br />
data-url="https://fhem.de/www/tablet/videos/Video.mp4"<br />
data-size="100px"></div><br />
</syntaxhighlight><br />
<br />
Soll verhindert werden, dass Browser das Video aus ihrem Cache laden, anstatt von der Original-URL, muss die Klasse ''nocache'' verwendet werden:<br />
<syntaxhighlight lang="html"><br />
<div data-type="video"<br />
data-url="https://fhem.de/www/tablet/videos/Video.mp4"<br />
data-size="100px"></div><br />
<div data-type="video"<br />
data-url="https://fhem.de/www/tablet/videos/Video.mp4"<br />
data-size="100px"<br />
class="nocache"></div><br />
</syntaxhighlight><br />
<br />
===URL aus einem Reading===<br />
Hier wird die URL zum anzuzeigenden Video aus dem STATE eines FHEM-Devices ausgelesen.<br />
<syntaxhighlight lang="html"><br />
<div data-type="video"<br />
data-device="dDummy"<br />
data-get="STATE"<br />
data-size="100px"></div><br />
</syntaxhighlight><br />
<br />
===Dynamische URL===<br />
In diesem Beispiel wird die URL zu einem Video anhand eines Readings zusammengebaut.<br />
<br />
Das entsprechende FHEM-Device liefert z.B. folgende Readings:<br />
{|class="wikitable"<br />
|channels_01_channel||201||2017-02-12 09:50:50<br />
|-<br />
|channels_01_video||Video.mp4||2017-02-12 09:50:50<br />
<br />
|}<br />
<br />
<syntaxhighlight lang="html"><br />
<div data-type="video"<br />
data-device="jnTVSender"<br />
data-get="channels_01_video"<br />
data-path="https://fhem.de/www/tablet/videos/"<br />
data-size="80px"></div><br />
</syntaxhighlight><br />
<br />
===data-part und data-substitution===<br />
Die URL des Videos wird aus einem Readings gefiltert bzw. zusammengebaut.<br />
<syntaxhighlight lang="html"><br />
<li data-row="5" data-col="4" data-sizey="3" data-sizex="6"><br />
<header>URL fromreading with part</header><br />
<div data-type="video" data-device="ftuitest" data-part=".*(http.*.mp4).*" data-get="videourl"></div><br />
</li><br />
<li data-row="5" data-col="10" data-sizey="3" data-sizex="3"><br />
<header>URL fromreading with substitution</header><br />
<div data-type="video" data-device="ftuitest" data-substitution="s/.*(http.*.mp4).*/$1" data-get="videourl"></div><br />
</li><br />
</syntaxhighlight><br />
<br />
==Installation==<br />
Die aktuelle Version des Widgets muss von Hand in ein bestimmtes Verzeichnis des eigenen FHEM-Servers kopiert und mit korrektem Eigentümer sowie Zugriffsrechten versehen werden. Das konkrete Vorgehen wird hier beschrieben: https://forum.fhem.de/index.php/topic,95374.0.html<br />
<br />
[[Kategorie:FHEM Tablet UI|Video]]</div>Curthttp://wiki.fhem.de/w/index.php?title=Stra%C3%9Fenverkehr_Blitzer&diff=30189Straßenverkehr Blitzer2019-04-19T02:51:18Z<p>Curt: Baustellenschild raus</p>
<hr />
<div>{{Infobox Modul|<br />
|ModPurpose=Geschwindigkeitsüberwachung Blitzer<br />
|ModType=x<br />
|ModCmdRef=blitzer<br />
<!--|ModForumArea=Sonstige Systeme--><br />
|ModFTopic=99070<br />
|ModTechName=98_Blitzer.pm<br />
|ModOwner={{Link2FU|30971|bismosa}}<br />
}}<br />
<br />
'''Straßenverkehr Blitzer''' ist ein Modul, welches mobile Verkehrsüberwachungsanlagen (aka Blitzer) über ein Internet Portal abfragt und für den Umkreis des eigenen Standorts listenförmig im Straßenverkehr innerhalb Deutschlands auflistet - bezogen auf eine anzugebende Koordinate, um den Radius um diese Koordinate.<br />
<br />
== Features ==<br />
* Die Ausgabe ist frei über Attribute konfigurierbar.<br />
* HTML-Code bzw. plaintext ist als Ausgabeformat einstellbar.<br />
* Es kann mit einem set <Blitzer-Device> Update <Optional:LAT> <Optional:LONG> auch eine neue Koordinate vorgegeben werden.<br />
* Der Bereich, der bei Verkehrslage.de abgefragt wird, kann vom Modul berechnet werden.<br />
* Es kann ein Reading erzeugt werden, welches bei vorhanden Blitzern eine "1" und sonst eine "0" anzeigt (praktisch z.B. um in FTUI Bereiche auszublenden, wenn kein Blitzer gemeldet wurde).<br />
* Es kann die maximale Anzahl an anzuzeigenden Blitzern festgelegt werden.<br />
* Es kann ein Text festgelegt werden, wenn kein Blitzer in der Nähe ist.<br />
<br />
== Modul integrieren ==<br />
Das Modul ist in jeweils aktueller Version auf Github verfügbar. Es ist zunächst in den FHEM-Update-Prozess zu integrieren:<br />
<br />
<source lang="html"><br />
update add https://raw.githubusercontent.com/bismosa/FHEM/master/controls_Blitzer.txt<br />
update check<br />
update all<br />
</source><br />
<br />
== Definition ==<br />
<source lang="html"><br />
define <Name> Blitzer <Interval><br />
</source><br />
Das Intervall hat die Basis "Minuten". Sofern kein Intervall angegeben ist, wird nicht automatisch aktualisiert.<br />
<br />
Sodann ist '''wesentlich''', dass die gewünschte Ausgangskoordinate sowie der gewünschte Radius in den Attributen gesetzt werden, beispielhaft:<br />
<source lang="html"><br />
attr <Name> home_latitude 51.8<br />
attr <Name> home_longitude 12.6<br />
attr <Name> radius 25<br />
</source><br />
<br />
== Formatierung der Ausgabe ==<br />
<br />
Über das Attribut "Ausgabe" wird gesteuert, welche je Blitzer verfügbaren Informationen ausgegeben werden sollen. Ein Beispiel mit wenigen Informationen, für den ländlichen Raum geeignet:<br />
<source lang="html"><br />
attr <Name> Ausgabe {OR,suburb,city_district,town,village,},road,building,vmax,[km/h],newline<br />
</source><br />
<br />
Ein Beispiel für den großstädtischen Raum:<br />
<source lang="html"><br />
attr <Name> Ausgabe number,{OR,suburb,city_district,town,village,},road,building,[Max.],vmax,[km/h],[(],distanceShort,[km],[)],[!!],newline<br />
</source><br />
<br />
=== Spezielle Einträge ===<br />
*number Nummerierung<br />
* newline Neue Zeile<br />
* [Freitext] Beliebiger Text. Dieser wird ohne die Klammern übernommen.<br />
* distance Abstand des Blitzers von der Home-Koordinate (Luftlinie)<br />
* distanceShort Abstand des Blitzers von der Home-Koordinate (Luftlinie) eine Kommastelle<br />
* {OR ODER-Verknüpfung. Wenn ein Wert vorhanden ist, werden die nachfolgenden (bis zur geschweiften Klammer) nicht berücksichtigt<br />
* } Ende der ODER-Verknüpfung. Muss zwingend gesetzt werden, wenn eine ODER-Verknüpfung enthalten ist.<br />
<br />
Es können beliebig viele Werte so verknüpft werden.<br />
<br />
Welche Werte vorhanden sind, kann mit<br />
<source lang="html"><br />
get <Blitzer-Device> allReadings <Optional:Nummer><br />
</source><br />
überprüft werden. Wird eine Nummer mitgegeben, werden nur die entsprechenden Einträge ausgegeben.<br />
<br />
== Links ==<br />
Das Modul verwendet Daten von<br />
* http://www.verkehrslage.de (https://cdn2.atudo.net)<br />
* https://nominatim.openstreetmap.org</div>Curthttp://wiki.fhem.de/w/index.php?title=Stra%C3%9Fenverkehr_Blitzer&diff=30188Straßenverkehr Blitzer2019-04-19T02:44:33Z<p>Curt: /* Modul integrieren */ andere Quelladresse</p>
<hr />
<div>{{Baustelle}} <br />
<br />
{{Infobox Modul|<br />
|ModPurpose=Geschwindigkeitsüberwachung Blitzer<br />
|ModType=x<br />
|ModCmdRef=blitzer<br />
<!--|ModForumArea=Sonstige Systeme--><br />
|ModFTopic=99070<br />
|ModTechName=98_Blitzer.pm<br />
|ModOwner={{Link2FU|30971|bismosa}}<br />
}}<br />
<br />
'''Straßenverkehr Blitzer''' ist ein Modul, welches mobile Verkehrsüberwachungsanlagen (aka Blitzer) über ein Internet Portal abfragt und für den Umkreis des eigenen Standorts listenförmig im Straßenverkehr innerhalb Deutschlands auflistet - bezogen auf eine anzugebende Koordinate, um den Radius um diese Koordinate.<br />
<br />
== Features ==<br />
* Die Ausgabe ist frei über Attribute konfigurierbar.<br />
* HTML-Code bzw. plaintext ist als Ausgabeformat einstellbar.<br />
* Es kann mit einem set <Blitzer-Device> Update <Optional:LAT> <Optional:LONG> auch eine neue Koordinate vorgegeben werden.<br />
* Der Bereich, der bei Verkehrslage.de abgefragt wird, kann vom Modul berechnet werden.<br />
* Es kann ein Reading erzeugt werden, welches bei vorhanden Blitzern eine "1" und sonst eine "0" anzeigt (praktisch z.B. um in FTUI Bereiche auszublenden, wenn kein Blitzer gemeldet wurde).<br />
* Es kann die maximale Anzahl an anzuzeigenden Blitzern festgelegt werden.<br />
* Es kann ein Text festgelegt werden, wenn kein Blitzer in der Nähe ist.<br />
<br />
== Modul integrieren ==<br />
Das Modul ist in jeweils aktueller Version auf Github verfügbar. Es ist zunächst in den FHEM-Update-Prozess zu integrieren:<br />
<br />
<source lang="html"><br />
update add https://raw.githubusercontent.com/bismosa/FHEM/master/controls_Blitzer.txt<br />
update check<br />
update all<br />
</source><br />
<br />
== Definition ==<br />
<source lang="html"><br />
define <Name> Blitzer <Interval><br />
</source><br />
Das Intervall hat die Basis "Minuten". Sofern kein Intervall angegeben ist, wird nicht automatisch aktualisiert.<br />
<br />
Sodann ist '''wesentlich''', dass die gewünschte Ausgangskoordinate sowie der gewünschte Radius in den Attributen gesetzt werden, beispielhaft:<br />
<source lang="html"><br />
attr <Name> home_latitude 51.8<br />
attr <Name> home_longitude 12.6<br />
attr <Name> radius 25<br />
</source><br />
<br />
== Formatierung der Ausgabe ==<br />
<br />
Über das Attribut "Ausgabe" wird gesteuert, welche je Blitzer verfügbaren Informationen ausgegeben werden sollen. Ein Beispiel mit wenigen Informationen, für den ländlichen Raum geeignet:<br />
<source lang="html"><br />
attr <Name> Ausgabe {OR,suburb,city_district,town,village,},road,building,vmax,[km/h],newline<br />
</source><br />
<br />
Ein Beispiel für den großstädtischen Raum:<br />
<source lang="html"><br />
attr <Name> Ausgabe number,{OR,suburb,city_district,town,village,},road,building,[Max.],vmax,[km/h],[(],distanceShort,[km],[)],[!!],newline<br />
</source><br />
<br />
=== Spezielle Einträge ===<br />
*number Nummerierung<br />
* newline Neue Zeile<br />
* [Freitext] Beliebiger Text. Dieser wird ohne die Klammern übernommen.<br />
* distance Abstand des Blitzers von der Home-Koordinate (Luftlinie)<br />
* distanceShort Abstand des Blitzers von der Home-Koordinate (Luftlinie) eine Kommastelle<br />
* {OR ODER-Verknüpfung. Wenn ein Wert vorhanden ist, werden die nachfolgenden (bis zur geschweiften Klammer) nicht berücksichtigt<br />
* } Ende der ODER-Verknüpfung. Muss zwingend gesetzt werden, wenn eine ODER-Verknüpfung enthalten ist.<br />
<br />
Es können beliebig viele Werte so verknüpft werden.<br />
<br />
Welche Werte vorhanden sind, kann mit<br />
<source lang="html"><br />
get <Blitzer-Device> allReadings <Optional:Nummer><br />
</source><br />
überprüft werden. Wird eine Nummer mitgegeben, werden nur die entsprechenden Einträge ausgegeben.<br />
<br />
== Links ==<br />
Das Modul verwendet Daten von<br />
* http://www.verkehrslage.de (https://cdn2.atudo.net)<br />
* https://nominatim.openstreetmap.org</div>Curthttp://wiki.fhem.de/w/index.php?title=Import_von_Code_Snippets&diff=30187Import von Code Snippets2019-04-19T02:39:33Z<p>Curt: Voraussetzung zugefügt</p>
<hr />
<div>Manchmal ist es (oder scheint es) erforderlich, eine neue Device mittels eines Editors direkt in '''fhem.cfg''' einzutragen. Das ist allerdings hoch gefährlich, es wird strikt davon abgeraten. Mit dem "grünen Kreuz" gibt es nun eine Möglichkeit, diesen direkten Eintrag über die Weboberfläche von FHEM auszuführen, gleichzeitig findet ein Syntax- und Fehlercheck statt:<br />
<br />
Sorgfältig vorbereitete Code Snippets, mit exportdevice erzeugter Code oder mit '''Raw definition''' ausgegebene Gerätedefinitionen können im FHEMWEB-Frontend über '''Raw definition''' importiert werden.<br />
{{Hinweis|Wie das [[Konfiguration#Befehl-Eingabefeld|Befehl-Eingabefeld]] unterstützt auch das Dialogfeld zur RAW-Definition Syntax highlighting und die geänderten bzw. importierten Anweisungen werden bei der Ausführung einer Syntaxprüfung unterzogen. So lassen sich eventuelle Fehler häufig schnell erkennen.}} <br />
<br />
==Voraussetzung==<br />
"f18" ist ein FHEMWEB Style, was man unter "Select style" auswaehlen kann. Nur wenn der Style "f18" eingestellt wurde, kann man die hier beschriebene Methode nutzen.<br />
<br />
==Wie finde ich Raw definition?==<br />
=== Button ===<br />
Um schnell zu einem Eingabefeld für '''Raw definition''' zu gelangen, klicken Sie einfach auf das '''''+''''' neben dem Kommandofeld. Es öffnet sich ein leeres Dialogfeld, in den man RAW-Code direkt eingeben bzw. am Stück eingeben kann. <br />
<gallery><br />
datei:RAW-Button.png|Ausschnitt mit dem Button<br />
datei:RAW-Editor-via-Button.png|Geöffnetes Dialogfeld<br />
</gallery><br />
===Über die Geräte-Detailansicht===<br />
Zur '''Raw definition''' kommt man über die Gerätedetailansicht eines beliebigen Gerätes. Der Link '''Raw definition''' steht in der letzten Zeile der Seite.<br />
[[Datei:Raw_definition.png|600px]]<br />
Diesen Weg sollten Sie wählen, wenn Sie Code für andere bereit stellen wollen.<br />
<br />
==Erstellen eines Importgerätes==<br />
Zur Übung kann man dieses Importgerät importieren.<br />
<pre><br />
define Import dummy<br />
attr Import group Entwicklung<br />
attr Import room Entwicklung<br />
save<br />
</pre><br />
<br />
==Direktzugriff über das FHEM-Menü==<br />
Der angelegte Import-Dummy kann direkt aufgerufen werden, wenn man einen Meüeintrag anlegt.<br />
Im entsprechenden FHEMWEB-Gerät das Attribut '''menuEntries''' erzeugen mit<br />
<pre>attr WEB menuEntries CodeImport,/fhem?detail=Import#</pre><br />
oder ergänzen mit<br />
<pre>CodeImport,/fhem?detail=Import#</pre><br />
<br />
==Vorgehensweise beim Import==<br />
Als erstes die Geräteansicht eines beliebigen Gerätes aufrufen, dann den Link '''Raw definition''' anklicken.<br><br />
Jetzt den angezeigten Inhalt des sich öffnenden Eingabefeldes mit der oben stehenden Definition überschreiben und danach den erschienenen Button '''Execute commands''' drücken.<br> Wenn die Meldung "Wrote configuration to fhem.cfg" erscheint, war der Import erfolgreich, andernfalls gibt es eine Fehlermeldung und der Import wird an dieser Stelle abgebrochen.<br>Das Gerät müsste jetzt im Raum Entwicklung zu finden sein.<br><br />
Zukünftig kann dieses Gerät zum Importieren genutzt werden, damit sinkt die Wahrscheinlichkeit eine bestehende Definition zu beeinträchtigen.<br />
<br><br><br />
Zum Erstellen eigener Definitionen ist der [[DEF-Editor]] das empfohlene Werkzeug.<br />
<br />
==Sonstiges==<br />
<br />
=== Geräte zwischen Installationen verschieben ===<br />
Möchte man eigene Geräte zwischen unterschiedlichen Installationen verschieben, z.B. aus einem Test- in das Produktivsystem, kann man sich mit den erweiterten Optionen von [[List|list]] die Informationen aus dem Ausgangssystem so anzeigen lassen, dass diese direkt samt derzeitiger Zustände ins Zielsystem übernommen werden können. <br />
<br />
=== attrTemplate ===<br />
[[MQTT2_DEVICE#attrTemplate|attrTemplate]] ist für Geräte-Typen, die dies unterstützen, eine weitere Option, Geräte schnell mit einer typischen Konfiguration einzurichten. <br />
<br />
==Links==<br />
* [[Konfiguration]]<br />
* [[MQTT2_DEVICE#attrTemplate|attrTemplate]]<br />
* [[DOIF]]<br />
* [[DOIF/Ein- und Ausgabe in FHEMWEB und Tablet-UI am Beispiel einer Schaltuhr]]<br />
* [[Notify|notify]]<br />
* [[List|list]]<br />
<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:FHEM]]<br />
[[Kategorie:FHEM-Verwendung]]</div>Curthttp://wiki.fhem.de/w/index.php?title=Import_von_Code_Snippets&diff=30186Import von Code Snippets2019-04-19T01:15:13Z<p>Curt: </p>
<hr />
<div>Manchmal ist es (oder scheint es) erforderlich, eine neue Device mittels eines Editors direkt in '''fhem.cfg''' einzutragen. Das ist allerdings hoch gefährlich, es wird strikt davon abgeraten. Mit dem "grünen Kreuz" gibt es nun eine Möglichkeit, diesen direkten Eintrag über die Weboberfläche von FHEM auszuführen, gleichzeitig findet ein Syntax- und Fehlercheck statt:<br />
<br />
Sorgfältig vorbereitete Code Snippets, mit exportdevice erzeugter Code oder mit '''Raw definition''' ausgegebene Gerätedefinitionen können im FHEMWEB-Frontend über '''Raw definition''' importiert werden.<br />
{{Hinweis|Wie das [[Konfiguration#Befehl-Eingabefeld|Befehl-Eingabefeld]] unterstützt auch das Dialogfeld zur RAW-Definition Syntax highlighting und die geänderten bzw. importierten Anweisungen werden bei der Ausführung einer Syntaxprüfung unterzogen. So lassen sich eventuelle Fehler häufig schnell erkennen.}} <br />
<br />
==Wie finde ich Raw definition?==<br />
=== Button ===<br />
Um schnell zu einem Eingabefeld für '''Raw definition''' zu gelangen, klicken Sie einfach auf das '''''+''''' neben dem Kommandofeld. Es öffnet sich ein leeres Dialogfeld, in den man RAW-Code direkt eingeben bzw. am Stück eingeben kann. <br />
<gallery><br />
datei:RAW-Button.png|Ausschnitt mit dem Button<br />
datei:RAW-Editor-via-Button.png|Geöffnetes Dialogfeld<br />
</gallery><br />
===Über die Geräte-Detailansicht===<br />
Zur '''Raw definition''' kommt man über die Gerätedetailansicht eines beliebigen Gerätes. Der Link '''Raw definition''' steht in der letzten Zeile der Seite.<br />
[[Datei:Raw_definition.png|600px]]<br />
Diesen Weg sollten Sie wählen, wenn Sie Code für andere bereit stellen wollen.<br />
<br />
==Erstellen eines Importgerätes==<br />
Zur Übung kann man dieses Importgerät importieren.<br />
<pre><br />
define Import dummy<br />
attr Import group Entwicklung<br />
attr Import room Entwicklung<br />
save<br />
</pre><br />
<br />
==Direktzugriff über das FHEM-Menü==<br />
Der angelegte Import-Dummy kann direkt aufgerufen werden, wenn man einen Meüeintrag anlegt.<br />
Im entsprechenden FHEMWEB-Gerät das Attribut '''menuEntries''' erzeugen mit<br />
<pre>attr WEB menuEntries CodeImport,/fhem?detail=Import#</pre><br />
oder ergänzen mit<br />
<pre>CodeImport,/fhem?detail=Import#</pre><br />
<br />
==Vorgehensweise beim Import==<br />
Als erstes die Geräteansicht eines beliebigen Gerätes aufrufen, dann den Link '''Raw definition''' anklicken.<br><br />
Jetzt den angezeigten Inhalt des sich öffnenden Eingabefeldes mit der oben stehenden Definition überschreiben und danach den erschienenen Button '''Execute commands''' drücken.<br> Wenn die Meldung "Wrote configuration to fhem.cfg" erscheint, war der Import erfolgreich, andernfalls gibt es eine Fehlermeldung und der Import wird an dieser Stelle abgebrochen.<br>Das Gerät müsste jetzt im Raum Entwicklung zu finden sein.<br><br />
Zukünftig kann dieses Gerät zum Importieren genutzt werden, damit sinkt die Wahrscheinlichkeit eine bestehende Definition zu beeinträchtigen.<br />
<br><br><br />
Zum Erstellen eigener Definitionen ist der [[DEF-Editor]] das empfohlene Werkzeug.<br />
<br />
==Sonstiges==<br />
<br />
=== Geräte zwischen Installationen verschieben ===<br />
Möchte man eigene Geräte zwischen unterschiedlichen Installationen verschieben, z.B. aus einem Test- in das Produktivsystem, kann man sich mit den erweiterten Optionen von [[List|list]] die Informationen aus dem Ausgangssystem so anzeigen lassen, dass diese direkt samt derzeitiger Zustände ins Zielsystem übernommen werden können. <br />
<br />
=== attrTemplate ===<br />
[[MQTT2_DEVICE#attrTemplate|attrTemplate]] ist für Geräte-Typen, die dies unterstützen, eine weitere Option, Geräte schnell mit einer typischen Konfiguration einzurichten. <br />
<br />
==Links==<br />
* [[Konfiguration]]<br />
* [[MQTT2_DEVICE#attrTemplate|attrTemplate]]<br />
* [[DOIF]]<br />
* [[DOIF/Ein- und Ausgabe in FHEMWEB und Tablet-UI am Beispiel einer Schaltuhr]]<br />
* [[Notify|notify]]<br />
* [[List|list]]<br />
<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:FHEM]]<br />
[[Kategorie:FHEM-Verwendung]]</div>Curthttp://wiki.fhem.de/w/index.php?title=Stra%C3%9Fenverkehr_Blitzer&diff=30185Straßenverkehr Blitzer2019-04-17T22:51:34Z<p>Curt: noch ein fehlendes Wort</p>
<hr />
<div>{{Baustelle}} <br />
<br />
{{Infobox Modul|<br />
|ModPurpose=Geschwindigkeitsüberwachung Blitzer<br />
|ModType=x<br />
|ModCmdRef=blitzer<br />
<!--|ModForumArea=Sonstige Systeme--><br />
|ModFTopic=99070<br />
|ModTechName=98_Blitzer.pm<br />
|ModOwner={{Link2FU|30971|bismosa}}<br />
}}<br />
<br />
'''Straßenverkehr Blitzer''' ist ein Modul, welches mobile Verkehrsüberwachungsanlagen (aka Blitzer) über ein Internet Portal abfragt und für den Umkreis des eigenen Standorts listenförmig im Straßenverkehr innerhalb Deutschlands auflistet - bezogen auf eine anzugebende Koordinate, um den Radius um diese Koordinate.<br />
<br />
== Features ==<br />
* Die Ausgabe ist frei über Attribute konfigurierbar.<br />
* HTML-Code bzw. plaintext ist als Ausgabeformat einstellbar.<br />
* Es kann mit einem set <Blitzer-Device> Update <Optional:LAT> <Optional:LONG> auch eine neue Koordinate vorgegeben werden.<br />
* Der Bereich, der bei Verkehrslage.de abgefragt wird, kann vom Modul berechnet werden.<br />
* Es kann ein Reading erzeugt werden, welches bei vorhanden Blitzern eine "1" und sonst eine "0" anzeigt (praktisch z.B. um in FTUI Bereiche auszublenden, wenn kein Blitzer gemeldet wurde).<br />
* Es kann die maximale Anzahl an anzuzeigenden Blitzern festgelegt werden.<br />
* Es kann ein Text festgelegt werden, wenn kein Blitzer in der Nähe ist.<br />
<br />
== Modul integrieren ==<br />
Das Modul ist in jeweils aktueller Version auf Github verfügbar. Es ist zunächst in den FHEM-Update-Prozess zu integrieren:<br />
<br />
<source lang="html"><br />
update add https://raw.githubusercontent.com/bismosa/FHEM/master/controls_all.txt<br />
update check<br />
update all<br />
</source><br />
<br />
== Definition ==<br />
<source lang="html"><br />
define <Name> Blitzer <Interval><br />
</source><br />
Das Intervall hat die Basis "Minuten". Sofern kein Intervall angegeben ist, wird nicht automatisch aktualisiert.<br />
<br />
Sodann ist '''wesentlich''', dass die gewünschte Ausgangskoordinate sowie der gewünschte Radius in den Attributen gesetzt werden, beispielhaft:<br />
<source lang="html"><br />
attr <Name> home_latitude 51.8<br />
attr <Name> home_longitude 12.6<br />
attr <Name> radius 25<br />
</source><br />
<br />
== Formatierung der Ausgabe ==<br />
<br />
Über das Attribut "Ausgabe" wird gesteuert, welche je Blitzer verfügbaren Informationen ausgegeben werden sollen. Ein Beispiel mit wenigen Informationen, für den ländlichen Raum geeignet:<br />
<source lang="html"><br />
attr <Name> Ausgabe {OR,suburb,city_district,town,village,},road,building,vmax,[km/h],newline<br />
</source><br />
<br />
Ein Beispiel für den großstädtischen Raum:<br />
<source lang="html"><br />
attr <Name> Ausgabe number,{OR,suburb,city_district,town,village,},road,building,[Max.],vmax,[km/h],[(],distanceShort,[km],[)],[!!],newline<br />
</source><br />
<br />
=== Spezielle Einträge ===<br />
*number Nummerierung<br />
* newline Neue Zeile<br />
* [Freitext] Beliebiger Text. Dieser wird ohne die Klammern übernommen.<br />
* distance Abstand des Blitzers von der Home-Koordinate (Luftlinie)<br />
* distanceShort Abstand des Blitzers von der Home-Koordinate (Luftlinie) eine Kommastelle<br />
* {OR ODER-Verknüpfung. Wenn ein Wert vorhanden ist, werden die nachfolgenden (bis zur geschweiften Klammer) nicht berücksichtigt<br />
* } Ende der ODER-Verknüpfung. Muss zwingend gesetzt werden, wenn eine ODER-Verknüpfung enthalten ist.<br />
<br />
Es können beliebig viele Werte so verknüpft werden.<br />
<br />
Welche Werte vorhanden sind, kann mit<br />
<source lang="html"><br />
get <Blitzer-Device> allReadings <Optional:Nummer><br />
</source><br />
überprüft werden. Wird eine Nummer mitgegeben, werden nur die entsprechenden Einträge ausgegeben.<br />
<br />
== Links ==<br />
Das Modul verwendet Daten von<br />
* http://www.verkehrslage.de (https://cdn2.atudo.net)<br />
* https://nominatim.openstreetmap.org</div>Curthttp://wiki.fhem.de/w/index.php?title=Stra%C3%9Fenverkehr_Blitzer&diff=30184Straßenverkehr Blitzer2019-04-17T22:27:41Z<p>Curt: /* Features */ Wort fehlte</p>
<hr />
<div>{{Baustelle}} <br />
<br />
{{Infobox Modul|<br />
|ModPurpose=Geschwindigkeitsüberwachung Blitzer<br />
|ModType=x<br />
|ModCmdRef=blitzer<br />
<!--|ModForumArea=Sonstige Systeme--><br />
|ModFTopic=99070<br />
|ModTechName=98_Blitzer.pm<br />
|ModOwner={{Link2FU|30971|bismosa}}<br />
}}<br />
<br />
'''Straßenverkehr Blitzer''' ist ein Modul, welches mobile Verkehrsüberwachungsanlagen (aka Blitzer) ein Internet Portal abfragt und für den Umkreis des eigenen Standorts listenförmig im Straßenverkehr innerhalb Deutschlands auflistet - bezogen auf eine anzugebende Koordinate, um den Radius um diese Koordinate.<br />
<br />
== Features ==<br />
* Die Ausgabe ist frei über Attribute konfigurierbar.<br />
* HTML-Code bzw. plaintext ist als Ausgabeformat einstellbar.<br />
* Es kann mit einem set <Blitzer-Device> Update <Optional:LAT> <Optional:LONG> auch eine neue Koordinate vorgegeben werden.<br />
* Der Bereich, der bei Verkehrslage.de abgefragt wird, kann vom Modul berechnet werden.<br />
* Es kann ein Reading erzeugt werden, welches bei vorhanden Blitzern eine "1" und sonst eine "0" anzeigt (praktisch z.B. um in FTUI Bereiche auszublenden, wenn kein Blitzer gemeldet wurde).<br />
* Es kann die maximale Anzahl an anzuzeigenden Blitzern festgelegt werden.<br />
* Es kann ein Text festgelegt werden, wenn kein Blitzer in der Nähe ist.<br />
<br />
== Modul integrieren ==<br />
Das Modul ist in jeweils aktueller Version auf Github verfügbar. Es ist zunächst in den FHEM-Update-Prozess zu integrieren:<br />
<br />
<source lang="html"><br />
update add https://raw.githubusercontent.com/bismosa/FHEM/master/controls_all.txt<br />
update check<br />
update all<br />
</source><br />
<br />
== Definition ==<br />
<source lang="html"><br />
define <Name> Blitzer <Interval><br />
</source><br />
Das Intervall hat die Basis "Minuten". Sofern kein Intervall angegeben ist, wird nicht automatisch aktualisiert.<br />
<br />
Sodann ist '''wesentlich''', dass die gewünschte Ausgangskoordinate sowie der gewünschte Radius in den Attributen gesetzt werden, beispielhaft:<br />
<source lang="html"><br />
attr <Name> home_latitude 51.8<br />
attr <Name> home_longitude 12.6<br />
attr <Name> radius 25<br />
</source><br />
<br />
== Formatierung der Ausgabe ==<br />
<br />
Über das Attribut "Ausgabe" wird gesteuert, welche je Blitzer verfügbaren Informationen ausgegeben werden sollen. Ein Beispiel mit wenigen Informationen, für den ländlichen Raum geeignet:<br />
<source lang="html"><br />
attr <Name> Ausgabe {OR,suburb,city_district,town,village,},road,building,vmax,[km/h],newline<br />
</source><br />
<br />
Ein Beispiel für den großstädtischen Raum:<br />
<source lang="html"><br />
attr <Name> Ausgabe number,{OR,suburb,city_district,town,village,},road,building,[Max.],vmax,[km/h],[(],distanceShort,[km],[)],[!!],newline<br />
</source><br />
<br />
=== Spezielle Einträge ===<br />
*number Nummerierung<br />
* newline Neue Zeile<br />
* [Freitext] Beliebiger Text. Dieser wird ohne die Klammern übernommen.<br />
* distance Abstand des Blitzers von der Home-Koordinate (Luftlinie)<br />
* distanceShort Abstand des Blitzers von der Home-Koordinate (Luftlinie) eine Kommastelle<br />
* {OR ODER-Verknüpfung. Wenn ein Wert vorhanden ist, werden die nachfolgenden (bis zur geschweiften Klammer) nicht berücksichtigt<br />
* } Ende der ODER-Verknüpfung. Muss zwingend gesetzt werden, wenn eine ODER-Verknüpfung enthalten ist.<br />
<br />
Es können beliebig viele Werte so verknüpft werden.<br />
<br />
Welche Werte vorhanden sind, kann mit<br />
<source lang="html"><br />
get <Blitzer-Device> allReadings <Optional:Nummer><br />
</source><br />
überprüft werden. Wird eine Nummer mitgegeben, werden nur die entsprechenden Einträge ausgegeben.<br />
<br />
== Links ==<br />
Das Modul verwendet Daten von<br />
* http://www.verkehrslage.de (https://cdn2.atudo.net)<br />
* https://nominatim.openstreetmap.org</div>Curthttp://wiki.fhem.de/w/index.php?title=Import_von_Code_Snippets&diff=30183Import von Code Snippets2019-04-17T22:25:47Z<p>Curt: Am Anfang die Erklärung um was es eigentlich geht</p>
<hr />
<div>Manchmal ist es (oder scheint es) erforderlich, eine neue Device mittels eines Editors direkt in [b]fhem.cfg[/b] einzutragen. Das ist allerdings hoch gefährlich, es wird strikt davon abgeraten. Mit dem "grünen Kreuz" gibt es nun eine Möglichkeit, diesen direkten Eintrag über die Weboberfläche von FHEM auszuführen, gleichzeitig findet ein Syntax- und Fehlercheck statt:<br />
<br />
Sorgfältig vorbereitete Code Snippets, mit exportdevice erzeugter Code oder mit '''Raw definition''' ausgegebene Gerätedefinitionen können im FHEMWEB-Frontend über '''Raw definition''' importiert werden.<br />
{{Hinweis|Wie das [[Konfiguration#Befehl-Eingabefeld|Befehl-Eingabefeld]] unterstützt auch das Dialogfeld zur RAW-Definition Syntax highlighting und die geänderten bzw. importierten Anweisungen werden bei der Ausführung einer Syntaxprüfung unterzogen. So lassen sich eventuelle Fehler häufig schnell erkennen.}} <br />
<br />
==Wie finde ich Raw definition?==<br />
=== Button ===<br />
Um schnell zu einem Eingabefeld für '''Raw definition''' zu gelangen, klicken Sie einfach auf das '''''+''''' neben dem Kommandofeld. Es öffnet sich ein leeres Dialogfeld, in den man RAW-Code direkt eingeben bzw. am Stück eingeben kann. <br />
<gallery><br />
datei:RAW-Button.png|Ausschnitt mit dem Button<br />
datei:RAW-Editor-via-Button.png|Geöffnetes Dialogfeld<br />
</gallery><br />
===Über die Geräte-Detailansicht===<br />
Zur '''Raw definition''' kommt man über die Gerätedetailansicht eines beliebigen Gerätes. Der Link '''Raw definition''' steht in der letzten Zeile der Seite.<br />
[[Datei:Raw_definition.png|600px]]<br />
Diesen Weg sollten Sie wählen, wenn Sie Code für andere bereit stellen wollen.<br />
<br />
==Erstellen eines Importgerätes==<br />
Zur Übung kann man dieses Importgerät importieren.<br />
<pre><br />
define Import dummy<br />
attr Import group Entwicklung<br />
attr Import room Entwicklung<br />
save<br />
</pre><br />
<br />
==Direktzugriff über das FHEM-Menü==<br />
Der angelegte Import-Dummy kann direkt aufgerufen werden, wenn man einen Meüeintrag anlegt.<br />
Im entsprechenden FHEMWEB-Gerät das Attribut '''menuEntries''' erzeugen mit<br />
<pre>attr WEB menuEntries CodeImport,/fhem?detail=Import#</pre><br />
oder ergänzen mit<br />
<pre>CodeImport,/fhem?detail=Import#</pre><br />
<br />
==Vorgehensweise beim Import==<br />
Als erstes die Geräteansicht eines beliebigen Gerätes aufrufen, dann den Link '''Raw definition''' anklicken.<br><br />
Jetzt den angezeigten Inhalt des sich öffnenden Eingabefeldes mit der oben stehenden Definition überschreiben und danach den erschienenen Button '''Execute commands''' drücken.<br> Wenn die Meldung "Wrote configuration to fhem.cfg" erscheint, war der Import erfolgreich, andernfalls gibt es eine Fehlermeldung und der Import wird an dieser Stelle abgebrochen.<br>Das Gerät müsste jetzt im Raum Entwicklung zu finden sein.<br><br />
Zukünftig kann dieses Gerät zum Importieren genutzt werden, damit sinkt die Wahrscheinlichkeit eine bestehende Definition zu beeinträchtigen.<br />
<br><br><br />
Zum Erstellen eigener Definitionen ist der [[DEF-Editor]] das empfohlene Werkzeug.<br />
<br />
==Sonstiges==<br />
<br />
=== Geräte zwischen Installationen verschieben ===<br />
Möchte man eigene Geräte zwischen unterschiedlichen Installationen verschieben, z.B. aus einem Test- in das Produktivsystem, kann man sich mit den erweiterten Optionen von [[List|list]] die Informationen aus dem Ausgangssystem so anzeigen lassen, dass diese direkt samt derzeitiger Zustände ins Zielsystem übernommen werden können. <br />
<br />
=== attrTemplate ===<br />
[[MQTT2_DEVICE#attrTemplate|attrTemplate]] ist für Geräte-Typen, die dies unterstützen, eine weitere Option, Geräte schnell mit einer typischen Konfiguration einzurichten. <br />
<br />
==Links==<br />
* [[Konfiguration]]<br />
* [[MQTT2_DEVICE#attrTemplate|attrTemplate]]<br />
* [[DOIF]]<br />
* [[DOIF/Ein- und Ausgabe in FHEMWEB und Tablet-UI am Beispiel einer Schaltuhr]]<br />
* [[Notify|notify]]<br />
* [[List|list]]<br />
<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:FHEM]]<br />
[[Kategorie:FHEM-Verwendung]]</div>Curthttp://wiki.fhem.de/w/index.php?title=Flusspegel&diff=30092Flusspegel2019-04-03T21:23:13Z<p>Curt: /* Datenlieferant */</p>
<hr />
<div>Der [[{{PAGENAME}}|Artikel "Flusspegel"]] beschreibt das Vorgehen zur Integration eines amtlichen deutschen Flusspegels in FHEM.<br />
<br />
==Etwas Theorie==<br />
Ein Pegel ist eine willkürliche amtliche Höhenfestlegung. Der Nullpunkt des Pegels sagt wenig über die reale Gewässertiefe. Pegelstände werden oft bei Hochwassersituationen interessant. Für die Vorhersage ist aber die sogenannte Abflussmenge (in Kubikmeter je Sekunde) eines höher gelegenen Pegels von Interesse. Pegelhöhen sind lediglich indirekte Indizien.<br />
<br />
==Datenlieferant==<br />
Es gibt mehrere Bundesämter, die die Daten der offiziellen deutschen Flusspegel vorhalten. Von Interesse sind die Daten der Wasserstraßen- und Schifffahrtsverwaltung des Bundes: Sie werden im json-Format bereitgestellt. Damit ist die Integration in FHEM problemlos möglich. Zudem kann '''Pegelonline''' mit 200 Millionen Abfragen im Jahr als stabiler, langfristig verfügbarer Dienst angesehen werden.<br />
<br />
==Pegeldaten finden==<br />
Einen konkreten amtlichen Pegel findet man, indem man im ersten Schritt die UUID des gewünschten Pegels in https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations.json herausfindet. Für den Pegel Elbe, Lutherstadt Wittenberg ist das die UUID "5c47b0ce-f33f-769b-1a02-89bf7772cb0d2878". Im zweiten Schritt wird die URL-Vorlage <br />
<br />
<source lang="html"><br />
https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations/[UUID]/W/currentmeasurement.json<br />
</source><br />
<br />
mit der gefundenen UUID konkretisiert. Im Ergebnis erhält man eine URL mit den Daten (mehr als nur die Pegelhöhe selbst) des gewünschten Pegels, beispielsweise für den Pegel Elbe, Lutherstadt Wittenberg, den man im Browser testweise aufruft:<br />
<br />
<source lang="html"><br />
https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations/070b1eb4-3872-4e07-b2e5-e25fd9251b93/W/currentmeasurement.json<br />
</source><br />
<br />
Da sich Flußpegel nicht sprunghaft ändern, sollte die Abfragehäufigkeit eine Stunde (3600) nicht unterschreiten.<br />
<br />
==Integration in FHEM==<br />
<source lang="html"><br />
define ElbePegelWittenberg HTTPMOD https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations/070b1eb4-3872-4e07-b2e5-e25fd9251b93/W/currentmeasurement.json 3600<br />
attr ElbePegelWittenberg alias Pegel Wittenberg<br />
attr ElbePegelWittenberg enableControlSet 1<br />
attr ElbePegelWittenberg event-on-change-reading stateMnwMhw,stateNswHsw,timestamp,trend<br />
attr ElbePegelWittenberg event-on-update-reading pegel,value<br />
attr ElbePegelWittenberg extractAllJSON 1<br />
attr ElbePegelWittenberg timeout 5<br />
attr ElbePegelWittenberg stateFormat {sprintf("%.0f",ReadingsVal($name,"pegel",0))}<br />
attr ElbePegelWittenberg userReadings pegel:value.* {ReadingsVal($name,"value",0)}<br />
</source><br />
<br />
Ein dazugehöriges Logfile könnte so definiert sein:<br />
<br />
<source lang="html"><br />
define FileLog_ElbePegelWittenberg FileLog ./log/ElbePegelWittenberg-%Y.log ElbePegelWittenberg<br />
attr FileLog_ElbePegelWittenberg logtype text<br />
</source><br />
<br />
Die grafische Darstellung ließe sich dann so realisieren:<br />
<br />
<source lang="html"><br />
define SVG_FileLog_ElbePegelWittenberg SVG FileLog_ElbePegelWittenberg:SVG_FileLog_ElbePegelWittenberg:CURRENT<br />
</source><br />
<br />
Die dazugehörige GRafikdatei SVG_FileLog_ElbePegelWittenberg.gplot<br />
<source lang="html"><br />
<br />
# Created by FHEM/98_SVG.pm, 2018-04-09 21:30:11<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 'Pegel Wittenberg'<br />
set ytics <br />
set y2tics <br />
set grid y2tics<br />
set ylabel ""<br />
set y2label "Pegel"<br />
set yrange [0:8]<br />
set y2range [0:800]<br />
<br />
#FileLog_ElbePegelWittenberg 4:ElbePegelWittenberg.pegel\x3a::<br />
<br />
plot "<IN>" using 1:2 axes x1y2 title 'Pegel Wittenberg' ls l2fill lw 1 with steps<br />
</source><br />
Eine vollständige Dokumentation der WebServices findet man unter https://www.pegelonline.wsv.de/webservice/guideRestapi . FHEM-Forenthread findet sich unter https://forum.fhem.de/index.php/topic,97570.0.html .<br />
<br />
==Abflussmenge==<br />
Die eigentlich interessantere Abflussmenge kann über eine geringfügig andere URL abgefragt werden: In der ermittelten URL ist lediglich das "W" durch "Q" zu ersetzen, im obigen Beispiel also<br />
<br />
<source lang="html"><br />
https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations/070b1eb4-3872-4e07-b2e5-e25fd9251b93/Q/currentmeasurement.json<br />
</source><br />
<br />
==Einzelwert "trend"==<br />
Der bei beiden URL auch gelieferte Wert "trend" ist laut Aussage ITZBund "künftig wegfallend".<br />
<br />
== Links ==<br />
* vollständige Dokumentation der WebServices von [https://www.pegelonline.wsv.de/webservice PeglOnline]<br />
* Diskussion über das Thema in {{Link2Forum|Topic=97570|LinkText=diesem Forenthread}}<br />
<br />
[[Kategorie:Code_Snippets]]</div>Curthttp://wiki.fhem.de/w/index.php?title=Stra%C3%9Fenverkehr_Blitzer&diff=30091Straßenverkehr Blitzer2019-04-03T20:18:02Z<p>Curt: Abschnitt Links neu / Alter Code raus</p>
<hr />
<div>@Wiki-Admin: <br />
* Link auf bismosa fehlt<br />
* Link auf https://forum.fhem.de/index.php/topic,99070.0.html fehlt{{Baustelle}} <br />
<br />
{{Infobox Modul|<br />
|ModPurpose=Geschwindigkeitsüberwachung Blitzer<br />
|ModType=x<br />
|ModCmdRef=blitzer<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=98_Blitzer.pm<br />
|ModOwner=bismosa<br />
}}<br />
<br />
'''Straßenverkehr Blitzer''' ist ein Modul, welches mobile Verkehrsüberwachungsanlagen (aka Blitzer) ein Internet Portal abfragt und für den Umkreis des eigenen Standorts listenförmig im Straßenverkehr innerhalb Deutschlands auflistet - bezogen auf eine anzugebende Koordinate, um den Radius um diese Koordinate.<br />
<br />
== Features ==<br />
* Die Ausgabe frei über Attribute konfigurierbar.<br />
* HTML-Code bzw. plaintext ist einstellbar.<br />
* Es kann mit einem set <Blitzer-Device> Update <Optional:LAT> <Optional:LONG> auch eine neue Koordinate vorgegeben werden.<br />
* Der Bereich, der bei Verkehrslage.de abgefragt wird, kann vom Modul berechnet werden.<br />
* Es kann ein Reading erzeugt werden, welches bei vorhanden Blitzern eine "1" und sonst eine "0" anzeigt (praktisch z.B. um in FTUI Bereiche auszublenden, wenn kein Blitzer gemeldet wurde).<br />
* Es kann die maximale Anzahl an anzuzeigenden Blitzern festgelegt werden.<br />
* Es kann ein Text festgelegt werden, wenn kein Blitzer in der Nähe ist.<br />
<br />
== Modul integrieren ==<br />
Das Modul ist in jeweils aktueller Version auf Github verfügbar. Es ist zunächst in den FHEM-Update-Prozess zu integieren:<br />
<br />
<source lang="html"><br />
update add https://raw.githubusercontent.com/bismosa/FHEM/master/controls_all.txt<br />
update check<br />
update all<br />
</source><br />
<br />
== Definition ==<br />
<source lang="html"><br />
define <Name> Blitzer <Interval><br />
</source><br />
Das Intervall hat die Basis "Minuten". Sofern kein Intervall angegeben ist, wird nicht automatisch aktualisiert.<br />
<br />
Sodann ist '''wesentlich''', dass die gewünschte Ausgangskoordinate sowie der gewünschte Radius in den Attributen gesetzt werden, beispielhaft:<br />
<source lang="html"><br />
attr <Name> home_latitude 51.8<br />
attr <Name> home_longitude 12.6<br />
attr <Name> radius 25<br />
</source><br />
<br />
== Formatierung der Ausgabe ==<br />
<br />
Über das Attribut "Ausgabe" wird gesteuert, welche je Blitzer verfügbaren Informationen ausgegeben werden sollen. Ein Beispiel mit wenigen Informationen, für den ländlichen Raum geeignet:<br />
<source lang="html"><br />
attr <Name> Ausgabe {OR,suburb,city_district,town,village,},road,building,vmax,[km/h],newline<br />
</source><br />
<br />
Ein Beispiel für den großstädtischen Raum:<br />
<source lang="html"><br />
attr <Name> Ausgabe number,{OR,suburb,city_district,town,village,},road,building,[Max.],vmax,[km/h],[(],distanceShort,[km],[)],[!!],newline<br />
</source><br />
<br />
=== Spezielle Einträge ===<br />
*number Nummerierung<br />
* newline Neue Zeile<br />
* [Freitext] Beliebiger Text. Dieser wird ohne die Klammern übernommen.<br />
* distance Abstand des Blitzers von der Home-Koordinate (Luftlinie)<br />
* distanceShort Abstand des Blitzers von der Home-Koordinate (Luftlinie) eine Kommastelle<br />
* {OR ODER-Verknüpfung. Wenn ein Wert vorhanden ist, werden die nachfolgenden (bis zur geschweiften Klammer) nicht berücksichtigt<br />
* } Ende der ODER-Verknüpfung. Muss zwingend gesetzt werden, wenn eine ODER-Verknüpfung enthalten ist.<br />
<br />
Es können beliebig viele Werte so verknüpft werden.<br />
<br />
Welche Werte vorhanden sind, kann mit<br />
<source lang="html"><br />
get <Blitzer-Device> allReadings <Optional:Nummer><br />
</source><br />
überprüft werden. Wird eine nummer mitgegeben, werden nur die entsprechenden Einträge ausgegeben.<br />
<br />
== Links ==<br />
Das Modul verwendet Daten von<br />
* http://www.verkehrslage.de (https://cdn2.atudo.net)<br />
* https://nominatim.openstreetmap.org</div>Curthttp://wiki.fhem.de/w/index.php?title=Diskussion:Flusspegel&diff=30086Diskussion:Flusspegel2019-04-03T18:52:22Z<p>Curt: beantwortet</p>
<hr />
<div>== Einleitungszeile dieses Artikels ==<br />
Mal von meiner Diskussionsseite hierher kopiert...<br />
:''Es geht zwar um einen anderen Artikel, aber kannst Du bitte mal bei Flusspegel die Einleitungszeile (?????) prüfen und korrigieren?''<br />
Vorschlag:<br />
:''Die Definitionen und Code-Schnipsel auf dieser Seite zeigen, wie aktuelle Informationen über einen <nowiki>[[Flusspegel]]</nowiki> in FHEM dargestellt und auch visualisiert werden können.''<br />
Generell zu dieser Seite / diesem Artikel:<br />
* Das Konzept "Autor", wie Du es in der ersten Version der Wiki-Seite benutzt, funktioniert in einem Wiki wohl grundsätzlich so nicht; Du solltest Dich von dem Gedanken verabschieden, dass man auf Dauer Deine Urheberschaft präsent haben wird<br />
* Ein Screenshot, wie so ein "Flusspegel" in FHEM aussehen kann ist sicher immer hilfreich und erspart erst mal viele Worte<br />
* Bitte Abschnitt <nowiki>== Links ==</nowiki> einfügen mit<br />
** vollständige Dokumentation der WebServices von <nowiki>[https://www.pegelonline.wsv.de/webservice</nowiki> PeglOnline]<br />
** Diskussion über das Thema in <nowiki>{{Link2Forum|Topic=97570|LinkText=diesem Forenthread}}</nowiki><br />
* Den Abschnitt "Dank" würde ich ersatzlos streichen (siehe auch obigen Kommentar zu "Autor")<br />
* Code-Schnipsel / Definitionen vielleicht besser im [[Raw definition|raw]] Format?<br />
--[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 09:09, 20. Feb. 2019 (CET)<br />
:*Meine Antwort auf Deiner Diskussionsseite<br />
:*Abschnitt Links eingepflegt<br />
:*Dank an ITZBund raus (der war aber erforderlich, wurde gelesen, das war der Deal)<br />
:*Unklarheit bei Verlinkung Foren-Nick, Foren-Thread - siehe Deine Disk. [[Benutzer:Curt|Curt]] ([[Benutzer Diskussion:Curt|Diskussion]]) 20:51, 3. Apr. 2019 (CEST)</div>Curthttp://wiki.fhem.de/w/index.php?title=Flusspegel&diff=30085Flusspegel2019-04-03T18:48:59Z<p>Curt: </p>
<hr />
<div>Der [[{{PAGENAME}}|Artikel "Flusspegel"]] beschreibt das Vorgehen zur Integration eines amtlichen deutschen Flusspegels in FHEM.<br />
<br />
==Etwas Theorie==<br />
Ein Pegel ist eine willkürliche amtliche Höhenfestlegung. Der Nullpunkt des Pegels sagt wenig über die reale Gewässertiefe. Pegelstände werden oft bei Hochwassersituationen interessant. Für die Vorhersage ist aber die sogenannte Abflussmenge (in Kubikmeter je Sekunde) eines höher gelegenen Pegels von Interesse. Pegelhöhen sind lediglich indirekte Indizien.<br />
<br />
==Datenlieferant==<br />
Es gibt mehrere Bundesämter, die die Daten der offiziellen deutschen Flusspegel vorhalten. Von Interesse sind die Daten der Wasserstraßen- und Schifffahrtsverwaltung des Bundes: Sie werden im json-Format bereitgestellt. Damit ist die Integration in FHEM problemlos möglich. Zudem kann Pegelonline mit 200 Millionen Abfragen im Jahr als stabiler, langfristig verfügbarer Dienst angesehen werden.<br />
<br />
==Pegeldaten finden==<br />
Einen konkreten amtlichen Pegel findet man, indem man im ersten Schritt die UUID des gewünschten Pegels in https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations.json herausfindet. Für den Pegel Elbe, Lutherstadt Wittenberg ist das die UUID "5c47b0ce-f33f-769b-1a02-89bf7772cb0d2878". Im zweiten Schritt wird die URL-Vorlage <br />
<br />
<source lang="html"><br />
https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations/[UUID]/W/currentmeasurement.json<br />
</source><br />
<br />
mit der gefundenen UUID konkretisiert. Im Ergebnis erhält man eine URL mit den Daten (mehr als nur die Pegelhöhe selbst) des gewünschten Pegels, beispielsweise für den Pegel Elbe, Lutherstadt Wittenberg, den man im Browser testweise aufruft:<br />
<br />
<source lang="html"><br />
https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations/070b1eb4-3872-4e07-b2e5-e25fd9251b93/W/currentmeasurement.json<br />
</source><br />
<br />
Da sich Flußpegel nicht sprunghaft ändern, sollte die Abfragehäufigkeit eine Stunde (3600) nicht unterschreiten.<br />
<br />
==Integration in FHEM==<br />
<source lang="html"><br />
define ElbePegelWittenberg HTTPMOD https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations/070b1eb4-3872-4e07-b2e5-e25fd9251b93/W/currentmeasurement.json 3600<br />
attr ElbePegelWittenberg alias Pegel Wittenberg<br />
attr ElbePegelWittenberg enableControlSet 1<br />
attr ElbePegelWittenberg event-on-change-reading stateMnwMhw,stateNswHsw,timestamp,trend<br />
attr ElbePegelWittenberg event-on-update-reading pegel,value<br />
attr ElbePegelWittenberg extractAllJSON 1<br />
attr ElbePegelWittenberg timeout 5<br />
attr ElbePegelWittenberg stateFormat {sprintf("%.0f",ReadingsVal($name,"pegel",0))}<br />
attr ElbePegelWittenberg userReadings pegel:value.* {ReadingsVal($name,"value",0)}<br />
</source><br />
<br />
Ein dazugehöriges Logfile könnte so definiert sein:<br />
<br />
<source lang="html"><br />
define FileLog_ElbePegelWittenberg FileLog ./log/ElbePegelWittenberg-%Y.log ElbePegelWittenberg<br />
attr FileLog_ElbePegelWittenberg logtype text<br />
</source><br />
<br />
Die grafische Darstellung ließe sich dann so realisieren:<br />
<br />
<source lang="html"><br />
define SVG_FileLog_ElbePegelWittenberg SVG FileLog_ElbePegelWittenberg:SVG_FileLog_ElbePegelWittenberg:CURRENT<br />
</source><br />
<br />
Die dazugehörige GRafikdatei SVG_FileLog_ElbePegelWittenberg.gplot<br />
<source lang="html"><br />
<br />
# Created by FHEM/98_SVG.pm, 2018-04-09 21:30:11<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 'Pegel Wittenberg'<br />
set ytics <br />
set y2tics <br />
set grid y2tics<br />
set ylabel ""<br />
set y2label "Pegel"<br />
set yrange [0:8]<br />
set y2range [0:800]<br />
<br />
#FileLog_ElbePegelWittenberg 4:ElbePegelWittenberg.pegel\x3a::<br />
<br />
plot "<IN>" using 1:2 axes x1y2 title 'Pegel Wittenberg' ls l2fill lw 1 with steps<br />
</source><br />
Eine vollständige Dokumentation der WebServices findet man unter https://www.pegelonline.wsv.de/webservice/guideRestapi . FHEM-Forenthread findet sich unter https://forum.fhem.de/index.php/topic,97570.0.html .<br />
<br />
==Abflussmenge==<br />
Die eigentlich interessantere Abflussmenge kann über eine geringfügig andere URL abgefragt werden: In der ermittelten URL ist lediglich das "W" durch "Q" zu ersetzen, im obigen Beispiel also<br />
<br />
<source lang="html"><br />
https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations/070b1eb4-3872-4e07-b2e5-e25fd9251b93/Q/currentmeasurement.json<br />
</source><br />
<br />
==Einzelwert "trend"==<br />
Der bei beiden URL auch gelieferte Wert "trend" ist laut Aussage ITZBund "künftig wegfallend".<br />
<br />
== Links ==<br />
* vollständige Dokumentation der WebServices von [https://www.pegelonline.wsv.de/webservice PeglOnline]<br />
* Diskussion über das Thema in {{Link2Forum|Topic=97570|LinkText=diesem Forenthread}}<br />
<br />
[[Kategorie:Code_Snippets]]</div>Curthttp://wiki.fhem.de/w/index.php?title=Flusspegel&diff=30084Flusspegel2019-04-03T18:48:25Z<p>Curt: Dank an ITZBund weg, Autor weg. Link auf Autor ggf doch sinnvoll?</p>
<hr />
<div>{{Baustelle}} <br />
<br />
Der [[{{PAGENAME}}|Artikel "Flusspegel"]] beschreibt das Vorgehen zur Integration eines amtlichen deutschen Flusspegels in FHEM.<br />
<br />
==Etwas Theorie==<br />
Ein Pegel ist eine willkürliche amtliche Höhenfestlegung. Der Nullpunkt des Pegels sagt wenig über die reale Gewässertiefe. Pegelstände werden oft bei Hochwassersituationen interessant. Für die Vorhersage ist aber die sogenannte Abflussmenge (in Kubikmeter je Sekunde) eines höher gelegenen Pegels von Interesse. Pegelhöhen sind lediglich indirekte Indizien.<br />
<br />
==Datenlieferant==<br />
Es gibt mehrere Bundesämter, die die Daten der offiziellen deutschen Flusspegel vorhalten. Von Interesse sind die Daten der Wasserstraßen- und Schifffahrtsverwaltung des Bundes: Sie werden im json-Format bereitgestellt. Damit ist die Integration in FHEM problemlos möglich. Zudem kann Pegelonline mit 200 Millionen Abfragen im Jahr als stabiler, langfristig verfügbarer Dienst angesehen werden.<br />
<br />
==Pegeldaten finden==<br />
Einen konkreten amtlichen Pegel findet man, indem man im ersten Schritt die UUID des gewünschten Pegels in https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations.json herausfindet. Für den Pegel Elbe, Lutherstadt Wittenberg ist das die UUID "5c47b0ce-f33f-769b-1a02-89bf7772cb0d2878". Im zweiten Schritt wird die URL-Vorlage <br />
<br />
<source lang="html"><br />
https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations/[UUID]/W/currentmeasurement.json<br />
</source><br />
<br />
mit der gefundenen UUID konkretisiert. Im Ergebnis erhält man eine URL mit den Daten (mehr als nur die Pegelhöhe selbst) des gewünschten Pegels, beispielsweise für den Pegel Elbe, Lutherstadt Wittenberg, den man im Browser testweise aufruft:<br />
<br />
<source lang="html"><br />
https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations/070b1eb4-3872-4e07-b2e5-e25fd9251b93/W/currentmeasurement.json<br />
</source><br />
<br />
Da sich Flußpegel nicht sprunghaft ändern, sollte die Abfragehäufigkeit eine Stunde (3600) nicht unterschreiten.<br />
<br />
==Integration in FHEM==<br />
<source lang="html"><br />
define ElbePegelWittenberg HTTPMOD https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations/070b1eb4-3872-4e07-b2e5-e25fd9251b93/W/currentmeasurement.json 3600<br />
attr ElbePegelWittenberg alias Pegel Wittenberg<br />
attr ElbePegelWittenberg enableControlSet 1<br />
attr ElbePegelWittenberg event-on-change-reading stateMnwMhw,stateNswHsw,timestamp,trend<br />
attr ElbePegelWittenberg event-on-update-reading pegel,value<br />
attr ElbePegelWittenberg extractAllJSON 1<br />
attr ElbePegelWittenberg timeout 5<br />
attr ElbePegelWittenberg stateFormat {sprintf("%.0f",ReadingsVal($name,"pegel",0))}<br />
attr ElbePegelWittenberg userReadings pegel:value.* {ReadingsVal($name,"value",0)}<br />
</source><br />
<br />
Ein dazugehöriges Logfile könnte so definiert sein:<br />
<br />
<source lang="html"><br />
define FileLog_ElbePegelWittenberg FileLog ./log/ElbePegelWittenberg-%Y.log ElbePegelWittenberg<br />
attr FileLog_ElbePegelWittenberg logtype text<br />
</source><br />
<br />
Die grafische Darstellung ließe sich dann so realisieren:<br />
<br />
<source lang="html"><br />
define SVG_FileLog_ElbePegelWittenberg SVG FileLog_ElbePegelWittenberg:SVG_FileLog_ElbePegelWittenberg:CURRENT<br />
</source><br />
<br />
Die dazugehörige GRafikdatei SVG_FileLog_ElbePegelWittenberg.gplot<br />
<source lang="html"><br />
<br />
# Created by FHEM/98_SVG.pm, 2018-04-09 21:30:11<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 'Pegel Wittenberg'<br />
set ytics <br />
set y2tics <br />
set grid y2tics<br />
set ylabel ""<br />
set y2label "Pegel"<br />
set yrange [0:8]<br />
set y2range [0:800]<br />
<br />
#FileLog_ElbePegelWittenberg 4:ElbePegelWittenberg.pegel\x3a::<br />
<br />
plot "<IN>" using 1:2 axes x1y2 title 'Pegel Wittenberg' ls l2fill lw 1 with steps<br />
</source><br />
Eine vollständige Dokumentation der WebServices findet man unter https://www.pegelonline.wsv.de/webservice/guideRestapi . FHEM-Forenthread findet sich unter https://forum.fhem.de/index.php/topic,97570.0.html .<br />
<br />
==Abflussmenge==<br />
Die eigentlich interessantere Abflussmenge kann über eine geringfügig andere URL abgefragt werden: In der ermittelten URL ist lediglich das "W" durch "Q" zu ersetzen, im obigen Beispiel also<br />
<br />
<source lang="html"><br />
https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations/070b1eb4-3872-4e07-b2e5-e25fd9251b93/Q/currentmeasurement.json<br />
</source><br />
<br />
==Einzelwert "trend"==<br />
Der bei beiden URL auch gelieferte Wert "trend" ist laut Aussage ITZBund "künftig wegfallend".<br />
<br />
== Links ==<br />
* vollständige Dokumentation der WebServices von [https://www.pegelonline.wsv.de/webservice PeglOnline]<br />
* Diskussion über das Thema in {{Link2Forum|Topic=97570|LinkText=diesem Forenthread}}<br />
<br />
[[Kategorie:Code_Snippets]]</div>Curthttp://wiki.fhem.de/w/index.php?title=Flusspegel&diff=30083Flusspegel2019-04-03T18:46:42Z<p>Curt: erstmal Abschnitt Links</p>
<hr />
<div>{{Baustelle}} <br />
<br />
Der [[{{PAGENAME}}|Artikel "Flusspegel"]] (Autor: {{Link2FU|?????|curt}}]) beschreibt das Vorgehen zur Integration eines amtlichen deutschen Flusspegels in FHEM.<br />
<br />
==Etwas Theorie==<br />
Ein Pegel ist eine willkürliche amtliche Höhenfestlegung. Der Nullpunkt des Pegels sagt wenig über die reale Gewässertiefe. Pegelstände werden oft bei Hochwassersituationen interessant. Für die Vorhersage ist aber die sogenannte Abflussmenge (in Kubikmeter je Sekunde) eines höher gelegenen Pegels von Interesse. Pegelhöhen sind lediglich indirekte Indizien.<br />
<br />
==Datenlieferant==<br />
Es gibt mehrere Bundesämter, die die Daten der offiziellen deutschen Flusspegel vorhalten. Von Interesse sind die Daten der Wasserstraßen- und Schifffahrtsverwaltung des Bundes: Sie werden im json-Format bereitgestellt. Damit ist die Integration in FHEM problemlos möglich. Zudem kann Pegelonline mit 200 Millionen Abfragen im Jahr als stabiler, langfristig verfügbarer Dienst angesehen werden.<br />
<br />
==Pegeldaten finden==<br />
Einen konkreten amtlichen Pegel findet man, indem man im ersten Schritt die UUID des gewünschten Pegels in https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations.json herausfindet. Für den Pegel Elbe, Lutherstadt Wittenberg ist das die UUID "5c47b0ce-f33f-769b-1a02-89bf7772cb0d2878". Im zweiten Schritt wird die URL-Vorlage <br />
<br />
<source lang="html"><br />
https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations/[UUID]/W/currentmeasurement.json<br />
</source><br />
<br />
mit der gefundenen UUID konkretisiert. Im Ergebnis erhält man eine URL mit den Daten (mehr als nur die Pegelhöhe selbst) des gewünschten Pegels, beispielsweise für den Pegel Elbe, Lutherstadt Wittenberg, den man im Browser testweise aufruft:<br />
<br />
<source lang="html"><br />
https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations/070b1eb4-3872-4e07-b2e5-e25fd9251b93/W/currentmeasurement.json<br />
</source><br />
<br />
Da sich Flußpegel nicht sprunghaft ändern, sollte die Abfragehäufigkeit eine Stunde (3600) nicht unterschreiten.<br />
<br />
==Integration in FHEM==<br />
<source lang="html"><br />
define ElbePegelWittenberg HTTPMOD https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations/070b1eb4-3872-4e07-b2e5-e25fd9251b93/W/currentmeasurement.json 3600<br />
attr ElbePegelWittenberg alias Pegel Wittenberg<br />
attr ElbePegelWittenberg enableControlSet 1<br />
attr ElbePegelWittenberg event-on-change-reading stateMnwMhw,stateNswHsw,timestamp,trend<br />
attr ElbePegelWittenberg event-on-update-reading pegel,value<br />
attr ElbePegelWittenberg extractAllJSON 1<br />
attr ElbePegelWittenberg timeout 5<br />
attr ElbePegelWittenberg stateFormat {sprintf("%.0f",ReadingsVal($name,"pegel",0))}<br />
attr ElbePegelWittenberg userReadings pegel:value.* {ReadingsVal($name,"value",0)}<br />
</source><br />
<br />
Ein dazugehöriges Logfile könnte so definiert sein:<br />
<br />
<source lang="html"><br />
define FileLog_ElbePegelWittenberg FileLog ./log/ElbePegelWittenberg-%Y.log ElbePegelWittenberg<br />
attr FileLog_ElbePegelWittenberg logtype text<br />
</source><br />
<br />
Die grafische Darstellung ließe sich dann so realisieren:<br />
<br />
<source lang="html"><br />
define SVG_FileLog_ElbePegelWittenberg SVG FileLog_ElbePegelWittenberg:SVG_FileLog_ElbePegelWittenberg:CURRENT<br />
</source><br />
<br />
Die dazugehörige GRafikdatei SVG_FileLog_ElbePegelWittenberg.gplot<br />
<source lang="html"><br />
<br />
# Created by FHEM/98_SVG.pm, 2018-04-09 21:30:11<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 'Pegel Wittenberg'<br />
set ytics <br />
set y2tics <br />
set grid y2tics<br />
set ylabel ""<br />
set y2label "Pegel"<br />
set yrange [0:8]<br />
set y2range [0:800]<br />
<br />
#FileLog_ElbePegelWittenberg 4:ElbePegelWittenberg.pegel\x3a::<br />
<br />
plot "<IN>" using 1:2 axes x1y2 title 'Pegel Wittenberg' ls l2fill lw 1 with steps<br />
</source><br />
Eine vollständige Dokumentation der WebServices findet man unter https://www.pegelonline.wsv.de/webservice/guideRestapi . FHEM-Forenthread findet sich unter https://forum.fhem.de/index.php/topic,97570.0.html .<br />
<br />
==Abflussmenge==<br />
Die eigentlich interessantere Abflussmenge kann über eine geringfügig andere URL abgefragt werden: In der ermittelten URL ist lediglich das "W" durch "Q" zu ersetzen, im obigen Beispiel also<br />
<br />
<source lang="html"><br />
https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations/070b1eb4-3872-4e07-b2e5-e25fd9251b93/Q/currentmeasurement.json<br />
</source><br />
<br />
==Einzelwert "trend"==<br />
Der bei beiden URL auch gelieferte Wert "trend" ist laut Aussage ITZBund "künftig wegfallend".<br />
<br />
== Links ==<br />
* vollständige Dokumentation der WebServices von [https://www.pegelonline.wsv.de/webservice PeglOnline]<br />
* Diskussion über das Thema in {{Link2Forum|Topic=97570|LinkText=diesem Forenthread}}<br />
<br />
==Dank==<br />
Der Autor dieses Artikels dankt den Mitarbeitern des Informationstechnikzentrum Bund (ITZBund), die schnell, kompetent und freundlich Fragen beantworteten.<br />
<br />
[[Kategorie:Code_Snippets]]</div>Curthttp://wiki.fhem.de/w/index.php?title=Benutzer_Diskussion:Ph1959de&diff=30082Benutzer Diskussion:Ph1959de2019-04-03T18:44:06Z<p>Curt: /* wohin ein Proof of Concept? */ Wer nicht fragt ...</p>
<hr />
<div>== Kategoriestruktur ==<br />
<br />
Ich habe eine Bestandsaufnahme der Kategoriestruktur mittels Freeplane Mindmap Programm erstellt. Die Quelldatei kann ich derzeit hier nicht ablegen, da nur Bilddateien erlaubt sind. Bei Bedarf bitte nach der .mm Datei fragen, ich sende sie gern an Interessenten (die willens sind, an der Umstrukturierung mitzuarbeiten). --[[Benutzer:Ph1959de|Greetz, Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 13:13, 8. Jul. 2013 (CEST)<br />
<br />
::Darfst du die Datei im Forum hochladen? Dann könntest einfach von hier dorthin verlinken? Grüße, [[Benutzer:Rince|Rince]] ([[Benutzer Diskussion:Rince|Diskussion]]) 08:43, 10. Jul. 2013 (CEST)<br />
<br />
== Löschkandidaten ==<br />
Die ganzen unverlinkten Bilde in Löschkandidaten packen hättest du nicht machen brauchen. Ich lösch unverlinkte Bilder die aus dem Import kommen auch so... wenn ich zwischendurch immer mal Zeit [[Benutzer:Soulman|Soulman]] ([[Benutzer Diskussion:Soulman|Diskussion]]) 17:00, 9. Jul. 2013 (CEST)<br />
<br />
: :-) ... War ich ja gar nicht - das war Markusbloch ... von mir war der Hinweis auf die unverlinkten Dateien. --[[Benutzer:Ph1959de|Greetz, Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 23:03, 9. Jul. 2013 (CEST)<br />
<br />
::: Manchmal hab ich eben so ne Phase irgendwie. Ist genauso wie bei der manuellen Korrektur aller Artikel direkt nach dem Import ;-) --[[Benutzer:Markusbloch|Markusbloch]] ([[Benutzer Diskussion:Markusbloch|Diskussion]]) 18:33, 10. Jul. 2013 (CEST)<br />
<br />
::::Oh ja, hab irgendwie nicht aufgepasst. Also gegen die Phasen hab ich nix :-) [[Benutzer:Soulman|Soulman]] ([[Benutzer Diskussion:Soulman|Diskussion]]) 20:24, 10. Jul. 2013 (CEST)<br />
<br />
== Abbildung von Bauteilen als Foto ==<br />
Hallo Peter,<br />
<br />
ich habe eine grundsätzliche Frage zur Darstellung von eigenen Fotos unter FHEMWiki. Ist es urheberrechtilich zulässig, eigene Fotos von Bauteilen darzustellen ?<br />
<br />
Gruß<br />
Lothar<br />
<br />
:Hallo Lothar, ich bin da zwar kein Experte, denke aber, dass genau diese Art von Bildern erlaubt ist. Was nicht geht, ist das Übernehmen von Bildern von z.B. einer Herstellerseite, oder das direkte einbinden von Bildern aus fremdem Webspace. Ich denke, diese Aussage ist auch durch die Beschreibung bei Wikipedia abgedeckt: http://de.wikipedia.org/wiki/Hilfe:Bildertutorial/2_Bildrechte.<br />
:<hr><br />
:--[[Benutzer:Ph1959de|Greetz, Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 13:30, 27. Aug. 2013 (CEST)<br />
<br />
== Urheberschaft der alten Einträge ==<br />
Hallo,<br />
<br />
ich habe festgestellt, dass ihr beim Neuaufsetzen des Wiki alle Urheberinformationen gelöscht habt. War das Absicht, oder ein Unfall ?<br />
<br />
KG<br />
<br />
pah<br />
<hr /><br />
:Hallo pah, muss man wohl eher als Unfall bezeichnen. Das Wiki war komplett weg (und das Backup war nicht wirklich als solches zu bezeichnen, sondern komplett unbrauchbar) und wurde aus dem Google-Cache wieder hergestellt. Dabei ist natürlich die ganze Änderungshistorie (und damit auch das was Du vermutlich als Urheberinformation bezeichnest?) verloren gegangen. <br />
:Aber das erinnert mich daran, dass ich bei einem der Administratoren dringend mal nachfragen wollte, wie es jetzt um die Sicherstellung der Backups steht.<br />
:Und noch ein Nachsatz: ''...dass ihr beim Neuaufsetzen des Wiki...'': daran war ich nicht wirklich aktiv beteiligt. Bin auch nur "ganz normaler" Wiki Benutzer ohne besondere Rechte. --[[Benutzer:Ph1959de|Greetz, Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 14:43, 10. Nov. 2013 (CET)<br />
<br />
== Links auf der Willkommensseite == <br />
Hallo Peter, <br />
<br />
ich bin - als Neuling - nicht ganz sicher, ob die Kommunikation mit Dir so gedacht ist, aber zumindest stand das so auf der Begrüßungsseite ;-)<br />
<br />
Ich habe festgestellt, dass in der Begrüßungsseite die Links auf die englische Version von wikipedia verweisen. Ich denke gerade für Neulinge wäre da die deutsche Version besser. (Z.B. http://de.wikipedia.org/wiki/Wikipedia:Tutorial)<br />
<br />
--[[Benutzer:Funfactor|Funfactor]] ([[Benutzer Diskussion:Funfactor|Diskussion]]) 12:31, 28. Nov. 2013 (CET)<br />
: ... ja, ist mir bekannt (trotzdem danke für die Rückmeldung). Kann ich aber leider nicht ändern, aber wenn ich mich recht erinnere, habe ich da beim "Betreiber" unseres Wiki schon mal nachgefragt aber bisher keine Antwort bekommen. Ich werde noch mal nachhaken. --[[Benutzer:Ph1959de|Greetz, Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 13:40, 28. Nov. 2013 (CET)<br />
:: Ok, ich habe mir das noch mal angeschaut. Ist für neue Benutzer wirklich ziemlich verwirrend, deshalb habe ich vorerst mal "hartcodiert" auf die Links auf die deutschen Wikipedia:-Hilfeseiten umgestellt. --[[Benutzer:Ph1959de|Greetz, Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 18:42, 28. Nov. 2013 (CET)<br />
<br />
== Verwendung der Sandbox == <br />
Hallo Peter,<br />
<br />
den Wiki "sauber" zu halten ist ja eine wichtige Sache und ich denke dafür ist die [[FhemWiki:Sandbox]] gedacht. <br />
Leider ist mir völlig unklar, wie ich diese in diesem Sinne verwenden soll. Gibt es hierzu eine Anleitung oder ein paar Hinweise?<br />
<br />
--[[Benutzer:Funfactor|Funfactor]] ([[Benutzer Diskussion:Funfactor|Diskussion]]) 17:01, 29. Nov. 2013 (CET)<br />
:Die Geschichte mit der Sandbox sollte man vielleicht nicht überbewerten. Was vermieden werden sollte ist <br />
:* das wilde Anlegen von neuen Artikeln mit zusätzlichem experimentieren mit den Seitennamen (das gibt dann immer gleich eine Weiterleitung und zusätzlichen Aufräumaufwand)<br />
:* jede noch so kleine Änderung separat abzuspeichern (Vorschau, Vorschau, Vorschau!); es gibt einige Leute, die neue Änderungen querlesen - denen macht man die Arbeit sonst unnötig schwer<br />
:* was mir sonst noch so eingefallen ist, habe ich schon auf die [[FHEMWiki:Über FHEMWiki]]-Seite geschrieben (darf natürlich ergänzt werden)<br />
:Experimentieren kann man zur Not auch im eigenen Namensraum (also in Deinem Fall <nowiki>[[Funfactor/Experiment...]]</nowiki>. Aber weitere Ideen sind jederzeit willkommen (bitte beachten: ich bin auch nur "ganz normaler User" hier). --[[Benutzer:Ph1959de|Greetz, Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 18:35, 29. Nov. 2013 (CET)<br />
<br />
== On-for-timer zurücksetzen ==<br />
Hi, es gibt da einen Artikel, den ich erstmals gerne mit einem Template Löschkandidat oder Qualtitästsicherung versehen würde: '''On-for-timer zurücksetzen'''<br />
Erbitte Zweitmeinung. Und ich weiss nicht, ob wir ggf passende Templates haben muss ich zugeben.<br />
<br />
[[Benutzer:Soulman|Soulman]] ([[Benutzer Diskussion:Soulman|Diskussion]]) 16:38, 27. Dez. 2013 (CET)<br />
:<hr><br />
:--[[Benutzer:Stephan|Stephan]] ([[Benutzer Diskussion:Stephan|Diskussion]]) 16:45, 27. Dez. 2013 (CET) ''(Stefans Beitrag auf die Diskussionsseite des Artikels ([[Diskussion:On-for-timer_zurücksetzen]]) verschoben [ph1959de])''<br />
<br />
:<hr><br />
:Ich (traue mich fast nicht :-), aber ich ...) verweise einfach mal auf die [[:Kategorie:Löschkandidaten]] und dortselbst auf den einleitenden Text.<br />
:--[[Benutzer:Ph1959de|Greetz, Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 17:54, 27. Dez. 2013 (CET)<br />
<br />
== autocreate ==<br />
du hast recht. in der default konfiguration von autocreate ist autosave an. aber es gibt devices wie z.b. OWServer/HUE und ich glaube sogar HM die gehen nicht über autocreate und da ist es auf jeden fall nötig von hand save zu sagen. [[Benutzer:Justme|Justme]] 19:56, 8. Jan. 2014 (CET)<br />
<br />
== 1-Wire - Kategorie vs. Artikel ==<br />
Ich finde es nicht richtig, die Übersichtsbeschreibung - z.B. was das 1-Wire System ist - aus der Kategorieseite herauszunehmen. Diese Trennung schafft Redundanz und verhindert sie nicht.<br />
<br />
Die Beschreibung ist eine unmittelbare semantische Eigenschaft der Kategorie, und kein untergeordneter Begriff.<br />
--[[Benutzer:Pahenning|Pahenning]] ([[Benutzer Diskussion:Pahenning|Diskussion]]) 19:05, 22. Feb. 2014 (UTC)<br />
:''Ich habe mir mal erlaubt, die Diskussion zu einem eigenen Abschnitt zu machen.''<br />
:Nachdem Du meine Änderung mittlerweile rückgängig gemacht hast, erübrigt sich ja eine weitere Diskussion. Konsequenterweise müsstest Du aber dann auch den Artikel [[1-Wire]] mitpflegen - Artikel und Kategorietext sind derzeit nur deshalb gleich, weil ich die Inhalte mit meiner Änderung auch konsolidiert hatte.<br />
:Damit die Diskussion über dieses Thema leichter auffindbar ist, kopiere ich sie noch in die [[Kategorie_Diskussion:1-Wire]], wo sie dann ggf. auch weitergeführt werden kann/sollte.<br />
<br />
::Werde ich machen<br />
::--[[Benutzer:Pahenning|Pahenning]] ([[Benutzer Diskussion:Pahenning|Diskussion]]) 15:38, 24. Mär. 2014 (UTC)<br />
<br />
== Disclaimer ==<br />
Es erscheinen immer mehr Schaltpläne hier im Wiki. Vorschlag: Einen allgemeinen Disclaimer des Inhaltes:<br />
<br />
- Nachbau aller Schaltpläne auf eigene Gefahr<br />
- Weder Betreiber noch Autoren übernehmen irgendeine Haftung für Inhalte und unmittelbare oder mittelbare Folgen<br />
- Hinweis auf die gesetzlichen Regelungen beim Anschluss an 230 V-Netze<br />
<br />
und diesen dann ausdrücklich unten neben "Datenschutz etc." referenzieren.<br />
<br />
LG<br />
<br />
pah<br />
--[[Benutzer:Pahenning|Pahenning]] ([[Benutzer Diskussion:Pahenning|Diskussion]]) 15:42, 24. Mär. 2014 (UTC)<br />
<hr><br />
:Wenn Du damit ein Template/eine Vorlage meinst, die auf relevanten Seiten gezielt eingebunden werden kann/muss, kann ich das gern mal in Angriff nehmen. Ich würde mich dann an dem Text orientieren, den Du auf [[1W-WPump]] eingefügt hast. Im Augenblick ließe sich dafür auch die Vorlage <nowiki>{{Randnotiz|...}}</nowiki> (siehe [[FHEMWiki:Über_FHEMWiki#Vorlagen]]) verwenden.<br />
:Für einen generellen Wiki-weiten Disclaimer würde ich Dich eher bitten, das selbst zu machen oder den Wiki-Admin [[Benutzer Diskussion:akw|Arno]] anzusprechen.<br />
:--[[Benutzer:Ph1959de|Greetz, Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 10:45, 25. Mär. 2014 (UTC)<br />
<br />
== Erweiterung der Vorlage "Infobox Hardware" ==<br />
hallo peter, <br />
ich habe deine nachricht eben erst gesehen. <br />
<br />
die idee war die infoboxen für modul und hardware ähnlicher zu machen. es ging mir nicht um den link zum modul sondern tatsächlich zum maintainer und da die möglichkeit aufs forums profil zu verlinken. so wie du es bei der neuen FLOORPLAN seite gemacht hast. zumindest bei 'meinen' modulen ist es zur zeit so das die info für die hardware und das fhem modul auf einer seite stehen. siehe: pca301 oder panstamp/swap. da gibt es entweder nur eine der beiden boxen oder die gleiche info taucht in beiden boxen auf. beides gefällt mir nicht wirklich.<br />
<br />
eigentlich wollte ich die komplette ersteller zeile optional haben. das habe ich aber mit der tabellen formatierung noch nicht hin bekommen. jetzt ist erst mal nur der inhalt optional.<br />
<br />
inzwischen habe ich noch "FHEMDevice" in "Modulname" geändert so wie es in der modul infobox auch ist. und die reihenfolge unter sonstiges geändert.<br />
<br />
ich kann das aber auch wieder zurück bauen.<br />
<br />
--[[Benutzer:Justme|Justme]] ([[Benutzer Diskussion:Justme|Diskussion]]) 13:51, 16. Mai 2014 (UTC)<br />
:Auf der [[Vorlage_Diskussion:Infobox_Hardware]]-Seite geht's weiter.<br />
<br />
== neue seiten ==<br />
wo wir gerade dabei sind :). ich glaube es wäre schon den auskommentierten abschnitt 'neue seiten' auf der einstiegsseite zu aktivieren. --[[Benutzer:Justme|Justme]] ([[Benutzer Diskussion:Justme|Diskussion]]) 14:01, 16. Mai 2014 (UTC)<br />
<br />
== neue Seiten ==<br />
Hallo Peter,<br />
<br />
Ich bin auch ein Neuling, und will meine Erfahrungen gerne anbieten an andere Benutzer. Zum Beispiel habe ich gerade der Modul Openweathermap in Betrieb genommen, und habe dabei einige Probleme gelöst. Ich hätte gern mehr Beispiele gehabt, und will die darum in eine Seite verwenden. Ist das erwünscht? Wenn ja, wie sollen neue Seiten über Devices eingeordnet werden, z.B. Openweathermap? (Deutsch ist nicht meine Muttersprache, so hoffentlich mache ich nicht zuviel Fehler).<br />
<br />
[[Benutzer:TrudiB|TrudiB]] ([[Benutzer Diskussion:TrudiB|Diskussion]]) 11:37, 23. Mai 2014 (UTC)<br />
<br />
<hr /><br />
:Hallo Trudi, es ist auf jeden Fall erwünscht, dass (funktionierende) Beispiele (möglichst komplett) vorgestellt werden.<br />
:Um eine neue Modulbeschreibung anzulegen, würde ich empfehlen, mal [[Vorlage:Infobox_Modul]] anzuschauen. Auf der [[FHEMWiki:Über_FHEMWiki]]-Seite findest Du auch in der Spalte "Ref" eine Liste der Seiten, die nach dem Schema angelegt oder überarbeitet wurden.<br />
:Im Zweifel einfach noch mal nachfragen. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 13:11, 23. Mai 2014 (UTC)<br />
<br />
== Admin ==<br />
Ph1959de erhält mit sofortiger Wirkung Administrator-Status im FHEMWiki. --[[Benutzer:Akw|Akw]] ([[Benutzer Diskussion:Akw|Diskussion]]) 10:56, 31. Mai 2014 (UTC)<br />
<br />
==ZHK Seiten Einzelmodule ==<br />
Hallo Peter,<br />
Ich würde den Meinungsaustausch zum Thema wiki Pages valves/stellmotor gerne zu einem gemeinsamen Abschluss bringen. Ein (Erneutes) Feedback von dir wäre dabei hilfreich. Ich möchte dich daher herzlich einladen meine<br />
Disk.Seite erneut zu besuchen und um Dein Feedback zu bereichern.<br />
LG florian<br />
<br />
==Kategorien für EnOcean ==<br />
Hallo Peter,<br />
für EnOcean gibt es 2 Kategorien: EnOcean und EnOcean_Components (anlog Homematic u.a.). In EnOcean ist der "EnOcean starter guide" und die Kategorie ist sinnvoll ins Wiki eingebunden. In der nichteingebundenen Kategorie "EnOcean_Components" befindet sich nur ein Sensor. Ist das so beabsichtigt? oder sollte das nicht angepasste werden.<br />
Danke, Christian<br />
<hr><br />
:Hallo Christian, nachdem die "EnOcean Components" Kategorie gerade erst "angelegt" wurde, würde ich erst mal abwarten. Eigentlich passt die Kategorie eher ins Konzept als das reine "EnOcean". Ich tendiere also eher dazu, alles auf "EnOcean Components" zu konsolidieren. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 17:45, 13. Jul. 2014 (UTC)<br />
::Hallo Peter, bin dabei, den EnOcean starter guide schrittweise zu überarbeiten. Ich würde dabei einige Aktoren- und Sensorenerläuterungen aus dem Starter guide entnehmen und als separate Artikel in "EnOcean components" aufnehmen; jedoch hätte ich gerne auch eine vernünftige Erreichbarkeit. Am einfachsten wäre es doch auch den starter guide zu verschieben. Dazu habe ich aber zuwenig Ahnung und würde das lieber einem Admin überlassen. --[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 18:09, 13. Jul. 2014 (UTC)<br />
::<hr><br />
:::Christian, wenn Du mit "Starter Guide verschieben" das Umhängen in Kategorie "EnOcean Components" meinst: das habe ich gerade gemacht (die Änderung besteht einfach nur aus dem Einsetzen des neuen Kategorienames im Artikel). Außerdem habe ich Kategorie "EnOcean" nach [[:Kategorie:EnOcean Components]] verschoben. Jetzt ist es einheitlich zu FS20, HomeMatic, etc.<br />
:::... und jetzt kannst Du loslegen mit den weiteren Änderungen - nur eine Bitte noch: Namensschema gut überlegen und neue Artikel möglichst erst speichern, wenn Du wirklich komplett damit zufrieden bist (Vorschaufunktion "großzügig verwenden"). Das macht es den (wenigen) Leuten, die alle Änderungen hier im Wiki "sichten" einfacher. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 05:15, 14. Jul. 2014 (UTC)<br />
:::: Vielen Dank für Deine schnelle Reaktion; werde versuchen Deine Bitten umzusetzen. Einen Wunsch habe ich natürlich noch ;-). Könnten wir EnOcean nicht auch auf der Hauptseite verlinken? Gruß, Christian--[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 09:27, 14. Jul. 2014 (UTC)<br />
::::<hr><br />
:::::Ich habe ohnehin noch einige Änderungen für die Hauptseite auf meiner Liste. Da werde ich dann EnOcean auch mit aufnehmen ... bis dahin gibts ja dann vielleicht auch noch mehr Artikel in der Kategorie. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 09:44, 14. Jul. 2014 (UTC)<br />
::::::zum Namensschema: Habe in der Kategorie den Hinweis zum Namensschema analog der anderen Hardwaresystme eingefügt. Mich stört eigentlich das Vorsetzen von EnOcean- ,würde es gerne weglassen, aber es scheint übliche Konvention hier zu sein. In der der Übersicht erscheint so aber alles unter "E". Hast Du dazu eine Meinung? Sorry, wenn ich so viel frage, aber bevor ich alles durcheinanderbringe...<br />
::::::<hr><br />
:::::::Kein Problem (zu fragen) - ist wirklich einfacher, als nachher alles wieder "geradebiegen" zu müssen.<br />
:::::::Nun, das Namensschema kannst ja Du im Augenblick noch festlegen. Bei den (z.B.) [[:Kategorie:FS20 Components|FS20 Komponenten]] ist es, wie Du schon bemerkt hast, so, dass alles unter einem Buchstaben im Index erscheint. Wie man das ändern kann, habe ich exemplarisch mal im [[FS20 WS1 Wechselschalter]] gezeigt.<br />
:::::::Hat alles so seine Vor- und Nachteile. Auch wenn Du nicht immer "EnOcean" davor schreibst, werden doch trotzdem viele Geräte mit den gleichen Buchstaben beginnen. Dann kann es ja auch gleich das EnOcean sein. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 11:27, 14. Jul. 2014 (UTC)<br />
:::: Hallo Peter! Danke für das kurzfristige Aufnehmen von EnOcean auf der Hauptseite. --[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 15:14, 17. Jul. 2014 (UTC)<br />
<br />
== Subtype Tabelle für EnOcean ... Wiki-Tipps? ==<br />
Hallo Peter, bräuchte noch einmal Wiki-Nachhilfe, da ich keine einfache Lösung gefunden habe. Vielleicht hast Du eine Idee:<br />
Ich würde gerne auf der Kategorie-Seite EnOcean Components die vorhandenen EnOcean-Wiki-Artikel noch einmal separat anhand des EnOcean-Attributs "subType" zuordnen und sichtbar machen.<br />
Quasi eine (lange) Tabelle der Art <br />
{| class="wikitable"<br />
|-<br />
! subType !! Wiki-Seite Geräte <br />
|-<br />
| switch || [[EnOcean-PTM-210-Taster]] <br />
|-<br />
| lightSensor.01 || [[EnOcean-FAH60-Au%C3%9Fen-Helligkeitssensor]]<br />
|-<br />
|}<br />
Manuell könnte ich das auf die Kategorienseite einpflegen -> fehleranfällig<br />
<br />
Unterkategorien -> nicht erwünscht und klickintensiv, aber weniger wartungsintensiv<br />
<br />
Unterseite zu EnOcean Components -> fehleranfällig und nicht auffällig<br />
<br />
Hast Du dazu eine Idee/Meinung? Danke --[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 22:41, 5. Aug. 2014 (UTC)<br />
<hr /><br />
:Ich würde (zumindest für's Erste) mal was Ähnliches machen wie die "News" Sektion auf der Hauptseite. Da wird Vorlage [[Vorlage:FHEMWiki_News]] eingebunden. In dieser Vorlage wird (manuell, aber wie ich finde recht übersichtlich) eine Tabelle unter zuhilfenahme der Vorlage [[Vorlage:News]] aufgebaut.<br />
:Wenn ich das richtig sehe, könntest Du sogar in (D)einer neuen Vorlage (nennen wir sie mal <nowiki>{{EnOceanSubTypeTable}}</nowiki>) einfach die News Vorlage so <nowiki>{{News|subType|Wiki-Seite}}</nowiki> "missbrauchen". Und die EnOceanSubTypeTable ließe sich dann nicht nur auf der Kategorie-Seite, sondern auch auf anderen Seiten bei Bedarf einfach so einbinden. Ansonsten halte ich mal die Augen offen und schaue, ob ich noch eine andere Lösung / einen besseren Ansatz finde.<br />
:P.S.: Ich finde, Du machst einen Superjob in der "EnOcean-Abteilung" hier im Wiki. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 06:16, 6. Aug. 2014 (UTC)<br />
:<hr /><br />
:: Ich probiere einmal Deinen Vorschlag umzusetzen. Hoffe es gelingt; löschen kann man immer noch....<br />
:: Nach Lösungen hatte ich auch gesucht, aber mit meinem Wiki-Halbwissen nichts einfaches entdecken können.<br />
::P.S.: Danke, zurück an Dich (auch wegen Nachhilfe). Bei EnOcean hilft 50watt auch mit. --[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 12:04, 6. Aug. 2014 (UTC)<br />
:: Hm, hatte es befürchtet, Vorlage und Text waren schnell erstellt, aber dann: <s>Deine "nowiki" Geschichte habe ich anscheinend falsch verstanden.</s> (Man/Ich sollte erst denken und dann schreiben) Als Box -wie die News auf der Hauptseite- einbinden habe ich auf die Schnelle nicht hinbekommen. Da sind soviele Codetags mit denen ich mich noch beschäftigen muss. Hoffe ich habe hier kein Chaos verursacht; ansonsten bitte löschen. --[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 13:31, 6. Aug. 2014 (UTC)<br />
::<hr /><br />
:::Sieht doch schon ganz gut aus. Für eine direkte Einbindung auf der Kategorieseite ist die Tabelle meiner Ansicht nach eh zu groß, daher finde ich den von Dir gewählen Ansatz mit der eigenen Seite ganz gut.<br />
:::In der Vorlage müsstest Du noch die Erläuterung zum "xx" überarbeiten (die führende Leerstelle macht das automatisch zu einem <nowiki><pre></nowiki>. Wenn Du die Hervorhebung willst, müsstest Du den Satz in <nowiki><code></code></nowiki> setzen.<br />
:::Das Layout der Tabelle kann man ja auch jederzeit noch ändern.<br />
:::Wenn Du noch Hilfe / Unterstützung brauchst, lass es mich wissen. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 14:36, 6. Aug. 2014 (UTC)<br />
:::<hr /><br />
::::Mit dem Ergebnis bin ich nicht wirklich zufrieden. Aber bevor ich daran weiterarbeite, muss ich mehr zur Wiki-Bearbeitung lernen. <br />
::::Danke für Deine bisherige Unterstützung und auch das Hilfsangebot. Werde sicherlich darauf zurückkommen. --[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 14:53, 6. Aug. 2014 (UTC)<br />
<br />
== Vorlage Link2Forum ==<br />
Hallo Peter, soll ich die Vorlage Link2Forum schon nutzen? Wenn ich es zeitlich morgen schaffe, wollte ich sowieso noch einige EnOcean Wiki-Seiten anfassen. Würde es dann schon mitändern. Oder kannst Du das automatisiert? Gruß, Christian --[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 19:32, 11. Aug. 2014 (UTC)<br />
<hr /><br />
:Hallo Christian, ich würde die Vorlage bisher nur für den sparsamen Einsatz (kannst sie gern in ein oder zwei Artikeln ausprobieren) empfehlen. Insbesondere innerhalb der "Infobox Modul" bin ich noch nicht ganz soweit - da tendiere ich eher noch dazu, das Link2Forum direkt aus der Infobox heraus einzusetzen. Das wäre dann nur eine Änderung, die hoffentlich alle bisherigen Einsatzstellen der Infobox erwischen würde (wobei, der Forenlink ist meines Wissens noch lange nicht überall drin; das habe ich ja erst kürzlich in die Infobox aufgenommen).<br />
:Automatisieren kann ich leider nichts; mir ist (zumindest noch) nicht bewusst, dass wir hier die Möglichkeit haben, irgendwelche Bots einzusetzen. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 21:32, 11. Aug. 2014 (UTC)<br />
:<hr /><br />
::Nutze bei EnOcean nur "Infobox Hardware" intensiv, dort brauche ich die Links nicht. Innerhalb der Wiki-Seiten verlinke ich häufiger auf einen bestimmeten Beitrag im Forum. Dort könnte ich schon umstellen auf <nowiki>{{Link2Forum|Topic=12345|Message=54321}}</nowiki>. Über die Vorlage "Infobox Modul" habe ich mir bei EnOcean noch keine Gedanken gemacht (Momentan grübel ich eher noch Einsatzbeispiele analog zur Vorlage EnOceanSubTypetable zusammenzufassen). --[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 22:04, 11. Aug. 2014 (UTC)<br />
::<hr /><br />
:::Wie gesagt, bitte noch "defensiv" benutzen, da ich noch keine umfangreicheren Tests gemacht habe. Daher bin ich aber natürlich auch an Rückmeldungen (die bitte dann auf der entsprechenden Diskussionsseite) zu der Vorlage interessiert (gibts Probleme, Änderungs-, Erweiterungswünsche und/oder -bedarf...?). <br />
:::Ansonsten: Infobox Modul - dafür gäbe es bei EnOcean wohl nur genau eine Einsatzmöglichkeit, wenn ich das richtig sehe. Das könntest Du anlegen, wenn Du die Vorlage mal einsetzen möchtests. Oder gibt es weitere Module, die EnOcean implementieren? --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 05:06, 12. Aug. 2014 (UTC)<br />
<br />
== Inhalt Hauptseite ==<br />
Hallo Peter, folgende Idee/Vorschläge zur Wiki-Hauptseite:<br />
Developers Corner: die dort direkt verlinkten Seiten sind -vorsichtig formuliert- nicht gerade die Aktuellsten; könnte man dort nicht besser gut gepflegte Seiten wie [[DevelopmentModuleIntro]] oder [[DevelopmentGuidelinesAV]] direkt verlinken? Außerdem ist das "Guter Startpunkt, sehr empfohlen!" unter "Wie fange ich an" meiner Meinung nach zu schwach. Ich denke das ist DIE Grundvoraussetzung für den ersten Überblick; hast Du auch unter [[Planung]] geschrieben. "Tipp der Woche" unter Ideen und Lösungen ist (war?) "nur" der "Tipp des Monats" und sollte dann auch so genannt werden. Wird anscheinend nur von soulman gepflegt. Wenn da nichts Aktuelles drin steht, wirkt das Wiki ziemlich tot. Andererseits habe ich persönlich auch keinen großen Antrieb dort etwas zu verfassen. Wer sucht dort wirklich?<br />
Ich weis, kaum aktiv und schon Rumnörgeln... (Nicht wundern: Ich habe mich heute aber schon wieder darüber geärgert, dass immer mehr Blogs Fhem-Artikel mit typischen Wiki-Inhalt veröffentlichen statt dies hier zu tuen, wo ein zentraler Anlaufpunkt sein sollte. Wenn diese Blog-Artikel auch noch umständlich oder fehlerbehaftet sind, hat man keine Einfluß auf Korrekturen und der Kram ist im Umlauf. Dagegen sollten wir arbeiten.)--[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 15:22, 14. Aug. 2014 (UTC)<br />
Auch <nowiki>[[Links|wichtige Fhem Links]]</nowiki> sind nicht gerade top-aktuell. Für wichtig halte ich die schon gar nicht. So, Frust weg ;-). Aber dennoch halte ich meine Anmerkungen für diskussionswürdig. Ich möchte auf der Hauptseite nicht eigenständig ändern, da mir nicht bekannt ist, ob das für Normal-Anwender erlaubt ist. --[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 18:31, 14. Aug. 2014 (UTC)<br />
<hr /><br />
:Christian, auch die Hauptseite kann von jedem bearbeitet werden - aber vorherige Diskussion ist da vielleicht nicht falsch. Ich habe daher Deine Anregungen mal auf die [[Diskussion:Hauptseite#Vorschläge zur Überarbeitung der Hauptseite|Diskussionsseite]] übertragen. Lass uns die Sache da weiterführen ... vielleicht beteiligt sich ja noch jemand... --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 05:41, 15. Aug. 2014 (UTC)<br />
<hr /><br />
::Ok, werde auch versuchen meine Anmerkungen passender zu platzieren. Hoffe nur, dass das dann nicht komplett untergeht. Habe aber teilweise keine Ahnung, wo das hin soll - bin noch zu Wiki-unerfahren. Aktuell bspw. [[Spezial:Gewünschte_Seiten]] enthält nach meiner Meinung eine Vielzahl von "Leichen", die weg können (FR und alles was damit zusammenhängt; Links durch STELLMOTOR). Ich habe da keine Ahnung, wo ich anfangen soll/darf. Ich würde beispielsweise bei [[STELLMOTOR]] die "toten" Lemmas/Seiten herausnehmen. Der Ersteller von STELLMOTOR könnte sie wieder reinnehmen, wenn er tatsächlich daran arbeiten will; traue mich aber nicht.<br />
::'' ... vielleicht beteiligt sich ja noch jemand...'' Hoffnung stirbt zuletzt.... ;-) --[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 08:15, 15. Aug. 2014 (UTC)<br />
::<hr /><br />
:::* Ist schon ok, das hier zu plazieren ... aber außer mir findet das hier keiner, daher der "Umzug"<br />
:::* "Gewünschte Seiten" ... enthält alle <nowiki>[[Lemma...]]</nowiki> Stellen, die auf nicht existierende Seiten verweisen. Wenn's so extrem vorkommt wie in Deinem genannten Beispiel, einfach den entsprechenden Benutzer anschreiben. Wirklich stören tut's aber auch nicht - du glaubst gar nicht, wie '''wenige''' Benutzer die "Gewünschte Seiten" Seite jemals gesehen haben, geschweige denn regelmäßig benutzen.<br />
:::* Anfangen darfst Du sicherlich da, wo ein Eintrag in die "Gewünschten Seiten" offensichtlich versehentlich entstanden ist, z.B. weil jemand sich schlicht vertippt hat; wenn jemand schon mal eine Liste erstellt hat, welche Seiten noch gemacht werden müssen (wie ich z.B. auf meiner Benutzerseite :-) ), würde ich das erst mal ganz gelassen so stehen lassen.<br />
:::* Und immer im Hinterkopf behalten, dass viele Benutzer hier im Wiki nur ganz gelegentlich unterwegs sind um vielleicht den einen oder anderen Tippfehler zu korrigieren - und das war's dann auch schon. Die meisten Benutzer bekommen nicht mal die Begrüßungshinweise mit ... und/oder lesen sie nicht, halten sich nicht dran, verstehen sie nicht... <br />
:::Bottom line: nicht zu viel erwarten, Dich selbst nicht "aufreiben", aber fleißig weitermachen. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 08:35, 15. Aug. 2014 (UTC)<br />
:::<hr /><br />
::::Bottom line: keine Sorge, reibe mich schon nicht auf. ''weiter'''machen''''': ich würde es grds. einfach machen, will aber niemanden vergraulen und den Admins unnötig Arbeit machen; hätte in STELLMOTOR die "toten" Lemmas in normale Aufzählung verwandelt, FR gelöscht (Leiche des Absturzes), kleinere Änderungen an Hauptseite vorgenommen oder... Rückgängig kann man (Admin/Ersteller) es immer noch machen; eigentlich ist es mir zu viel Diskussion, die mMn keinen weiterbringt, (wie lange soll man auf Entgegnungen warten?)..... <br />
::::Meine Bottom line: Keine Sorge Umstrukturierungen (Kategorien) o.ä. würde ich nicht undiskutiert vornehmen<br />
:::::Nur teilweise Offtoic: Peter, wenn Du meine Verlinkung in der Homematic-Kategorie nicht OK findest, mach es einfach rückgängig: Für mich ist das in Ordnung, habe damit grds. kein Problem; gilt immer. Gruß, Christian (Habe da eh noch einen Tippfehler eingebaut!)<br />
<br />
== WikiArtikel Pflege ==<br />
Hallo Peter,<br />
die "Verschieben" Option von Artikeln kannte ich in der Tat noch nicht. Danke für den Hinweis..<br />
:Kein Problem & gern geschehen. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 06:45, 29. Aug. 2014 (UTC)<br />
<br />
Du kannst meine Wiki-Artikel gerne korrigieren und vereinheitlichen. Wenn du mir zusätzlich noch verrätst worauf du achtest, kann ich versuchen diese Dinge gleich selbst zu beachten.<br />
:<hr /><br />
:Lässt sich so generell nicht beantworten; manchmal nur Kleinigkeiten. Beispiele:<br />
:* Artikel in Ich-Form schreibe ich normalerweise auf neutrale Ausdrucksweise um (später weiß ohnehin niemand mehr, wer der "Ich" war); das ist verbindlicher und mMn für technische Beschreibungen angemessener.<br />
:* Querverweise (Links auf andere Artikel) einfügen - auch IN anderen Artikeln wo sinnvoll Verweise auf Deinen neuen Artikel setzen (sonst entstehen "Waisen" und "Sackgassen"); ob es schon Links auf Deine Seite gibt, kannst Du über das "Links auf diese Seite" (links in der Navigationsleiste) herausfinden.<br />
:* Rechtschreibung / Grammatik / Formulierung... ist eigentlich immer dabei<br />
:* usw.<br />
:-- [[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 06:45, 29. Aug. 2014 (UTC) <hr /><br />
<br />
Nochetwas: ich vermisse eine Kategorie für selbst gebaute Schaltungen. Ich bin mir immer unsicher wo ich meine Artikel einstellen soll. ZurZeit sind 1wire-Schaltungen bei 1wire. Aber für Panstamps und Arduino basierte Schaltungen habe ich nichts gefunden. Kannst du helfen?<br />
:<hr /><br />
:Es bei Hardware die Unterkategorie "Other Components", da passt sowas derzeit immer rein. Sofern mal eine "kritische Masse" erreicht ist (also mehr als nur ein oder zwei Artikel), kann man ja überlegen, mal eine Unterkategorie "Eigenentwicklungen" (oder ähnlich) bei Hardware einzufügen.<br />
:Für Arduino gibt es schon eine Kategorie (Unterkategorie von Hardware), für Panstamp könnte man sowas auch einrichten - wenn es vom Konzept her passt (dazu verstehe ich von der Arduino/Panstamp...-Welt zu wenig). Es sollten halt immer ähnliche Dinge in einer Kategorie/Unterkategorie... zusammengefasst sein.<br />
:-- [[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 06:45, 29. Aug. 2014 (UTC) <hr /><br />
::Misch mich mal ein: Fände Kategorie Eigenentwicklungen o.ä. nicht schlecht, da bestimmte Zielgruppe angesprochen wird. Ich lasse bspw. meine Finger davon. Würde den Artikel trotzdem zusätzlich noch in Other Components aufnehmen oder wenn es 1-wire ist auf jeden Fall in 1-Wire. Bei Homematic haben wir doch Unterkategorie HomeBrew, analog auch bei anderen anlegen!? Wir sollten etwas angehen....--[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 08:18, 29. Aug. 2014 (UTC) <hr /><br />
:::Ok, dann machen wir doch einfach einen Auftrag an Tobias daraus: mal sammeln, welche Artikel schon vorliegen (oder er in Planung hat) für eine solche Kategorie, dann schauen wir kurz drüber und beschließen, welche neuen Unterkategorien und wie einsortiert...<br />
:::@Tobias: ich stell das mal so auf Deine Diskussionsseite --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 08:48, 29. Aug. 2014 (UTC) <hr /><br />
<br />
GRuss<br />
Tobias<br />
<br />
== Verschieben von Wiki-Seiten ohne Weiterleitung ==<br />
Hallo Peter,<br />
könntest Du bitte <br />
* [[Z-Wave-EVR_ST814-Temperatur-_und_Feuchtesensor]] auf Z-Wave-EVR_ST81'''4'''-Temperatur-_und_Feuchtesensor ohne Weiterleitung verschieben. Der Ersteller [[Benutzer_Diskussion:Morgennebel]] ist anscheinend nicht mehr aktiv; reagiert auch nicht auf PM.<br />
: -> Erledigt --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 12:31, 27. Dez. 2014 (UTC)<br />
* hier [[Diskussion:WS3600]] mal reinschauen. Dort hätte ich auch gerne eine Wiki Seite verschoben. Keine Ahnung, ob Dir das aufgefallen ist.<br />
: -> Ja, hatte ich gesehen ... und jetzt auch erledigt --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 12:31, 27. Dez. 2014 (UTC)<br />
* WebIO_Digital auf WEBIO_12DIGITAL verschieben --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 17:36, 7. Dez. 2015 (CET)<br />
: -> Erledigt --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 17:52, 7. Dez. 2015 (CET)<br />
<br />
== Nutzung von <nowiki><pre style="width:500px;"></nowiki> statt <nowiki><code></nowiki> ==<br />
Hallo Peter,<BR><br />
Du ersetzt teilweise in den Wikiseiten die Formatierung <nowiki><code></nowiki> durch <nowiki><pre style="width:500px;"></nowiki>. Hat das einen bestimmten Grund? Das führt nämlich dazu, dass der Text in einigen Fällen über den Boxrand geht. Mir ist nicht klar, wie ich das umsetzen/anwenden soll. Danke. --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 07:28, 5. Feb. 2015 (UTC)<br />
<br />
:Hallo Christian, das mache ich (dachte ich) eigentlich nur, wenn die Zeilen in dem pre-Bereich durchweg relativ kurz sind. Was ich eigentlich häufiger mache, ist, pre durch code Tags zu ersetzen, gerade weil bei code ein automatischer Zeilenumbruch stattfindet. Insbesondere Einzeiler, die per nowiki, pre oder Leerzeichen in Spalte1 dann als Box formatiert werden ersetze ich gern duch <nowiki>:<code>define, attr, ...</code></nowiki>, weil's meiner Ansicht nach einfach flüssiger lesbar ist Gesamtkontext.<br />
:Verhalte ich mich am Ende anders, als ich es in [[FHEMWiki:Über_FHEMWiki#Gewünschtes Verhalten / "Do and Don't"|diesem Abschnitt]] beschrieben habe? --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 07:45, 5. Feb. 2015 (UTC)<br />
::Werde es beobachten. Vielleicht bin ich auch nur übermüdet/unkonzentriert: Habe nämlich gerade gesehen, dass ich [[HM-OU-CFM-Pl_MP3_Funk-Gong_mit_Signalleuchte|hier]] -was letztliche Anstoß zum Schreiben war- falsch geschaut habe. Die anderen Beispiele, die ich in Erinnerung habe, müsste ich mir noch einmal raussuchen. Vielleicht habe ich da auch schief geschaut. Also bitte erst einmal vergessen. Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 08:18, 5. Feb. 2015 (UTC) PS: Schaust Du bitte mit auf die diversen Unterkategorien zu "Hardware Typen" die ich angelegt habe und greifst bitte ggfs. korrigiernd ein.<br />
:::Die neuen Unterkategorien habe ich schon zur Kenntnis genommen. Nachdem Du die letzten Änderungen an der Kategoriestruktur gemacht hast, kennst Du Dich da mittlerweile ja mindestens so gut aus wie ich. Das Einzige, was mir aufgefallen ist: auf den Kategorieseiten könnten noch ein paar kurze Worte zur Beschreibung der Kategorie eingefügt werden... aber das eilt nicht. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 08:26, 5. Feb. 2015 (UTC)<br />
<br />
== PGM3 - Entwicklungsstand ==<br />
Hallo Peter!<br />
Habe heute bei PGM3 und PGM5 recht selbstsicher einen Hinweis "seit längerem nicht aktiv weiterentwickelt" hinzugefügt. Im Forum habe ich nichts gefunden und auch zu Google-Groups-Zeiten kann ich mich nicht wirklich erinnern. Bei der Nachkontrolle habe ich dann mit Erschrecken festgestellt, dass Du PGM3 auf der ToDo-Liste stehen hast und das plötzlich Martin Hass' PGM3 Screenshot-Seiten nach einer gefühlten Ewigkeit wieder erreichbar sind. Irre ich mich und PGM3 ist doch noch ein (aktuelles) Thema? Gruß, [[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 21:09, 18. Feb. 2015 (CET)<br />
<hr /><br />
:Christian, PGM3 auf meiner Todo-Liste ... eine Jugendsünde :-) ... fliegt gleich runter, weil bestimmt zwei Jahre alt und nie was gemacht. Die Updates auf Martin's Seiten solltest Du natürlich beobachten, aber auf mich musst Du keine Rücksicht nehmen. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 06:55, 19. Feb. 2015 (CET)<br />
<br />
== Begrüßungsseite Link: Was Wikipedia nicht ist ==<br />
Hallo Peter,<br />
ich hoffe, dass ich das hier jetzt richtig mache :-). Beim aufmerksamen Lesen der Begrüßungseite bin ich gleich auf einen Link: Was_Wikipedia_nicht_ist getappst. <br />
<br />
Den kennt Wikipedia nicht...<br />
Gruß Otto<br />
<hr /><br />
:Hallo Otto, danke für's aufmerksame Lesen :-)<br />
:habe den (und einen weiteren) fehlerhaften Link korrigiert. Da die Vorlage mit "subst:" eingebunden wird, profitieren leider nur die Neuankömmlinge ab jetzt davon.<br />
:Grund für das Problem ist wohl die Art, wie das Fhem-Wiki aufgesetzt wurde (bin mir aber jetzt nicht sicher, ob sich da in dieser Hinsicht nochmal was geändert hat, oder ob ich die beiden Links schlicht vergessen habe ... andere Links, wie z.B. den auf das Tutorial, habe ich vor längerer Zeit schon mal umgestellt). --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 06:57, 2. Apr. 2015 (CEST)<br />
<br />
== Pflege von [[Spezial:Gewünschte_Seiten]] ==<br />
Hallo Peter,<br />
bin gerade im Aufräumfieber und über die gewünschten Seiten gestolpert. Einige Dinge habe ich eigenständig geklärt, aber nun benötige ich Deine Hilfe. Insbesondere das zum Aussterben verurteilte FS20 taucht dort sehr umfangreich auf. Die abnehmende Bedeutung spricht aus meiner Sicht dafür, diese "gewünschten Seiten" dort herauszunehmen. Denke es gibt wichtigere Baustellen und dringendere notwendige Seiten. Zudem sind das teilweise Karteileichen, die seit Urzeiten dort geführt werden. Aus meiner Sicht schreckt das, neben den Wiki-Softwareproblemen, Interessenten von der Mitarbeit ab. Darum bitte ich Dich um Deine Meinung als FS20-User, bevor ich das weiter anleiere. Andere Punkte, die ich nicht '''''<- meinst Du wirklich *nicht*?''''' ''<-ergänze: allein/eigenständig!'' klären wollte, betreffen bspw. die gewünschte Seite "Hilfe:Seite bearbeiten", "FHEMWiki:Stubs entfernen". Schöne Feiertage, [[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]])<br />
:Hallo Christian, nur als schnelle Antwort (zu viele Baustellen gerade):<br />
:* Gewünschte Seiten, speziell FS20: das was Mediawiki in die "gewünschten Seiten" einsortiert, sind die intra-Wiki Links, die nicht existieren also <nowiki>[[Existiert nicht]]</nowiki> würde da z.B. auftauchen - gewünschte Seiten im eigentlichen Sinn sind das nur dann, wenn der Verlinkung absichtlich gemacht wurde ... wie z.B. bei den vielen FS20 Seiten. Die sind nämlich häufig bei mir (hast Du doch bestimmt gesehen ;-) ), weil ich noch zu diversen FS20 Geräten was schreiben möchte und sollte. Leider (die vielen Baustellen, siehe oben) komme ich derzeit und schon lange nicht dazu. Ansonsten habe ich da immer mal wieder reingeschaut, um falsch geschriebene Links aufzuspüren und zu bereinigen. Aber vielleicht sollten wir den Link darauf einfach von der Hauptseite entfernen und z.B. auf die/eine Interna Seite holen. Vielleicht als Ersatz / Nachfolger der Randnotiz von der Über FHEMWiki Seite, auf der ich die offenen Baustellen mal aufgelistet hatte (und schon länger nicht mehr gepflegt).<br />
::* Natürlich habe ich gesehen, dass FS20 (auch) von Dir kommt; darum habe ich mich auch mit Wiki-Eingriffen zurückgehalten, sonst.. ;-). Dein Alternativvorschlag ist gut. Die offenen Baustellen auf der Über FHEMWiki Seite: Zu den Kategorien wollte ich -auch seit langem- eine bessere "Anweisung" an die anderen Wikibearbeiter schreiben und dann abschließen. Und mich dann wieder verstärkt "meinen" eigentlichen Themen ZWave/EnO widmen.<br />
:* Die Stubs-Seite / Kategorie / Vorlage kommt von Arno (akw), ist aber schon lange nicht mehr gepflegt worden und wird wohl auch nicht mehr aktiv genutzt<br />
:* '''Hilfe:Seite bearbeiten''' fällt wohl in die Kategorie "Wiki-Softwareprobleme" (Du meinst den Link "Bearbeitungshilfe" neben den {{Taste|Speichern}} {{Taste|Vorschau zeigen}} Buttons?) und würde ich erst wieder aktiv in Angriff nehmen, wenn Arno die offenen Probleme komplett abgearbeitet hat :-(<br />
::* Ja, werde mal Arno bitten.... [[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]])<br />
:Ebenfalls schöne Feiertage, --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 15:21, 3. Apr. 2015 (CEST)<br />
<br />
== Vorlagen: Link2Forum,.. ==<br />
Hallo Peter,<br />
ist die Notwendigkeit der Vorlagen "Link2Forum",.. nur darin begründet, dass man dann einfacher Anpassungen bei Änderungen der zugrundeliegenden Links vornehmen kann? Ich stelle nämlich immer wieder fest, dass außer uns beiden, die sowieso von (fast) keinem Wiki-Bearbeiter genutzt werden. Der Umstellungsaufwand im Änderungsfalle wird so vermutlich nicht sehr reduziert. Kann man dieses Problem der Linkänderungen nicht einfacher mit einem Bot lösen, der das Wiki mit Suchen/Ersetzen durchgeht? Dann hättest Du auch nicht den Pflegeaufwand für die Vorlagen. Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 11:16, 13. Aug. 2015 (CEST)<br />
<hr><br />
:Hallo Christian, leider habe ich keine große Hoffnung, dass wir hier einmal die Chance haben werden, '''bot'''s einzusetzen und kenne mich damit auch (zumindest noch) nicht aus (Ausreden? Vielleicht). <br />
:Interessant: ich habe gerade die DocLink Vorlage mal soweit fertig, dass man zumindest die ELV Links überarbeiten / generalisieren kann. <br />
:Unterm Strich: ich werde die Vorlagen weiter pflegen und benutzen, wer sie benutzen mag soll's tun, zwingen werd ich niemanden. Wir haben halt immer noch sehr wenige Wiki-erfahrene Benutzer hier, was man auch an anderen Stellen merkt. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 11:50, 13. Aug. 2015 (CEST)<br />
<hr><br />
:: Hallo Peter, will Dich auch nicht abhalten ;-) , sondern entlasten. Weil ich die DocLink-Vorlage gesehen habe, kam ich auf das Thema. Ich werde das bot-Thema mal auf meinen "Wunschzettel" aufnehmen und aktiv verfolgen. Schauen wir einmal, was sich ergibt. Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 12:04, 13. Aug. 2015 (CEST)<br />
::<hr><br />
:::Kein Problem - ich denke es gibt bei beiden Vorgehensweisen Vor- und Nachteile. Meine Skepsis beruht darauf, dass die Bots ja wohl auf dem Wiki-Server laufen und ich kaum Hoffnung habe, da mehr Zugriff zu bekommen. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 12:16, 13. Aug. 2015 (CEST)<br />
== Codierung ==<br />
Hallo Peter,<br />
<br />
Du schreibst auf meiner Benutzerseite<br />
HTML-Tags bitte nur verwenden, wenn es nicht anders geht<br />
im Artikel <br />
[[EnOcean-D-452-FU-EP-JR-Aktor-Beschattungselemente-Rollladen]]<br />
hast Du die Codierung mittels Leerzeichen durch <nowiki><code></Code></nowiki> ersetzt. Die Leerzeichen waren aber in [[http://www.fhemwiki.de/wiki/FHEMWiki:%C3%9Cber_FHEMWiki#Gewünschtes Verhalten / "Do and Don't"]] explizit erlaubt.<br />
Einen anderen Artikel von mir hast Du nicht korrigert.<br />
Wo liegt mein Fehler? Ich wollte der Gemeinschaft gerne etwas zurück geben - vor allem für die Arbeit die Christian mit mir gehabt hat.<br />
<br />
--[[Benutzer:BenMarloe|BenMarloe]] ([[Benutzer Diskussion:BenMarloe|Diskussion]]) 00:25, 21. Aug. 2015 (CEST)<br />
<hr /><br />
:Hallo Ben(Marloe), das ist schnell erklärt:<br />
:HTML-Tags nur verwenden - bezieht sich, wenn ich das jemandem schreibe, meist auf exzessive <nowiki><br></nowiki>-Tags. Da kann (sollte) im Wiki meistens einfach eine Leerzeile oder ein Zeilenumbruch verwendet werden (einfach die "Vorschau-funktion" verwenden, um zu kontrollieren, ob's "richtig" aussieht). Außerdem sieht der Wiki-Quelltext damit schon dem formatierten Ergebnis ähnlicher und ist einfacher lesbar. Nur bei manchen Vorlagen oder z.B. in Aufzählungen ist ein Zeilenumbruch "kontraproduktiv" und dann ist ein br nötig.<br />
:Leerzeichen vs. code ... am besten veranschaulicht:<br />
Leerzeichen in Position 1<br />
:... und der weitere Text. Im Vergleich dazu:<br />
::<code>ein (eingerückter) Einzeiler, der als Code formatiert werden soll</code><br />
:oder noch mal anders:<br />
Leerzeichen und ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel Text<br />
::<code>ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel Text, der als Code formatiert werden soll</code><br />
:Ich hoffe, der Unterschied wird damit klar: der Text wird meiner Ansicht nach kompakter, die Hervorhebung ist aber trotzdem da. Und: bei Mehrzeilern sieht das schon wieder ganz anders aus. Da ist aber meistens dann die Verwendung von <nowiki><pre></pre></nowiki> die bessere Wahl, weil damit (im Wiki Source Text) besser verdeutlicht wird, dass die Formatierung absichtlich so gewählt ist.<br />
:Zum Thema ''Einen anderen Artikel von mir hast Du nicht korrigert'' ... ich kann nicht überall sein :-) ... nein, ohne Scherz, ich mache das hier auch "nur nebenbei", manches ist Geschmackssache, manches übersehe ich, manches ist "zu unwichtig", etc.<br />
:Und ''Wo liegt mein Fehler?'' - nirgends; einfach fleissig weiter mitmachen.<br />
:--[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 07:14, 21. Aug. 2015 (CEST)<br />
<br />
== Neue Seite oder Ergänzung [erledigt]==<br />
Mit Eurer Hilfe geht jetzt der EnOcean-FUD61NPN-Funk-Universal-Dimmaktor unidirektional bei mir.<br />
Ich würde eine Anleitung erstellen, bin mir aber nicht sicher, ob ich das lieber als <br />
# Ergänzung auf die existente Seite oder <br />
# Kommentare auf die existente Seite mache oder<br />
# eine neue Seite aufmache und wie die dann heißen soll.<br />
Ich bitte um Vorschläge/Richtlinien<br><br />
--[[Benutzer:BenMarloe|BenMarloe]] ([[Benutzer Diskussion:BenMarloe|Diskussion]]) 16:48, 11. Sep. 2015 (CEST)<br />
<hr /><br />
:Ich denke, das kommt auf Art und Umfang der Änderungen/Ergänzungen an. Wenn das ein einzelner Abschnitt mit den Unterschieden ist, passt das sicherlich gut in [[EnOcean-FUD61NPN-Funk-Universal-Dimmaktor]], wären es Kommentare, überall auf der Seite verstreut, würde ich eine eigene Seite bevorzugen (dann bitte an den Seitennamen " (unidirektional)" anhängen). Die Kommentarseite ist für sowas eher nicht geeignet. <br />
:Wenn's eine neue Seite wird, dann bitte auf der Seite des bidirektionalen Aktors verlinken. In jedem Fall die Bemerkung über *direktional... anpassen. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 16:10, 12. Sep. 2015 (CEST)<br />
<hr><br />
::so wird's gemacht. --[[Benutzer:BenMarloe|BenMarloe]] ([[Benutzer Diskussion:BenMarloe|Diskussion]]) 22:02, 18. Sep. 2015 (CEST)<br />
==Extension SyntaxHighlight_GeSHi==<br />
Ich hätte die [https://www.mediawiki.org/wiki/Extension:SyntaxHighlight_GeSHi Extension] gerne, um Code besser lesbar darzustellen. Sollte eigentlich ab MediaWiki Version 1.21 dabei sein, aber eventuell ist sie nicht aktiviert? Wen muss ich dazu anbetteln? ;)<br />
--[[Benutzer:Drhirn|Drhirn]] ([[Benutzer Diskussion:Drhirn|Diskussion]]) 15:58, 1. Okt. 2015 (CEST)<br />
:[[Benutzer Diskussion:Akw#Wiki-Erweiterung Syntaxhighlight|Hier]] mal nachhaken? --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 18:57, 1. Okt. 2015 (CEST)<br />
::Hat, wie ich gerade sehe, schon jemand anderer übernommen :) --[[Benutzer:Drhirn|Drhirn]] ([[Benutzer Diskussion:Drhirn|Diskussion]]) 10:26, 5. Okt. 2015 (CEST)<br />
::<hr /><br />
:::Nicht verzagen ... jede Stimme zählt :-) --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 16:36, 5. Okt. 2015 (CEST)<br />
<br />
== Vorlage "Hinweis" ==<br />
Hallo Peter,<br />
hast Du Dir die neue Vorlage "Hinweis" einmal angeschaut? Gibt es Vorbehalte von Deiner Seite oder kann ich die problemlos nutzen. Habe die Vorlage testweise mal in 2 Seiten eingebaut und finde sie in gewissen Situationen grds. nicht schlecht.<br />
Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 22:45, 6. Okt. 2015 (CEST)<br />
<hr /><br />
:Hallo Christian, ja, die Vorlage habe ich gesehen und mal kurz reingeschaut. Gibts von meiner Seite keine Einwände (den Kommentar "Randnotiz ... leider nur Teil der Bildschirmbreite..." finde ich etwas befremdlich, da der Name der Vorlage ja genau das verspricht, aber das tut ja der eigentlichen Sache keinen Abbruch) - ich denke, es gibt für die Vorlage sinnvolle Einsatzgebiete, ganz nach gewünschtem Effekt / Erscheinungsbild. Es unterbricht halt den Lesefluss deutlich stärker als die Randnotiz, aber wenn das gewünscht ist, dann passts ja. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 10:14, 7. Okt. 2015 (CEST)<br />
<hr /><br />
::Sollten wir die Vorlage dann nicht auch [[FHEMWiki:%C3%9Cber_FHEMWiki#Vorlagen|hier]] aufnehmen? Falls ja, Du oder ich? Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 10:30, 7. Okt. 2015 (CEST)<br />
<hr/><br />
::Naja, "befremdlich" ;). Ich wollte nur erklären, warum ich extra eine neue Vorlage gemacht habe. Ich hätte natürlich auch die Vorlage "Randnotiz" um eine Option für die Breitenauswahl erweitern können. Grundsätzlich hätte die Randnotiz nämlich eh getan, was ich wollte. Aber das wäre etwas viel Arbeit geworden. --[[Benutzer:Drhirn|Drhirn]] ([[Benutzer Diskussion:Drhirn|Diskussion]]) 11:25, 23. Okt. 2015 (CEST)<br />
<br />
== Änderung von Gliederungspunkten in Artikeln und wiki-interne Links ==<br />
Hallo Peter,<br />
hier [[Konfiguration]] wurde gestern ein Gliederungspunkt umbenannt. Gibt es/ Kennst Du eine einfache Möglichkeit herauszufinden, welche wiki-internen Link jetzt nicht mehr funktionieren? Bei den Spezial-Seiten finde ich dazu nichts und Google hilft mir auch nicht. Die Wiki-interne Suche ist dabei auch nicht optimal. Bisher vermeide ich aus diesem Grund auch eine Umbenennung von Gliederungspunkt. Danke und Gruß --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 09:48, 26. Okt. 2015 (CET)<br />
<hr /><br />
:Hallo Christian,<br />
:ich hatte die Änderung zwar kurz angeschaut, aber gar nicht an diese (möglichen) Auswirkungen gedacht. Habe (auf die Schnelle) auch nur wenig zu diesem Thema gefunden (ausser vielleicht diese Seite in [https://en.wikipedia.org/wiki/Wikipedia:Database_reports/Broken_section_anchors/Configuration Wikipedia]).<br />
:Vermutlich (hoffentlich?) werden wir aber nicht allzu häufig von dieser Problematik betroffen sein, für diesen aktuellen Fall sehe ich folgende mögliche Vorgehensweisen:<br />
:* Änderung der Überschrift zurücknehmen, dafür diesen Abschnitt eine Gliederungsebene tiefer (passt dann ohnehin besser in die Seitenstruktur)<br />
:* Verwendung von <nowiki>{{Anker|Ankertext}}</nowiki> mit der alten Überschrift, um das als zusätzlichen Anker einzufügen<br />
:--[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 11:25, 26. Okt. 2015 (CET)<br />
<hr /><br />
::Hallo Peter, <br />
::habe es mit 1. Ansatz umgesetzt, da mir der 2. Weg zu umständlich und (später) fehleranfällig erscheint. Obwohl ich irgendwann mal gelernt habe, dass es niemals nur einen Gliederungs-Unterpunkt gibt (halte ich hier aber auch nicht immer ein ;-) )<br />
::Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 13:33, 26. Okt. 2015 (CET)<br />
<br />
== Neuen Artikel verschieben/umbenenen ==<br />
Hallo Peter, <br />
<br />
ich habe meinen ersten Artikel erstellt und würde gerne den nächsten Schritt machen. Wohin muß ich verschieben und wie gehts dann weiter. (Wiki Anfänger)<br />
<br />
Gruß [[Benutzer:Eisix|Eisix]] ([[Benutzer Diskussion:Eisix|Diskussion]]) 16:14, 25. Jan. 2016 (CET)<br />
<hr /><br />
:Hallo Eisix,<br />
:# es wäre nicht nötig gewesen, den Artikel erst auf Deiner Benutzerseite zu erstellen; so viel ist hier nicht los, dass bei einem neuen Artikel gleich Konflikte entstehen; ich glaube, nur "verschieben" geht in diesem Fall nicht so gut, daher würde ich vorschlagen:<br />
:# Du gehst auf deiner Benutzerseite auf "Bearbeiten" und<br />
:# fügst <nowiki>[[EnOcean MwC-32...]]</nowiki> (die Details für die Namensfindung stehen auf der Kategorieseite [[:Kategorie:EnOcean Components]] oben rechts (ich glaube, "Deinen" Namen musst Du da noch etwas nachbearbeiten; im Zweifel [[Benutzer Diskussion:Krikan|Krikan]] fragen)) ein<br />
:# Klickst auf {{Taste|Vorschau zeigen}}; daraufhin bekommst Du Deinen gewählten Seitentitel in rot in der Vorschau angezeigt; jetzt<br />
:# öffnest Du diese "rote Seite" in einem neuen Browser-Tab<br />
:# kopierst bzw. verschiebst den Quelltext Deiner Seite (ohne die gerade eingefügte Zeile) in das leere Editierfenster des zweiten Browser-Tabs<br />
:# Dann noch ein paar Korrekturen (z.B. die korrekte Kategorie "EnOcean Components" verwenden); und schau Dir existierende (EnOcean-)Seiten (Gliederung!) an und übernimm das bitte entsprechend <br />
:# Vorschau der neuen Seite anzeigen und überprüfen<br />
:# wenn alles soweit stimmt, "Seite speichern"<br />
:# Auf Deiner Benutzerseite kannst Du jetzt (z.B.) die Seite in (D)eine Liste der von Dir erstellten Seiten aufnehmen ... und evtl. noch ein paar Worte über Dich schreiben<br />
:--[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 18:18, 25. Jan. 2016 (CET)<br />
<hr /><br />
: Hallo Eisix, Hallo Peter!<br />
: Mische mich hier mal ein: Sind die Bildrechte für BSC-MwC-32.jpeg geklärt? Falls nein, bitte Bild nicht einbinden/löschen und gegebenenfalls eigenes Foto hochladen.<br />
: Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 19:06, 25. Jan. 2016 (CET)<br />
<hr /><br />
: Hallo,<br />
: @Peter ich wollte nicht wie ein Elefant im Porzellanladen durch die Wiki stapfen, dafür kenne ich mich damit zu wenig aus ;-)<br />
: @Krikan guter Einwand das Bild ist von www.enocean-alliance.org wo auch die verlinkte Anleitung her ist. Eigenes Bild ist leider nicht mehr möglich da das ganze hinter einem Aquarium verbaut ist und nur mit größerem Aufwand wieder rauszuholen ist. Also nehme ich das Bild am besten wieder raus !?<br />
:Gruß --[[Benutzer:Eisix|Eisix]] ([[Benutzer Diskussion:Eisix|Diskussion]]) 10:19, 26. Jan. 2016 (CET)<br />
<br />
== Unterscheidung Code für DEF und .cfg ==<br />
Hallo Peter!<BR><br />
habe gelesen, dass Du auf [[Ölverbrauchsanzeige_/_Betriebsstundenzähler]] den Code als .cfg-Code per Hinweis markiert hast. Bisher haben wir bei der Unterscheidung DEF,Einzeiler, aus optischen Gründen umgebrochenen Einzeiler und .cfg Code im Wiki kein wirkliches System. Es bedarf jeweils der Interpretation. Vieles ist derzeit cfg.-Code. Eigentlich wünsche ich mir, dass wir überall einen Hinweis in den Codeboxen DEF bzw. cfg einpflegen. Das dürfte aber praktisch nicht umsetzbar sein und auch hohes Fehlerpotenzial haben. Hatte auch schon einmal einen Versuch in die Richtung unternommen, aber aufgegeben.<BR><br />
Momentan tendiere ich dazu, auf [[Konfiguration]] einen Erläuterung einzufügen, woran man die verschiedenen Code-Varianten erkennt und die Seite -wie Du es mal geplant hattest, von allen anderen Seiten zu verlinken. Das ist mMn einfacher. Hast Du dazu eine Meinung/Idee?<BR><br />
Würde das auf ggfs. auf meine Todo-Liste setzen.<BR><br />
Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 10:10, 16. Feb. 2016 (CET)<br />
<hr /><br />
:Hallo Christian, ja, so eine grundlegende Vorgehensweise fehlt uns da noch. War mir auch bewusst, ich wollte aber in diesem konkreten Fall gleich was eintragen, weil das fehlende Wissen zu diesem Thema der Auslöser für den Forenthread war. Ich behalte das Thema auch im Hinterkopf - die zündende Idee, wie man das am besten umsetzen kann fehlt mir aber leider noch. Wer immer von uns früher dazu kommt, hat gewonnen :-) --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 12:28, 16. Feb. 2016 (CET)<br />
<br />
==Nochmal Begrüßungsseite==<br />
Hallo Peter,<br />
<br />
Mein Benutzerkonto wurde gerade freigeschaltet und ich habe mich gewundert, warum die Begrüßungsseite so "wikipedistisch" ist. Sollten wir da nicht mal rangehen und eine Benutzerbegrüßung schreiben, die an das fhemwiki angepasst ist?<br />
<br />
Ein paar Grundlagen wie Bearbeitungshilfe würde ich auch aus Wikipedia einbinden, aber die Infoseite "was Wikipedia nicht ist" scheint mir irgendwie hier deplatziert...<br />
<br />
Ich würde mich dransetzen, aber brauche dann wahrscheinlich Hinweise, wo hier im fhemwiki die "Richtlinien" und andere Infos stecken, die man in der Willkommensnachricht verlinken könnte/sollte.<br />
<br />
Gruß, Markus --[[Benutzer:Krokofant|Krokofant]] ([[Benutzer Diskussion:Krokofant|Diskussion]]) 11:31, 5. Mär. 2016 (CET)<br />
<hr /><br />
:Hallo Markus, die Begrüßungs-Vorlage ist einfach aus der Situation heraus mal entstanden. Es gab viele Neuanmeldungen von Leuten, die noch keinerlei Berührung mit Wiki(media) hatten und entsprechend gedankenlos ans Werk gegangen sind. War dann nachher mehr Aufräumarbeit nötig als dass die Mitarbeit Hilfe gewesen wäre. Dazu sind ein paar Hinweise auf Fhem-Wiki-Spezifika eingeflossen ... aber ''gelesen'' wird das Ganze leider ohnehin höchst selten, wenn man manche Beiräge hier so sieht.<br />
:Aber lass Dich nicht entmutigen, Vorschläge und aktive Mitarbeit sind natürlich herzlich willkommen. <br />
:Fhem-spezifische Informationen sind eigentlich komplett in Über FHEMWiki gesammelt bzw. über diese Seite zu erreichen. Wenn Du Dir die Änderungshistorie der Seite anschaust, wirst Du auch feststellen, dass das eine One-(oder Two, Krikan hilft auch mit)-Man-Show ist - von einigen "kurzen Strohfeuern" mal abgesehen. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 12:02, 5. Mär. 2016 (CET)<br />
<br />
== Vorlage:News und Interwiki-Links ==<br />
Hallo Peter,<br />
<br />
danke für die Einrichtung meines Logons.<br />
# ich habe mir mal erlaubt die [[Vorlage:News]] zu Dokumentieren und dabei die Orientierung der ersten Spalte zu ändern. Ich finde es etwas irritierend beim Lesen wenn das Datum nicht auf der ersten Zeile des folgenden Eintrags steht. Ich hoffe das ist so für euch in Ordnung, ansonsten lässt sich das jederzeit wieder ändern.<br /> >> ''Klar; sieht jetzt besser aus und Dokumentation ist immer gut; ich sehe auch sonst keine Nachteile'' --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 14:45, 21. Apr. 2016 (CEST)<br />
# Die Seite [[Spezial:Meiste_Interwikilinks]] ist hier leer und die [https://www.mediawiki.org/wiki/Extension:Interwiki Extension:Interwiki] scheint auch nicht installiert bzw. aktiviert zu sein. Sie gehört seit V1.21 zum Installationsbündel und müsste bei der hiesigen V1.24 also schon dabei sein. Man bräuchte sie also nur in Betrieb nehmen. Links auf die Wikipedia werden im FHEMWiki offenbar explizit als ausgeschriebene URL ausgeführt. Das ist meiner Erfahrung nach ungünstig. Auch Beiträge aus dem FHEM-Forum könnte man mit Interwikilinks konsistenter handhaben. Auch die [[Vorlage:DocLink]] lässt sich vermutlich damit einfacher gestalten.<br /> >> ''Wiki-seitig dürften sich da in nächster Zeit einige Änderungen ergeben, die das mit adressieren lassen. Als ich begonnen habe, die derzeitigen Links zu setzten, ging es leider nicht anders (wurde Server-seitig nicht angeboten). Da würde ich Dich einfach noch um etwas Geduld bitten - und später gern bei Dir nachhaken, nachdem Du Dich allein mit der Frage schon als Experte geoutet/qualifiziert hast :-) '' --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 14:45, 21. Apr. 2016 (CEST)<br />
<br />
Viele Grüße --[[Benutzer:MGu|MGu]] ([[Benutzer Diskussion:MGu|Diskussion]]) 13:06, 16. Apr. 2016 (CEST)<br />
<br />
== Infobox Modul: Neue untergeordnete Boards Wettermodule und Kalendermodule ==<br />
Hallo Peter!<br />
<br />
Könntest Du bei Gelegenheit bitte die Verbindung für die Infobox zu den neuen Unterboards einpflegen. Das scheint derzeit noch nicht zu funktionieren bzw. ich habe keine Ahnung wie...<BR><br />
Danke und Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 21:56, 27. Mai 2016 (CEST)<br />
<hr/><br />
:Hallo Christian...<br />
:gut versteckt (hab selbst erst wieder "suchen" müssen) befindet sich die Liste der Forenboards in der Vorlage [[:Vorlage:Link2Forum|Link2Forum]]. Muss ich gelegentlich mal in der Doku zur Vorlage [[:Vorlage:Infobox Modul|Infobox Modul]] erwähnen. <br />
:Habe gerade die neuen Unterboards eingefügt. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 09:38, 28. Mai 2016 (CEST)<br />
<br />
== Bitte um Kontrolle/Meinung ==<br />
Hallo Peter!<BR><br />
Könntest Du bitte einmal hier [[Benutzer_Diskussion:Krueuw]] hineinschauen -falls noch nicht gesehen- und ggf. eingreifen, falls ich falsch liege und/oder etwas vergessen habe.<BR><br />
Danke und Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 15:24, 7. Aug. 2016 (CEST)<br />
:Vermutlich ist unsere Diskussion dort überholt. [[Benutzer:ThomasRamm]] hat die Artikel eben verschoben/geaendert/zusammengefasst und mir fehlt momentan darüber der Überblick. Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 16:50, 7. Aug. 2016 (CEST)<br />
<br />
== Artikel betr.: Arduino MySensors MYSENSORS ==<br />
<br />
Hallo Peter,<br />
<br />
habe eben mal etwas in den Kategorienseiten rumgestöbert um zu sehen, wo - nach meinem Geschmack und begrenztem Verständnis - eigentlich was hinsollte und bin über ein paar Dinge gestolpert, die ich gerne zur Diskussion stellen wollte. Im Detail:<br />
<br />
1. Unter "Arduino" finde ich nicht etwa den Hinweis, dass einige Projekte, die für FHEM eine größere Rolle spielen, Arduino-basiert sind, sondern die Beschreibung einer der Lösungen (ein FHEMduino?, der dazu noch recht alt ist und bei dem sich die verlinkten Sourcen evtl. mit heutiger SW-Umgebung gar nicht mehr compilieren lassen).<br />
<br />
Fragen: <br />
<br />
a) Sollte man die Seite nicht umbenennen (in FHEMduino?)?<br />
<br />
b) Eine neue Seite mit diesem Namen wäre für den interessierten Laien hilfreich, in der (mindestens) die einzelnen verfügbaren Projekte kurz aufgelistet sind (auf die Schnelle: SIGNALduino, firmata, FHEMduino, nanoCUL, MySensors, Arducounter, panstamp?...) sowie der Hinweis, dass die uC's (und auch andere uC's wie der ESP8266) mit der gleichnamigen IDE recht einfach selber programmiert werden können.<br />
<br />
2. Zu MySensors existieren derzeit drei Artikel: MySensors, MYSENSORS und MYSENSORS_DEVICE. <br />
<br />
a) Die letzteren beiden Artikel sind inhaltlich völlig ok, ich würde aber vorschlagen, die im Titel ggf. bereits als (Modul) zu kennzeichnen?<br />
<br />
b) Der MySensors-Artikel wäre an sich auch ok, wenn - jedenfalls aus Sicht des interessierten aber noch uniformierten Erstlesers - nicht der Eindruck entstehen würde, <br />
* man bräuchte einen ESP und <br />
* es handelte sich zwingend um eine IP-basierte Lösung - was es ja bei Verwendung der einfachsten Variante (Arduino als serielles GW) nicht ist!<br />
Hier würde ich vorschlagen (bzw. das ggf. selbst tun), als erstes Beispiel noch ein schlichtes serielles GW zu nehmen.<br />
Dann fehlt in dem Artikel m.E. nur der Verweis auf's Howto (s.u.) <br />
<br />
c) Unter [[:Kategorie:Other_Components]] tauchen beide mysensors-Links auf, das ist m.E. einer zu viel (der auf's Modul).<br />
<br />
3. M.E. fehlt dann eigentlich "nur noch" ein Howto mit den gesammelten Erkenntnissen (mein eigentlicher Job...). Wohin damit? nach [Kategorie:HOWTOS] oder nach [Kategorie:Examples]<br />
<br />
Bitte um Rückmeldung dazu und auch die Info, was ich ggf. davon selber machen soll/kann/darf. Ich will ja auch niemandem zu nahe treten...<br />
<br />
Gruß,<br />
<br />
Jörg<br />
<hr /><br />
:Hallo Jörg,<br />
:ich habe die Diskussion zur Kenntnis genommen, aber gerade nicht die Zeit, ausführlich darauf einzugehen und mich in die Artikelstruktur einzulesen. Hole ich in den nächsten Tagen nach. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 07:21, 11. Nov. 2016 (CET)<br />
<br />
<hr /><br />
::Hallo Peter,<br />
::Danke für die Zwischeninfo. Nach meinen ersten Versuchen noch folgende Anmerkungen:<br />
::*ad 1. Den Arduino-Artikel habe ich als Vorschlag umgebaut (s. Diskussion dazu), mich allerdings nicht getraut, das ohne Rücksprache "scharf" zu schalten<br />
::*ad 2. Dass das Wiki erst mal davon ausgeht, dass aufgerufene Seiten auch existieren, hat mich genauso irritiert wie der Umstand, dass die URL's case-sensitive sind. So was ist mir vorher nirgends im Web aufgefallen. Ist das so beabsichtigt?<br />
::*ad 3. Das Howto wird wohl kein hotwo im engeren Sinne (Anleitung), sondern eher eine Sammlung der bisherigen Erkenntnisse. Wie benennt man das am Besten? "Starter Guide" analog EnOcean?<br />
<br />
== verwaiste Bilder löschen? ==<br />
Hallo Peter!<BR><br />
ich habe heute Bilder hochgeladen und eines davon nicht benötigt. Du hast mich auch diesbezüglich angeschrieben, aber ich finde keine Möglichkeit dies irgendwie zu löschen oder zum Löschen markieren. Ich dachte nicht verlinkte Bilder werden automatisch gelöscht!<br />
Kannst du mir einen Tipp geben wie das gehen soll. Im MediaWiki habe ich gelesen ich muss hier einen Löschantrag erstellen, ist das wirklich so gemeint und wenn ja wie geht das hier?<br />
--[[Benutzer:Reinhart|Reinhart]] ([[Benutzer Diskussion:Reinhart|Diskussion]]) 21:03, 5. Jan. 2017 (CET)<br />
<hr /><br />
:Habe Dir auf Deiner Diskussionsseite geantwortet. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 10:00, 6. Jan. 2017 (CET)<br />
<br />
== Zitierhilfe: Erweiterung Cite ==<br />
Hallo,<br />
<br />
ich schlage vor, die ab MW Version 1.21 mitgelieferte [https://www.mediawiki.org/wiki/Extension:Cite/de Erweiterung ''Cite''] zu aktivieren bzw. sie nachzuladen. <br />
<br />
Die Informationen in den Artikeln, die nicht originär vom jeweiligen Autor/Bearbeiter selbst stammen, sollten ja immer als Zitate gekennzeichnet bzw. deren Quellen vermerkt werden. ''Cite'' macht das wesentlich einfacher und unaufwändiger. <br />
<br />
[[Benutzer:Baumbuwe|Uwe ]] ([[Benutzer Diskussion:Baumbuwe|Diskussion]]) 16:53, 9. Jun. 2017 (CEST)<br />
<br />
: Hallo Peter, gibt es schon eine Meinung zu dem Vorschlag? [[Benutzer:Baumbuwe|Uwe ]] ([[Benutzer Diskussion:Baumbuwe|Diskussion]]) <br />
:<hr /><br />
::Hallo Uwe, Markus hat die Extension gerade aktiviert ... kannst ja mal ausprobieren, ob es nach Deinen Vorstellungen funktioniert. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 19:26, 26. Jul. 2017 (CEST)<br />
::<hr /><br />
::: Alles prima, danke! Wenn es (wie es aussieht) die mitgelieferte Erweiterung ist, kann es nur richtig sein ;-). Vgl.: [[Telnet]].<br />
:::[[Benutzer:Baumbuwe|Uwe ]] ([[Benutzer Diskussion:Baumbuwe|Diskussion]])<br />
<br />
== Änderung von Seitentiteln ==<br />
Hi Peter,<br />
weißt du wie ich einen Seitentitel ändern kann?<br />
<br />
panStamp Innenraumsensor --> ESP8266 Innenraumsensor und -Steuerung<br />
<hr /><br />
:Das "magic word" ist "verschieben" (siehe auch weiter oben auf dieser Seite). --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 10:03, 3. Aug. 2017 (CEST)<br />
<br />
<hr/><br />
:: Danke, das wars<br />
<br />
== Einfügen von Links und Beispielen ==<br />
<br />
Hallo Peter,<br />
<br />
ich schlage mich gerade mit dem PRESENCE-Modul herum und würde gerne einen kurzen Verweis und einen Link auf [https://wiki.fhem.de/wiki/FRITZBOX] FRITZBOX: Anwesenheitserkennung per regelmäßiger Abfrage über das PRESENCE Modul machen und eine Überschrift unter '''fritzbox - Das Überwachen von Geräten auf einer FritzBox via ctlmgr_ctl (Nur auf einer FritzBox möglich)''' mit dem Titel '''fritzbox - Anwesenheitserkennung per regelmäßiger Abfrage über das PRESENCE Modul''' einfügen.<br />
<br />
Desweiteren würde ich gerne bei https://wiki.fhem.de/wiki/UserReadings zumindest mal ein Beispiel für UserReadings einfügen, an dem ich lange gekämpft habe (Syntaxprobleme). Da geht es darum, den Textwert eines HOMEMATIC 3-State-Sensor für Fenster (close, open, tilted) in Zahlenwerte für Thingspeak umzuwandeln: attr <DEVICE> userReadings Statenum {if(ReadingsVal("<DEVICE>","state","") eq "closed") {return 0} elsif (ReadingsVal("<DEVICE>","state","") eq "tilted") {return 1} elsif (ReadingsVal("<DEVICE>","state","") eq "open") {return 2} else {return -1}}<br />
<br />
Wird das diskutiert oder werden solche "Schönheitsreparaturen" einfach gemacht?<br />
<br />
== Vorlagen für Vorlagen-Dokumentation ==<br />
Hallo Peter,<br />
<br />
Du hattest vor längerer Zeit mal mit Vorlagen für die Vorlagen-Dokumentation begonnen bzw. experimentiert:<br />
* [[Vorlage:Dokumentation]]<br />
* [[Vorlage:Dokumentation/Dokuseite]]<br />
<br />
Besteht da noch Interesse bzw. wollen wir das nochmals angehen?<br />
<br />
Falls ja, können gerne die funktionierenden Lösungen aus dem [https://genwiki.genealogy.net Genwiki]:<br />
* [http://genwiki.genealogy.net/Vorlage:Dokumentation Vorlage:Dokumentation] <br />
* [http://genwiki.genealogy.net/Vorlage:Dokumentation/Dokuseite Vorlage:Dokumentation/Dokuseite] <br />
verwendet werden?!<br />
<br />
[[Benutzer:Baumbuwe|Uwe ]] ([[Benutzer Diskussion:Baumbuwe|Diskussion]])<br />
<br />
== Teilweise Darstellungsfehler bei Infobox Modul in Zeile "Ersteller" ==<br />
Hallo Peter!<br />
<br />
Seit kurzem gibt es teilweise bei der Infobox-Modul unter Ersteller ein Darstellungsproblem; siehe bspw. [[WebViewControl]], [[STV]]. Ich finde den Fehler leider nicht. Könntest Du bitte einmal schauen? Danke.<br />
<br />
Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 13:52, 20. Feb. 2018 (CET)<br />
<br />
:Liegt wohl an der [[Vorlage:Link2FU]]. Und da tippe ich auf die übersichtliche Formatierung der if-Bedingung. Da werden nämlich lustigerweise Leerzeilen eingebaut, wenn man z.B. bei [[WebViewControl]] das (eh schon komische) <nowiki> / /[[Benutzer Diskussion:Dirk|Wiki]]</nowiki> löscht. Trau mich aber nicht, an der Vorlage herumzudoktorn ;) --[[Benutzer:Drhirn|Drhirn]] ([[Benutzer Diskussion:Drhirn|Diskussion]]) 14:33, 20. Feb. 2018 (CET)<br />
<br />
<hr /><br />
::Soweit ich auf die Schnelle feststellen konnte, ist die Formatierung der InfoBox etwas kritisch in Bezug auf Zeilenumbrüche und Leerstellen. Habe das jetzt auf der STV-Seite (und "Telegram") mal probiert / korrigiert. Da ist aber wohl noch etwas Basisarbeit nötig, um die Vorlage gegen solche "Bedienungsfehler" robuster zu machen. Soweit ich gesehen habe, sollten die abschließenden geschweiften Klammern in einer neuen Zeile stehen, evtl. sind auch Leerstellen bei dem häufig verwendeten Forum/Wiki-Schrägstrich im Link2FU "schädlich". --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 15:39, 20. Feb. 2018 (CET)<br />
<br />
<hr /><br />
:::Zur Klarstellung: Das neue "Problem" betrifft jede Menge Wiki-Seiten, so dass ich manuelle Änderung auf den Einzelseiten als zu mühselig empfinde. Aber es läuft nicht weg. --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 15:58, 20. Feb. 2018 (CET)<br />
<br />
<hr /><br />
::::Stimmt - kann leider dieses Problem nicht auf eine konkrete Ursache zurückführen; möglich wären: Wiki Update, neuer Modultyp "u" oder der "Commandref Disclaimer" als größere Änderungen in der letzten Zeit. Die Änderung von Uwe im Link2FU ist nicht der Grund (habe ich gerade ausprobiert). Also: Projekt für demnächst. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 18:06, 20. Feb. 2018 (CET)<br />
::::... war wohl doch der Grund. Habe die Vorlage noch mal überarbeitet und meine, dass es jetzt besser aussieht (habe aber nur stichprobenartig geprüft). --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 17:51, 21. Feb. 2018 (CET)<br />
<br />
== wie geht Codeblock? ==<br />
<br />
Ich scheitere an Codeblock, siehe [[FTUI Widget Svgplot]]. Ich bitte um Hinweis. [[Benutzer:Curt|Curt]] ([[Benutzer Diskussion:Curt|Diskussion]]) 04:39, 9. Nov. 2018 (CET)<br />
:So [[Syntax_Highlighting]] wenn's längerer Code ist. Wenn's nur eine Zeile ist, einfach ein Leerzeichen an den Anfang der Zeile --[[Benutzer:Drhirn|Drhirn]] ([[Benutzer Diskussion:Drhirn|Diskussion]]) 08:46, 9. Nov. 2018 (CET)<br />
::Genau - hab's gerade mal exemplarisch in der FTUI Widget Seite eingefügt --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 08:54, 9. Nov. 2018 (CET)<br />
:::Ich habe es gesehen. Sehr herzlichen Dank dafür. [[Benutzer:Curt|Curt]] ([[Benutzer Diskussion:Curt|Diskussion]]) 03:07, 13. Nov. 2018 (CET)<br />
<br />
== Infobox nur für FHEM-Module? ==<br />
<br />
Ich hatte versucht, in [[FTUI Widget Svgplot]] eine Infobox zu setzen. Dabei musste ich auf die Möglichkeiten der Infobox zurückgreifen (genauer: kopiert und angepasst).<br />
<br />
Meine Idee dahinter: FTUI-Widgets sind leider nicht so statisch wie FHEM-Module. Mal geht das Widget grundsätzlich nicht, mal war das ein Versuch im Forum, mal ist der Widget-Autor weg. Das Ergebnis ist völlige Konfusion, ich kann bedarfsweise einige Beispiele nennen.<br />
<br />
Meine Idee war nun: Autor, Forum-Thread, Forenabteilung FTUI sowie "hat 2018-11 noch funktioniert" in die Infobox zu packen. Ziel der Veranstaltung: Nutzer sieht: "Oh, das wird wohl funktionieren - aha, die haben da einen Test im Wiki, das probiere ich jetzt aus, eigentlich würde ich das ja brauchen."<br />
<br />
Parallel gibt es Krach um die Frage, ob das überhaupt gebraucht würde, siehe https://forum.fhem.de/index.php?topic=92218 , #10 und #11, das am Rande.<br />
<br />
Unabhängig von der Frage, ob man für FTUI-Widgets so eine Infobox braucht: Ginge das denn?<br />
<br />
(Ich habe mit Leerzeilen formatiert, es spricht nichts dagegen, das nachträglich unauffällig zu korrigieren.) [[Benutzer:Curt|Curt]] ([[Benutzer Diskussion:Curt|Diskussion]]) 03:23, 13. Nov. 2018 (CET)<br />
<br />
== wohin ein Proof of Concept? ==<br />
Ich möchte gelegentlich im Forum (!) eine recht komplexe Struktur zur Diskussion vorlegen, die eigene statische Server im Netz auf Updates überwacht. Mir erscheint es sinnvoller, die komplexe Struktur in einem Wiki-Artikel abzulegen, sinnvollerweise in der Kategorie Beispiele/Codeschnipsel. Das Ganze funktioniert, ist aber unfertig. Erstelle ich den Artikel unverlinkt im Wiki-Raum oder wie sollte ich es machen? Was habe ich zudem zu beachten? [[Benutzer:Curt|Curt]] ([[Benutzer Diskussion:Curt|Diskussion]]) 23:35, 26. Dez. 2018 (CET)<br />
<hr /><br />
:Hallo Curt, Du kannst die Seite gern gleich im normalen Wiki Namensraum anlegen; wenn Du sie mit einem kurzen Baustellenhinweis versiehst, wird sie sicherlich auch niemand grundlegend ändern, insbesondere, wenn Du darum bittest, Diskussion und Änderungsvorschläge im Forum abzuhandeln. Bevor Du sie an anderen Stellen im Wiki verlinkst, solltest Du vielleicht zumindest abwarten, bis sich der Seitentitel etabliert hat. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 11:55, 27. Dez. 2018 (CET)<br />
::Es geht zwar um einen anderen Artikel, aber kannst Du bitte mal bei [[Flusspegel]] die Einleitungszeile (?????) prüfen und korrigieren? [[Benutzer:Curt|Curt]] ([[Benutzer Diskussion:Curt|Diskussion]]) 19:43, 18. Feb. 2019 (CET)<br />
::<hr /><br />
:::Siehe Kommentare auf der Diskussionsseite des Artikels --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 09:10, 20. Feb. 2019 (CET)<br />
::::Ich habe es dort nicht gelesen. Und Du liest meine Antwort dort vermutlich auch nicht, daher hier: Es geht (mir) nicht um Autorenschaft, es geht (mir) um Ansprechpartner. Ich habe leider nicht verstanden, wie man einen Link auf einen FHEM-Forum-Nick setzt. Zudem habe ich nicht verstanden, wie man einen Link auf einen FHEM-Forum-Thread setzt. Bitte erkläre mir das - am liebsten direkt auf meiner Diskussionsseite; das wäre mir sehr hilfreich.<br />
::::Der Dank an ITZBund war notwendig und genau kalkuliert. Der kann dann gelegentlich weg.<br />
::::Bei Screenshot benötige ich leider immer Hilfe, konkret bei der Formatierung sowie Positionierung.<br />
::::[[Straßenverkehr Blitzer]], ganz oben: Genau die gleichen Probleme ... [[Benutzer:Curt|Curt]] ([[Benutzer Diskussion:Curt|Diskussion]]) 20:43, 3. Apr. 2019 (CEST)</div>Curthttp://wiki.fhem.de/w/index.php?title=Stra%C3%9Fenverkehr_Blitzer&diff=30081Straßenverkehr Blitzer2019-04-03T18:18:49Z<p>Curt: /* Definition */</p>
<hr />
<div>@Wiki-Admin: <br />
* Link auf bismosa fehlt<br />
* Link auf https://forum.fhem.de/index.php/topic,99070.0.html fehlt{{Baustelle}} <br />
<br />
{{Infobox Modul|<br />
|ModPurpose=Geschwindigkeitsüberwachung Blitzer<br />
|ModType=x<br />
|ModCmdRef=blitzer<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=98_Blitzer.pm<br />
|ModOwner=bismosa<br />
}}<br />
<br />
'''Straßenverkehr Blitzer''' ist ein Modul, welches mobile Verkehrsüberwachungsanlagen (aka Blitzer) ein Internet Portal abfragt und für den Umkreis des eigenen Standorts listenförmig im Straßenverkehr innerhalb Deutschlands auflistet - bezogen auf eine anzugebende Koordinate, um den Radius um diese Koordinate.<br />
<br />
== Features ==<br />
* Die Ausgabe frei über Attribute konfigurierbar.<br />
* HTML-Code bzw. plaintext ist einstellbar.<br />
* Es kann mit einem set <Blitzer-Device> Update <Optional:LAT> <Optional:LONG> auch eine neue Koordinate vorgegeben werden.<br />
* Der Bereich, der bei Verkehrslage.de abgefragt wird, kann vom Modul berechnet werden.<br />
* Es kann ein Reading erzeugt werden, welches bei vorhanden Blitzern eine "1" und sonst eine "0" anzeigt (praktisch z.B. um in FTUI Bereiche auszublenden, wenn kein Blitzer gemeldet wurde).<br />
* Es kann die maximale Anzahl an anzuzeigenden Blitzern festgelegt werden.<br />
* Es kann ein Text festgelegt werden, wenn kein Blitzer in der Nähe ist.<br />
<br />
== Modul integrieren ==<br />
Das Modul ist in jeweils aktueller Version auf Github verfügbar. Es ist zunächst in den FHEM-Update-Prozess zu integieren:<br />
<br />
<source lang="html"><br />
update add https://raw.githubusercontent.com/bismosa/FHEM/master/controls_all.txt<br />
update check<br />
update all<br />
</source><br />
<br />
== Definition ==<br />
<source lang="html"><br />
define <Name> Blitzer <Interval><br />
</source><br />
Das Intervall hat die Basis "Minuten". Sofern kein Intervall angegeben ist, wird nicht automatisch aktualisiert.<br />
<br />
Sodann ist '''wesentlich''', dass die gewünschte Ausgangskoordinate sowie der gewünschte Radius in den Attributen gesetzt werden, beispielhaft:<br />
<source lang="html"><br />
attr <Name> home_latitude 51.8<br />
attr <Name> home_longitude 12.6<br />
attr <Name> radius 25<br />
</source><br />
<br />
== Formatierung der Ausgabe ==<br />
<br />
Über das Attribut "Ausgabe" wird gesteuert, welche je Blitzer verfügbaren Informationen ausgegeben werden sollen. Ein Beispiel mit wenigen Informationen, für den ländlichen Raum geeignet:<br />
<source lang="html"><br />
attr <Name> Ausgabe {OR,suburb,city_district,town,village,},road,building,vmax,[km/h],newline<br />
</source><br />
<br />
Ein Beispiel für den großstädtischen Raum:<br />
<source lang="html"><br />
attr <Name> Ausgabe number,{OR,suburb,city_district,town,village,},road,building,[Max.],vmax,[km/h],[(],distanceShort,[km],[)],[!!],newline<br />
</source><br />
<br />
=== Spezielle Einträge ===<br />
*number Nummerierung<br />
* newline Neue Zeile<br />
* [Freitext] Beliebiger Text. Dieser wird ohne die Klammern übernommen.<br />
* distance Abstand des Blitzers von der Home-Koordinate (Luftlinie)<br />
* distanceShort Abstand des Blitzers von der Home-Koordinate (Luftlinie) eine Kommastelle<br />
* {OR ODER-Verknüpfung. Wenn ein Wert vorhanden ist, werden die nachfolgenden (bis zur geschweiften Klammer) nicht berücksichtigt<br />
* } Ende der ODER-Verknüpfung. Muss zwingend gesetzt werden, wenn eine ODER-Verknüpfung enthalten ist.<br />
<br />
Es können beliebig viele Werte so verknüpft werden.<br />
<br />
Welche Werte vorhanden sind, kann mit<br />
<source lang="html"><br />
get <Blitzer-Device> allReadings <Optional:Nummer><br />
</source><br />
überprüft werden. Wird eine nummer mitgegeben, werden nur die entsprechenden Einträge ausgegeben.<br />
<br />
-------------<br />
-------------<br />
-------------<br />
<br />
'''Ab hier ist veralteter Code ohne Modul, aber funktional!'''<br />
<br />
Vom gleichen Autoren gibt es mit gleicher Funktionalität nun ein inoffizielles Modul: https://forum.fhem.de/index.php/topic,90014.0.html<br />
<br />
Der [[{{PAGENAME}}|Code "Blitzer"]] (Autor: {{Link2FU|30971|bismosa}}]) ist ein Code zur listenförmigen Anzeige mobiler Geschwindigkeitsüberwachungen (Radarfallen) im Straßenverkehr. Er kann problemlos in [[FHEM Tablet UI]] genutzt werden. 2019-02 wurde es geprüft und war funktional.<br />
<br />
Es wird ausdrücklich auf den Thread {{Link2Forum|Topic=90014|LinkText=Blitzer anzeigen}} im FHEM-Forum verwiesen: Im ersten Beitrag pflegt der Autor den Code nach.<br />
<br />
==Funktionalität==<br />
Ausgehend von einer vorgegebenen Koordinate werden alle gemeldeten Blitzer im beliebigen Umkreis (bis 99 Kilometer) aufgelistet. Zusätzlich existiert ein Reading "Anzeige": "0", wenn keine Blitzer im definierten Umkreis vorliegen, "1" wenn dort Blitzer vorliegen.<br />
<br />
==Code mit Erläuterungen==<br />
<source lang="html"><br />
defmod blitzer dummy<br />
attr blitzer userattr lat lng maxkm<br />
attr blitzer icon ampel_rot<br />
attr blitzer lat 51.8644<br />
attr blitzer lng 12.6346<br />
attr blitzer maxkm 25<br />
attr blitzer stateFormat Text<br />
attr blitzer room 61 Verkehr<br />
</source><br />
<br />
Damit wird die Definition des basierenden Dummy-Devices vorgenommen. Hier ist die Mittelpunktskoordinate (lat/lon) an die eigenen Bedürfnisse anzupassen: HIer bin ich, welche Blitzer sind im Umkreis? - "maxkm" definiert den Radius um die Koordinate, in dessen Kreisfläche alle gemeldeten Blitzer gelistet werden sollen. "room" kann den eigenen Bedürfnissen angepasst werden.<br />
<br />
<source lang="html"><br />
defmod httpmod_blitzer HTTPMOD https://cdn2.atudo.net/api/1.0/vl.php?type=0,1,2,3,4,5,6&box=51.6,12.1,52.0,13.0 0<br />
attr httpmod_blitzer userattr getData getHeader1 getHeader2 getURL reading01DeleteIfUnmatched reading01JSON reading01Name reading01Regex reading02Name reading02RegOpt reading02Regex reading03JSON reading03Name readingEncode requestHeader1 requestHeader2 setParseResponse:0,1<br />
attr httpmod_blitzer enableControlSet 1<br />
attr httpmod_blitzer extractAllJSON 1<br />
attr httpmod_blitzer getHeader1 Content-Type: application/json<br />
attr httpmod_blitzer getHeader2 Accept: */*<br />
attr httpmod_blitzer readingEncode utf8<br />
attr httpmod_blitzer room 61 Verkehr<br />
</source><br />
<br />
Mit dieser Device wird die Internetabfrage definiert. Der "room" kann an eigene Befürfnisse angepasst werden. Die Definition selbst (defmod httpmod_blitzer) '''muss''' angepasst werden, es geht um den letzten Teil: "box=51.6,12.1,52.0,13.0 0". Gedanklich bildet man ein Quadrat um die Mittelpunktkoordinate. Für die ersten beiden Parameter bestimmt man die Koordinate der linken unteren Ecke. Für die beiden folgenden Parameter bestimmt man die Koordinaten der rechten oberen Ecke und trägt auch sie ein. Dabei muss man nicht sehr genau vorgehen: Ein ungefähres Rechteck reicht völlig. - Die abschließende Null '''muss''' unverändert bleiben: Der Abruf wird von einem Script gesteuert.<br />
<br />
<source lang="html"><br />
defmod at_Blitzer at +*00:10:00 {\<br />
fhem("deletereading httpmod_blitzer .*", 1);;\<br />
fhem("set httpmod_blitzer reread");;;;\<br />
fhem("sleep 2;; {getBlitzer};;");;;;\<br />
}<br />
attr at_Blitzer room 99_System<br />
</source><br />
<br />
Dieser Code-Teil sollte nicht geändert werden: Alle 10 Minuten werden alle Readings (Blitzer) gelöscht und via Web der aktuelle Stand erfragt.<br />
<br />
==99_myUtils.pm==<br />
In 99_myUtils.pm muss ein längerer Codeblock eingefügt werden. Er sollte ganz unten vor dem Codeteil<br />
<br />
<source lang="perl"><br />
1;<br />
</source><br />
stehen.<br />
<br />
<source lang="perl"><br />
################################################################<br />
### Blitzer ###<br />
################################################################<br />
sub getBlitzer(){<br />
my $httpDev = "httpmod_blitzer";<br />
my $BlitzerDev = "blitzer";<br />
my $lat = AttrVal($BlitzerDev,"lat",undef);<br />
my $lng = AttrVal($BlitzerDev,"lng",undef);<br />
my $maxkm = AttrVal($BlitzerDev,"maxkm",undef);<br />
if (!defined $lat){<br />
Log 5,"[getBlitzer] lat ist nicht definiert!"; <br />
}<br />
if (!defined $lng){<br />
Log 5,"[getBlitzer] lng ist nicht definiert!"; <br />
}<br />
if (!defined $maxkm){<br />
Log 5,"[getBlitzer] maxkm ist nicht definiert!"; <br />
}<br />
# Da unbekannt ist, wie viele es gibt...durchprobieren<br />
my @Liste;<br />
for(my $i=1;$i<100;$i++){<br />
my $num = sprintf("%02d", $i);<br />
Log 5,"[getBlitzer] Reading: $num"; <br />
my $Poi_lat = ReadingsVal($httpDev,"pois_".$num."_lat",undef);<br />
my $Poi_lng = ReadingsVal($httpDev,"pois_".$num."_lng",undef);<br />
last if !defined $Poi_lat;<br />
#Log 1,"[getBlitzer] Reading: $Poi_lat"; <br />
last if !defined $Poi_lng;<br />
Log 5,"[getBlitzer] lat/lng: $Poi_lat $Poi_lng"; <br />
my $Poi_street = ReadingsVal($httpDev,"pois_".$num."_street","keine");<br />
my $Poi_vmax = ReadingsVal($httpDev,"pois_".$num."_vmax","kA");<br />
if (!defined $Poi_vmax){<br />
$Poi_vmax = ".";<br />
}<br />
if ($Poi_vmax eq ""){<br />
$Poi_vmax = ".";<br />
}<br />
Log 5,"[getBlitzer] $Poi_street $Poi_vmax"; <br />
<br />
#Entfernung zur Home-Koordinate (Luftlinie)<br />
#Berechnung nach: https://www.kompf.de/gps/distcalc.html<br />
#Einfache Variante<br />
my $dx = 71.5 * abs($lng - $Poi_lng);<br />
my $dy = 111.3 * abs($lat - $Poi_lat);<br />
my $distance = sqrt($dx * $dx + $dy * $dy);<br />
<br />
#MaxEntfernung einbeziehen<br />
if (not $distance > $maxkm){<br />
Log 5,"[getBlitzer] distance: $distance"; <br />
push @Liste, [ $distance, $Poi_street, $Poi_vmax, $Poi_lat, $Poi_lng ]; <br />
} else {<br />
Log 5,"[getBlitzer] $distance > $maxkm"; <br />
}<br />
<br />
<br />
}<br />
my $out = join(", ", @Liste)."\n";<br />
Log 5,"[getBlitzer] $out"; <br />
my @ListeSort = sort {$a->[0] <=> $b->[0]} @Liste;<br />
$out = join(", ", @ListeSort)."\n";<br />
Log 5,"[getBlitzer] $out"; <br />
<br />
#Eintragen ins Dummy-Device<br />
#Eintragungen erst löschen<br />
fhem("deletereading $BlitzerDev .*", 1);<br />
<br />
my $Text="";<br />
my $Anzahl = scalar(@ListeSort);<br />
for (my $i=0;$i<$Anzahl;$i++) {<br />
my $num = sprintf("%02d", $i);<br />
Log 5,"[getBlitzer] Num: $num"; <br />
fhem("setreading $BlitzerDev ".$num."Entfernung ".$ListeSort[$i][0]);<br />
fhem("setreading $BlitzerDev ".$num."Strasse ".$ListeSort[$i][1]);<br />
fhem("setreading $BlitzerDev ".$num."VMax ".$ListeSort[$i][2]);<br />
<br />
#Ort<br />
fhem("sleep 1; \{getBlitzerOrte(".$ListeSort[$i][3].",".$ListeSort[$i][4].",'$num','$BlitzerDev')};");<br />
<br />
}<br />
fhem("sleep 3; \{getBlitzerText('$BlitzerDev')};");<br />
#fhem("setreading $BlitzerDev Text $Text");<br />
<br />
}<br />
sub getBlitzerOrte($$$$){<br />
#https://nominatim.openstreetmap.org/search/52.xxxxx%208.xxxx?format=json&addressdetails=1<br />
my $Poi_lat = shift;<br />
my $Poi_lng = shift;<br />
my $num = shift;<br />
$num = sprintf("%02d", $num);<br />
my $BlitzerDev = shift;<br />
<br />
<br />
my $hash = {};<br />
$hash->{'blitzerdev'} = $BlitzerDev;<br />
$hash->{'num'} = $num;<br />
my $param = {<br />
url => "https://nominatim.openstreetmap.org/reverse?format=json&lat=".$Poi_lat."&lon=".$Poi_lng,<br />
timeout => 5,<br />
method => "GET", # Lesen von Inhalten<br />
hash => $hash, # Muss gesetzt werden, damit die Callback funktion wieder $hash hat<br />
header => "",<br />
callback => \&getBlitzerOrteCallback # Diese Funktion soll das Ergebnis dieser HTTP Anfrage bearbeiten<br />
};<br />
#agent: FHEM/1.0\r\nUser-Agent: FHEM/1.0\r\nAccept: application/json<br />
<br />
HttpUtils_NonblockingGet($param); # Starten der HTTP Abfrage. Es gibt keinen Return-Code.<br />
<br />
}<br />
sub getBlitzerOrteCallback($) {<br />
my ($param, $err, $data) = @_;<br />
my $hash = $param->{hash};<br />
my $BlitzerDev = $hash->{blitzerdev};<br />
my $num = $hash->{num};<br />
<br />
if($err ne "") # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist<br />
{<br />
Log3 "[getBlitzerOrte]", 3, "error while requesting ".$param->{url}." - $err"; # Eintrag fürs Log<br />
}<br />
#Log 1,"[getBlitzerOrte] $BlitzerDev ".$param->{data}." ".$param->{url}." ".$param->{httpheader}." ".$param->{code};<br />
#Log 1,"$data";<br />
<br />
my $Stadtteil = "";<br />
my $Stadt = "";<br />
<br />
my ($Stadtteil) = $data =~ m/suburb":"([^"]+)"/;<br />
if ((!defined $Stadtteil) or ($Stadtteil eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search city_district";<br />
($Stadtteil) = $data =~ m/city_district":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadtteil";<br />
}<br />
if ((!defined $Stadtteil) or ($Stadtteil eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] $Stadtteil";<br />
Log 5, "[getBlitzerOrteCallback] ".$param->{url};<br />
Log 5, "[getBlitzerOrteCallback] $data";<br />
$Stadtteil = ".";<br />
}<br />
<br />
my ($Stadt) = $data =~ m/city":"([^"]+)"/;<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search village $data";<br />
($Stadt) = $data =~ m/town":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
}<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search village $data";<br />
($Stadt) = $data =~ m/village":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
}<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
Log 5, "[getBlitzerOrteCallback] ".$param->{url};<br />
Log 5, "[getBlitzerOrteCallback] $data";<br />
$Stadt = ".";<br />
}<br />
my ($building) = $data =~ m/building":"([^"]+)"/;<br />
if ((!defined $building) or ($building eq "")){<br />
$building = ".";<br />
}<br />
Log 5,"[getBlitzerOrteCallback] $Stadt $Stadtteil $building";<br />
#Log 1,"[getBlitzerOrte] ".$decoded_json->{address}->{suburb}->[0];<br />
if ($Stadt eq "."){$Stadt = " "};<br />
if ($Stadtteil eq "."){$Stadtteil = " "};<br />
fhem("setreading $BlitzerDev ".$num."Ort $Stadt $Stadtteil");<br />
fhem("setreading $BlitzerDev ".$num."Building $building");<br />
}<br />
sub getBlitzerText($){<br />
my $BlitzerDev = shift;<br />
my $Text="<html> <p align='left'>";<br />
my $SollAnzeige=0;<br />
for(my $i=0;$i<100;$i++){<br />
my $num = sprintf("%02d", $i);<br />
my $Entf = ReadingsVal($BlitzerDev,$num."Entfernung",undef);<br />
last if !defined $Entf;<br />
my $Ort = ReadingsVal($BlitzerDev,$num."Ort",".");<br />
if ($Ort eq "."){$Ort = " "};<br />
my $building = ReadingsVal($BlitzerDev,$num."Building",0);<br />
if ($building eq "."){$building = " "};<br />
my $Strasse = ReadingsVal($BlitzerDev,$num."Strasse"," ");<br />
my $VMax = ReadingsVal($BlitzerDev,$num."VMax"," ");<br />
if (not $Text eq "<html> <p align='left'>"){<br />
$Text = $Text."\n <br>"; <br />
}<br />
$Text = $Text."$num $Ort $Strasse $building Max $VMax km/h (".sprintf("%.1f", "$Entf")."km) !!";<br />
$SollAnzeige=1;<br />
}<br />
$Text = $Text."</p></html>";<br />
fhem("setreading $BlitzerDev Text $Text");<br />
fhem("setreading $BlitzerDev Anzeige $SollAnzeige");<br />
}<br />
</source><br />
<br />
Von besonderem Interesse ist hier die Zeile <br />
<br />
<source lang="perl"><br />
$Text = $Text."$num $Ort $Strasse $building Max $VMax km/h (".sprintf("%.1f", "$Entf")."km) !!";<br />
</source><br />
<br />
Diese Zeile kann man den eigenen Bedürfnissen anpassen, beispielhaft so:<br />
<source lang="perl"><br />
$Text = $Text."$Ort $Strasse $building $VMax km/h";<br />
</source><br />
Dieser Version ist günstiger für [[FHEM Tablet UI|FTUI]], da die Zeilenausgaben kürzer ist.<br />
<br />
==Code für FTUI==<br />
<source lang="html"><br />
<div data-type="label"<br />
data-device="blitzer"<br />
data-get="Text"><br />
</source><br />
<br />
==Hinweis==<br />
Es gibt mehrere Anpassungsvorschäge. Diese sind im Forum zu finden: {{Link2Forum|Topic=90014|LinkText=Blitzer anzeigen}}. Fragen zum Code bitte dort stellen.<br />
<br />
Screenshot fehlt<br />
<br />
[[Kategorie:Code_Snippets]]<br />
[[Kategorie:FHEM Tablet UI|Blitzer]]</div>Curthttp://wiki.fhem.de/w/index.php?title=Stra%C3%9Fenverkehr_Blitzer&diff=30080Straßenverkehr Blitzer2019-04-03T18:18:12Z<p>Curt: /* Features */</p>
<hr />
<div>@Wiki-Admin: <br />
* Link auf bismosa fehlt<br />
* Link auf https://forum.fhem.de/index.php/topic,99070.0.html fehlt{{Baustelle}} <br />
<br />
{{Infobox Modul|<br />
|ModPurpose=Geschwindigkeitsüberwachung Blitzer<br />
|ModType=x<br />
|ModCmdRef=blitzer<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=98_Blitzer.pm<br />
|ModOwner=bismosa<br />
}}<br />
<br />
'''Straßenverkehr Blitzer''' ist ein Modul, welches mobile Verkehrsüberwachungsanlagen (aka Blitzer) ein Internet Portal abfragt und für den Umkreis des eigenen Standorts listenförmig im Straßenverkehr innerhalb Deutschlands auflistet - bezogen auf eine anzugebende Koordinate, um den Radius um diese Koordinate.<br />
<br />
== Features ==<br />
* Die Ausgabe frei über Attribute konfigurierbar.<br />
* HTML-Code bzw. plaintext ist einstellbar.<br />
* Es kann mit einem set <Blitzer-Device> Update <Optional:LAT> <Optional:LONG> auch eine neue Koordinate vorgegeben werden.<br />
* Der Bereich, der bei Verkehrslage.de abgefragt wird, kann vom Modul berechnet werden.<br />
* Es kann ein Reading erzeugt werden, welches bei vorhanden Blitzern eine "1" und sonst eine "0" anzeigt (praktisch z.B. um in FTUI Bereiche auszublenden, wenn kein Blitzer gemeldet wurde).<br />
* Es kann die maximale Anzahl an anzuzeigenden Blitzern festgelegt werden.<br />
* Es kann ein Text festgelegt werden, wenn kein Blitzer in der Nähe ist.<br />
<br />
== Modul integrieren ==<br />
Das Modul ist in jeweils aktueller Version auf Github verfügbar. Es ist zunächst in den FHEM-Update-Prozess zu integieren:<br />
<br />
<source lang="html"><br />
update add https://raw.githubusercontent.com/bismosa/FHEM/master/controls_all.txt<br />
update check<br />
update all<br />
</source><br />
<br />
== Definition ==<br />
<source lang="html"><br />
define <Name> Blitzer <Interval><br />
</source><br />
Das Intervall hat die Basis "Minuten". Sofern kein Intervall angegeben ist, wird nicht automatisch aktualisiert.<br />
<br />
Sodann ist '''wesentlich''', dass die gewünschte Ausgangskoordinate sowie der gewünschte Radius in den Attributen gesetzt werden, beispielhaft:<br />
<source lang="html"><br />
attr <Name> home_latitude 51.8<br />
attr <Name> home_longitude 12.6346<br />
attr <Name> radius 25<br />
</source><br />
<br />
== Formatierung der Ausgabe ==<br />
<br />
Über das Attribut "Ausgabe" wird gesteuert, welche je Blitzer verfügbaren Informationen ausgegeben werden sollen. Ein Beispiel mit wenigen Informationen, für den ländlichen Raum geeignet:<br />
<source lang="html"><br />
attr <Name> Ausgabe {OR,suburb,city_district,town,village,},road,building,vmax,[km/h],newline<br />
</source><br />
<br />
Ein Beispiel für den großstädtischen Raum:<br />
<source lang="html"><br />
attr <Name> Ausgabe number,{OR,suburb,city_district,town,village,},road,building,[Max.],vmax,[km/h],[(],distanceShort,[km],[)],[!!],newline<br />
</source><br />
<br />
=== Spezielle Einträge ===<br />
*number Nummerierung<br />
* newline Neue Zeile<br />
* [Freitext] Beliebiger Text. Dieser wird ohne die Klammern übernommen.<br />
* distance Abstand des Blitzers von der Home-Koordinate (Luftlinie)<br />
* distanceShort Abstand des Blitzers von der Home-Koordinate (Luftlinie) eine Kommastelle<br />
* {OR ODER-Verknüpfung. Wenn ein Wert vorhanden ist, werden die nachfolgenden (bis zur geschweiften Klammer) nicht berücksichtigt<br />
* } Ende der ODER-Verknüpfung. Muss zwingend gesetzt werden, wenn eine ODER-Verknüpfung enthalten ist.<br />
<br />
Es können beliebig viele Werte so verknüpft werden.<br />
<br />
Welche Werte vorhanden sind, kann mit<br />
<source lang="html"><br />
get <Blitzer-Device> allReadings <Optional:Nummer><br />
</source><br />
überprüft werden. Wird eine nummer mitgegeben, werden nur die entsprechenden Einträge ausgegeben.<br />
<br />
-------------<br />
-------------<br />
-------------<br />
<br />
'''Ab hier ist veralteter Code ohne Modul, aber funktional!'''<br />
<br />
Vom gleichen Autoren gibt es mit gleicher Funktionalität nun ein inoffizielles Modul: https://forum.fhem.de/index.php/topic,90014.0.html<br />
<br />
Der [[{{PAGENAME}}|Code "Blitzer"]] (Autor: {{Link2FU|30971|bismosa}}]) ist ein Code zur listenförmigen Anzeige mobiler Geschwindigkeitsüberwachungen (Radarfallen) im Straßenverkehr. Er kann problemlos in [[FHEM Tablet UI]] genutzt werden. 2019-02 wurde es geprüft und war funktional.<br />
<br />
Es wird ausdrücklich auf den Thread {{Link2Forum|Topic=90014|LinkText=Blitzer anzeigen}} im FHEM-Forum verwiesen: Im ersten Beitrag pflegt der Autor den Code nach.<br />
<br />
==Funktionalität==<br />
Ausgehend von einer vorgegebenen Koordinate werden alle gemeldeten Blitzer im beliebigen Umkreis (bis 99 Kilometer) aufgelistet. Zusätzlich existiert ein Reading "Anzeige": "0", wenn keine Blitzer im definierten Umkreis vorliegen, "1" wenn dort Blitzer vorliegen.<br />
<br />
==Code mit Erläuterungen==<br />
<source lang="html"><br />
defmod blitzer dummy<br />
attr blitzer userattr lat lng maxkm<br />
attr blitzer icon ampel_rot<br />
attr blitzer lat 51.8644<br />
attr blitzer lng 12.6346<br />
attr blitzer maxkm 25<br />
attr blitzer stateFormat Text<br />
attr blitzer room 61 Verkehr<br />
</source><br />
<br />
Damit wird die Definition des basierenden Dummy-Devices vorgenommen. Hier ist die Mittelpunktskoordinate (lat/lon) an die eigenen Bedürfnisse anzupassen: HIer bin ich, welche Blitzer sind im Umkreis? - "maxkm" definiert den Radius um die Koordinate, in dessen Kreisfläche alle gemeldeten Blitzer gelistet werden sollen. "room" kann den eigenen Bedürfnissen angepasst werden.<br />
<br />
<source lang="html"><br />
defmod httpmod_blitzer HTTPMOD https://cdn2.atudo.net/api/1.0/vl.php?type=0,1,2,3,4,5,6&box=51.6,12.1,52.0,13.0 0<br />
attr httpmod_blitzer userattr getData getHeader1 getHeader2 getURL reading01DeleteIfUnmatched reading01JSON reading01Name reading01Regex reading02Name reading02RegOpt reading02Regex reading03JSON reading03Name readingEncode requestHeader1 requestHeader2 setParseResponse:0,1<br />
attr httpmod_blitzer enableControlSet 1<br />
attr httpmod_blitzer extractAllJSON 1<br />
attr httpmod_blitzer getHeader1 Content-Type: application/json<br />
attr httpmod_blitzer getHeader2 Accept: */*<br />
attr httpmod_blitzer readingEncode utf8<br />
attr httpmod_blitzer room 61 Verkehr<br />
</source><br />
<br />
Mit dieser Device wird die Internetabfrage definiert. Der "room" kann an eigene Befürfnisse angepasst werden. Die Definition selbst (defmod httpmod_blitzer) '''muss''' angepasst werden, es geht um den letzten Teil: "box=51.6,12.1,52.0,13.0 0". Gedanklich bildet man ein Quadrat um die Mittelpunktkoordinate. Für die ersten beiden Parameter bestimmt man die Koordinate der linken unteren Ecke. Für die beiden folgenden Parameter bestimmt man die Koordinaten der rechten oberen Ecke und trägt auch sie ein. Dabei muss man nicht sehr genau vorgehen: Ein ungefähres Rechteck reicht völlig. - Die abschließende Null '''muss''' unverändert bleiben: Der Abruf wird von einem Script gesteuert.<br />
<br />
<source lang="html"><br />
defmod at_Blitzer at +*00:10:00 {\<br />
fhem("deletereading httpmod_blitzer .*", 1);;\<br />
fhem("set httpmod_blitzer reread");;;;\<br />
fhem("sleep 2;; {getBlitzer};;");;;;\<br />
}<br />
attr at_Blitzer room 99_System<br />
</source><br />
<br />
Dieser Code-Teil sollte nicht geändert werden: Alle 10 Minuten werden alle Readings (Blitzer) gelöscht und via Web der aktuelle Stand erfragt.<br />
<br />
==99_myUtils.pm==<br />
In 99_myUtils.pm muss ein längerer Codeblock eingefügt werden. Er sollte ganz unten vor dem Codeteil<br />
<br />
<source lang="perl"><br />
1;<br />
</source><br />
stehen.<br />
<br />
<source lang="perl"><br />
################################################################<br />
### Blitzer ###<br />
################################################################<br />
sub getBlitzer(){<br />
my $httpDev = "httpmod_blitzer";<br />
my $BlitzerDev = "blitzer";<br />
my $lat = AttrVal($BlitzerDev,"lat",undef);<br />
my $lng = AttrVal($BlitzerDev,"lng",undef);<br />
my $maxkm = AttrVal($BlitzerDev,"maxkm",undef);<br />
if (!defined $lat){<br />
Log 5,"[getBlitzer] lat ist nicht definiert!"; <br />
}<br />
if (!defined $lng){<br />
Log 5,"[getBlitzer] lng ist nicht definiert!"; <br />
}<br />
if (!defined $maxkm){<br />
Log 5,"[getBlitzer] maxkm ist nicht definiert!"; <br />
}<br />
# Da unbekannt ist, wie viele es gibt...durchprobieren<br />
my @Liste;<br />
for(my $i=1;$i<100;$i++){<br />
my $num = sprintf("%02d", $i);<br />
Log 5,"[getBlitzer] Reading: $num"; <br />
my $Poi_lat = ReadingsVal($httpDev,"pois_".$num."_lat",undef);<br />
my $Poi_lng = ReadingsVal($httpDev,"pois_".$num."_lng",undef);<br />
last if !defined $Poi_lat;<br />
#Log 1,"[getBlitzer] Reading: $Poi_lat"; <br />
last if !defined $Poi_lng;<br />
Log 5,"[getBlitzer] lat/lng: $Poi_lat $Poi_lng"; <br />
my $Poi_street = ReadingsVal($httpDev,"pois_".$num."_street","keine");<br />
my $Poi_vmax = ReadingsVal($httpDev,"pois_".$num."_vmax","kA");<br />
if (!defined $Poi_vmax){<br />
$Poi_vmax = ".";<br />
}<br />
if ($Poi_vmax eq ""){<br />
$Poi_vmax = ".";<br />
}<br />
Log 5,"[getBlitzer] $Poi_street $Poi_vmax"; <br />
<br />
#Entfernung zur Home-Koordinate (Luftlinie)<br />
#Berechnung nach: https://www.kompf.de/gps/distcalc.html<br />
#Einfache Variante<br />
my $dx = 71.5 * abs($lng - $Poi_lng);<br />
my $dy = 111.3 * abs($lat - $Poi_lat);<br />
my $distance = sqrt($dx * $dx + $dy * $dy);<br />
<br />
#MaxEntfernung einbeziehen<br />
if (not $distance > $maxkm){<br />
Log 5,"[getBlitzer] distance: $distance"; <br />
push @Liste, [ $distance, $Poi_street, $Poi_vmax, $Poi_lat, $Poi_lng ]; <br />
} else {<br />
Log 5,"[getBlitzer] $distance > $maxkm"; <br />
}<br />
<br />
<br />
}<br />
my $out = join(", ", @Liste)."\n";<br />
Log 5,"[getBlitzer] $out"; <br />
my @ListeSort = sort {$a->[0] <=> $b->[0]} @Liste;<br />
$out = join(", ", @ListeSort)."\n";<br />
Log 5,"[getBlitzer] $out"; <br />
<br />
#Eintragen ins Dummy-Device<br />
#Eintragungen erst löschen<br />
fhem("deletereading $BlitzerDev .*", 1);<br />
<br />
my $Text="";<br />
my $Anzahl = scalar(@ListeSort);<br />
for (my $i=0;$i<$Anzahl;$i++) {<br />
my $num = sprintf("%02d", $i);<br />
Log 5,"[getBlitzer] Num: $num"; <br />
fhem("setreading $BlitzerDev ".$num."Entfernung ".$ListeSort[$i][0]);<br />
fhem("setreading $BlitzerDev ".$num."Strasse ".$ListeSort[$i][1]);<br />
fhem("setreading $BlitzerDev ".$num."VMax ".$ListeSort[$i][2]);<br />
<br />
#Ort<br />
fhem("sleep 1; \{getBlitzerOrte(".$ListeSort[$i][3].",".$ListeSort[$i][4].",'$num','$BlitzerDev')};");<br />
<br />
}<br />
fhem("sleep 3; \{getBlitzerText('$BlitzerDev')};");<br />
#fhem("setreading $BlitzerDev Text $Text");<br />
<br />
}<br />
sub getBlitzerOrte($$$$){<br />
#https://nominatim.openstreetmap.org/search/52.xxxxx%208.xxxx?format=json&addressdetails=1<br />
my $Poi_lat = shift;<br />
my $Poi_lng = shift;<br />
my $num = shift;<br />
$num = sprintf("%02d", $num);<br />
my $BlitzerDev = shift;<br />
<br />
<br />
my $hash = {};<br />
$hash->{'blitzerdev'} = $BlitzerDev;<br />
$hash->{'num'} = $num;<br />
my $param = {<br />
url => "https://nominatim.openstreetmap.org/reverse?format=json&lat=".$Poi_lat."&lon=".$Poi_lng,<br />
timeout => 5,<br />
method => "GET", # Lesen von Inhalten<br />
hash => $hash, # Muss gesetzt werden, damit die Callback funktion wieder $hash hat<br />
header => "",<br />
callback => \&getBlitzerOrteCallback # Diese Funktion soll das Ergebnis dieser HTTP Anfrage bearbeiten<br />
};<br />
#agent: FHEM/1.0\r\nUser-Agent: FHEM/1.0\r\nAccept: application/json<br />
<br />
HttpUtils_NonblockingGet($param); # Starten der HTTP Abfrage. Es gibt keinen Return-Code.<br />
<br />
}<br />
sub getBlitzerOrteCallback($) {<br />
my ($param, $err, $data) = @_;<br />
my $hash = $param->{hash};<br />
my $BlitzerDev = $hash->{blitzerdev};<br />
my $num = $hash->{num};<br />
<br />
if($err ne "") # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist<br />
{<br />
Log3 "[getBlitzerOrte]", 3, "error while requesting ".$param->{url}." - $err"; # Eintrag fürs Log<br />
}<br />
#Log 1,"[getBlitzerOrte] $BlitzerDev ".$param->{data}." ".$param->{url}." ".$param->{httpheader}." ".$param->{code};<br />
#Log 1,"$data";<br />
<br />
my $Stadtteil = "";<br />
my $Stadt = "";<br />
<br />
my ($Stadtteil) = $data =~ m/suburb":"([^"]+)"/;<br />
if ((!defined $Stadtteil) or ($Stadtteil eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search city_district";<br />
($Stadtteil) = $data =~ m/city_district":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadtteil";<br />
}<br />
if ((!defined $Stadtteil) or ($Stadtteil eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] $Stadtteil";<br />
Log 5, "[getBlitzerOrteCallback] ".$param->{url};<br />
Log 5, "[getBlitzerOrteCallback] $data";<br />
$Stadtteil = ".";<br />
}<br />
<br />
my ($Stadt) = $data =~ m/city":"([^"]+)"/;<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search village $data";<br />
($Stadt) = $data =~ m/town":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
}<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search village $data";<br />
($Stadt) = $data =~ m/village":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
}<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
Log 5, "[getBlitzerOrteCallback] ".$param->{url};<br />
Log 5, "[getBlitzerOrteCallback] $data";<br />
$Stadt = ".";<br />
}<br />
my ($building) = $data =~ m/building":"([^"]+)"/;<br />
if ((!defined $building) or ($building eq "")){<br />
$building = ".";<br />
}<br />
Log 5,"[getBlitzerOrteCallback] $Stadt $Stadtteil $building";<br />
#Log 1,"[getBlitzerOrte] ".$decoded_json->{address}->{suburb}->[0];<br />
if ($Stadt eq "."){$Stadt = " "};<br />
if ($Stadtteil eq "."){$Stadtteil = " "};<br />
fhem("setreading $BlitzerDev ".$num."Ort $Stadt $Stadtteil");<br />
fhem("setreading $BlitzerDev ".$num."Building $building");<br />
}<br />
sub getBlitzerText($){<br />
my $BlitzerDev = shift;<br />
my $Text="<html> <p align='left'>";<br />
my $SollAnzeige=0;<br />
for(my $i=0;$i<100;$i++){<br />
my $num = sprintf("%02d", $i);<br />
my $Entf = ReadingsVal($BlitzerDev,$num."Entfernung",undef);<br />
last if !defined $Entf;<br />
my $Ort = ReadingsVal($BlitzerDev,$num."Ort",".");<br />
if ($Ort eq "."){$Ort = " "};<br />
my $building = ReadingsVal($BlitzerDev,$num."Building",0);<br />
if ($building eq "."){$building = " "};<br />
my $Strasse = ReadingsVal($BlitzerDev,$num."Strasse"," ");<br />
my $VMax = ReadingsVal($BlitzerDev,$num."VMax"," ");<br />
if (not $Text eq "<html> <p align='left'>"){<br />
$Text = $Text."\n <br>"; <br />
}<br />
$Text = $Text."$num $Ort $Strasse $building Max $VMax km/h (".sprintf("%.1f", "$Entf")."km) !!";<br />
$SollAnzeige=1;<br />
}<br />
$Text = $Text."</p></html>";<br />
fhem("setreading $BlitzerDev Text $Text");<br />
fhem("setreading $BlitzerDev Anzeige $SollAnzeige");<br />
}<br />
</source><br />
<br />
Von besonderem Interesse ist hier die Zeile <br />
<br />
<source lang="perl"><br />
$Text = $Text."$num $Ort $Strasse $building Max $VMax km/h (".sprintf("%.1f", "$Entf")."km) !!";<br />
</source><br />
<br />
Diese Zeile kann man den eigenen Bedürfnissen anpassen, beispielhaft so:<br />
<source lang="perl"><br />
$Text = $Text."$Ort $Strasse $building $VMax km/h";<br />
</source><br />
Dieser Version ist günstiger für [[FHEM Tablet UI|FTUI]], da die Zeilenausgaben kürzer ist.<br />
<br />
==Code für FTUI==<br />
<source lang="html"><br />
<div data-type="label"<br />
data-device="blitzer"<br />
data-get="Text"><br />
</source><br />
<br />
==Hinweis==<br />
Es gibt mehrere Anpassungsvorschäge. Diese sind im Forum zu finden: {{Link2Forum|Topic=90014|LinkText=Blitzer anzeigen}}. Fragen zum Code bitte dort stellen.<br />
<br />
Screenshot fehlt<br />
<br />
[[Kategorie:Code_Snippets]]<br />
[[Kategorie:FHEM Tablet UI|Blitzer]]</div>Curthttp://wiki.fhem.de/w/index.php?title=Stra%C3%9Fenverkehr_Blitzer&diff=30079Straßenverkehr Blitzer2019-04-03T18:17:40Z<p>Curt: </p>
<hr />
<div>@Wiki-Admin: <br />
* Link auf bismosa fehlt<br />
* Link auf https://forum.fhem.de/index.php/topic,99070.0.html fehlt{{Baustelle}} <br />
<br />
{{Infobox Modul|<br />
|ModPurpose=Geschwindigkeitsüberwachung Blitzer<br />
|ModType=x<br />
|ModCmdRef=blitzer<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=98_Blitzer.pm<br />
|ModOwner=bismosa<br />
}}<br />
<br />
'''Straßenverkehr Blitzer''' ist ein Modul, welches mobile Verkehrsüberwachungsanlagen (aka Blitzer) ein Internet Portal abfragt und für den Umkreis des eigenen Standorts listenförmig im Straßenverkehr innerhalb Deutschlands auflistet - bezogen auf eine anzugebende Koordinate, um den Radius um diese Koordinate.<br />
<br />
== Features ==<br />
* Die Ausgabe frei über Attribute konfigurierbar<br />
* HTML-Code bzw. plaintext einstellbar<br />
* Es kann mit einem set <Blitzer-Device> Update <Optional:LAT> <Optional:LONG> auch eine neue Koordinate vorgegeben werden.<br />
* Der Bereich, der bei Verkehrslage.de abgefragt wird, kann vom Modul berechnet werden.<br />
* Es kann ein Reading erzeugt werden, welches bei vorhanden Blitzern eine "1" und sonst eine "0" anzeigt (praktisch z.B. um in FTUI Bereiche auszublenden, wenn kein Blitzer gemeldet wurde).<br />
* Es kann die maximale Anzahl an anzuzeigenden Blitzern festgelegt werden.<br />
* Es kann ein Text festgelegt werden, wenn kein Blitzer in der Nähe ist.<br />
<br />
== Modul integrieren ==<br />
Das Modul ist in jeweils aktueller Version auf Github verfügbar. Es ist zunächst in den FHEM-Update-Prozess zu integieren:<br />
<br />
<source lang="html"><br />
update add https://raw.githubusercontent.com/bismosa/FHEM/master/controls_all.txt<br />
update check<br />
update all<br />
</source><br />
<br />
== Definition ==<br />
<source lang="html"><br />
define <Name> Blitzer <Interval><br />
</source><br />
Das Intervall hat die Basis "Minuten". Sofern kein Intervall angegeben ist, wird nicht automatisch aktualisiert.<br />
<br />
Sodann ist '''wesentlich''', dass die gewünschte Ausgangskoordinate sowie der gewünschte Radius in den Attributen gesetzt werden, beispielhaft:<br />
<source lang="html"><br />
attr <Name> home_latitude 51.8<br />
attr <Name> home_longitude 12.6346<br />
attr <Name> radius 25<br />
</source><br />
<br />
== Formatierung der Ausgabe ==<br />
<br />
Über das Attribut "Ausgabe" wird gesteuert, welche je Blitzer verfügbaren Informationen ausgegeben werden sollen. Ein Beispiel mit wenigen Informationen, für den ländlichen Raum geeignet:<br />
<source lang="html"><br />
attr <Name> Ausgabe {OR,suburb,city_district,town,village,},road,building,vmax,[km/h],newline<br />
</source><br />
<br />
Ein Beispiel für den großstädtischen Raum:<br />
<source lang="html"><br />
attr <Name> Ausgabe number,{OR,suburb,city_district,town,village,},road,building,[Max.],vmax,[km/h],[(],distanceShort,[km],[)],[!!],newline<br />
</source><br />
<br />
=== Spezielle Einträge ===<br />
*number Nummerierung<br />
* newline Neue Zeile<br />
* [Freitext] Beliebiger Text. Dieser wird ohne die Klammern übernommen.<br />
* distance Abstand des Blitzers von der Home-Koordinate (Luftlinie)<br />
* distanceShort Abstand des Blitzers von der Home-Koordinate (Luftlinie) eine Kommastelle<br />
* {OR ODER-Verknüpfung. Wenn ein Wert vorhanden ist, werden die nachfolgenden (bis zur geschweiften Klammer) nicht berücksichtigt<br />
* } Ende der ODER-Verknüpfung. Muss zwingend gesetzt werden, wenn eine ODER-Verknüpfung enthalten ist.<br />
<br />
Es können beliebig viele Werte so verknüpft werden.<br />
<br />
Welche Werte vorhanden sind, kann mit<br />
<source lang="html"><br />
get <Blitzer-Device> allReadings <Optional:Nummer><br />
</source><br />
überprüft werden. Wird eine nummer mitgegeben, werden nur die entsprechenden Einträge ausgegeben.<br />
<br />
-------------<br />
-------------<br />
-------------<br />
<br />
'''Ab hier ist veralteter Code ohne Modul, aber funktional!'''<br />
<br />
Vom gleichen Autoren gibt es mit gleicher Funktionalität nun ein inoffizielles Modul: https://forum.fhem.de/index.php/topic,90014.0.html<br />
<br />
Der [[{{PAGENAME}}|Code "Blitzer"]] (Autor: {{Link2FU|30971|bismosa}}]) ist ein Code zur listenförmigen Anzeige mobiler Geschwindigkeitsüberwachungen (Radarfallen) im Straßenverkehr. Er kann problemlos in [[FHEM Tablet UI]] genutzt werden. 2019-02 wurde es geprüft und war funktional.<br />
<br />
Es wird ausdrücklich auf den Thread {{Link2Forum|Topic=90014|LinkText=Blitzer anzeigen}} im FHEM-Forum verwiesen: Im ersten Beitrag pflegt der Autor den Code nach.<br />
<br />
==Funktionalität==<br />
Ausgehend von einer vorgegebenen Koordinate werden alle gemeldeten Blitzer im beliebigen Umkreis (bis 99 Kilometer) aufgelistet. Zusätzlich existiert ein Reading "Anzeige": "0", wenn keine Blitzer im definierten Umkreis vorliegen, "1" wenn dort Blitzer vorliegen.<br />
<br />
==Code mit Erläuterungen==<br />
<source lang="html"><br />
defmod blitzer dummy<br />
attr blitzer userattr lat lng maxkm<br />
attr blitzer icon ampel_rot<br />
attr blitzer lat 51.8644<br />
attr blitzer lng 12.6346<br />
attr blitzer maxkm 25<br />
attr blitzer stateFormat Text<br />
attr blitzer room 61 Verkehr<br />
</source><br />
<br />
Damit wird die Definition des basierenden Dummy-Devices vorgenommen. Hier ist die Mittelpunktskoordinate (lat/lon) an die eigenen Bedürfnisse anzupassen: HIer bin ich, welche Blitzer sind im Umkreis? - "maxkm" definiert den Radius um die Koordinate, in dessen Kreisfläche alle gemeldeten Blitzer gelistet werden sollen. "room" kann den eigenen Bedürfnissen angepasst werden.<br />
<br />
<source lang="html"><br />
defmod httpmod_blitzer HTTPMOD https://cdn2.atudo.net/api/1.0/vl.php?type=0,1,2,3,4,5,6&box=51.6,12.1,52.0,13.0 0<br />
attr httpmod_blitzer userattr getData getHeader1 getHeader2 getURL reading01DeleteIfUnmatched reading01JSON reading01Name reading01Regex reading02Name reading02RegOpt reading02Regex reading03JSON reading03Name readingEncode requestHeader1 requestHeader2 setParseResponse:0,1<br />
attr httpmod_blitzer enableControlSet 1<br />
attr httpmod_blitzer extractAllJSON 1<br />
attr httpmod_blitzer getHeader1 Content-Type: application/json<br />
attr httpmod_blitzer getHeader2 Accept: */*<br />
attr httpmod_blitzer readingEncode utf8<br />
attr httpmod_blitzer room 61 Verkehr<br />
</source><br />
<br />
Mit dieser Device wird die Internetabfrage definiert. Der "room" kann an eigene Befürfnisse angepasst werden. Die Definition selbst (defmod httpmod_blitzer) '''muss''' angepasst werden, es geht um den letzten Teil: "box=51.6,12.1,52.0,13.0 0". Gedanklich bildet man ein Quadrat um die Mittelpunktkoordinate. Für die ersten beiden Parameter bestimmt man die Koordinate der linken unteren Ecke. Für die beiden folgenden Parameter bestimmt man die Koordinaten der rechten oberen Ecke und trägt auch sie ein. Dabei muss man nicht sehr genau vorgehen: Ein ungefähres Rechteck reicht völlig. - Die abschließende Null '''muss''' unverändert bleiben: Der Abruf wird von einem Script gesteuert.<br />
<br />
<source lang="html"><br />
defmod at_Blitzer at +*00:10:00 {\<br />
fhem("deletereading httpmod_blitzer .*", 1);;\<br />
fhem("set httpmod_blitzer reread");;;;\<br />
fhem("sleep 2;; {getBlitzer};;");;;;\<br />
}<br />
attr at_Blitzer room 99_System<br />
</source><br />
<br />
Dieser Code-Teil sollte nicht geändert werden: Alle 10 Minuten werden alle Readings (Blitzer) gelöscht und via Web der aktuelle Stand erfragt.<br />
<br />
==99_myUtils.pm==<br />
In 99_myUtils.pm muss ein längerer Codeblock eingefügt werden. Er sollte ganz unten vor dem Codeteil<br />
<br />
<source lang="perl"><br />
1;<br />
</source><br />
stehen.<br />
<br />
<source lang="perl"><br />
################################################################<br />
### Blitzer ###<br />
################################################################<br />
sub getBlitzer(){<br />
my $httpDev = "httpmod_blitzer";<br />
my $BlitzerDev = "blitzer";<br />
my $lat = AttrVal($BlitzerDev,"lat",undef);<br />
my $lng = AttrVal($BlitzerDev,"lng",undef);<br />
my $maxkm = AttrVal($BlitzerDev,"maxkm",undef);<br />
if (!defined $lat){<br />
Log 5,"[getBlitzer] lat ist nicht definiert!"; <br />
}<br />
if (!defined $lng){<br />
Log 5,"[getBlitzer] lng ist nicht definiert!"; <br />
}<br />
if (!defined $maxkm){<br />
Log 5,"[getBlitzer] maxkm ist nicht definiert!"; <br />
}<br />
# Da unbekannt ist, wie viele es gibt...durchprobieren<br />
my @Liste;<br />
for(my $i=1;$i<100;$i++){<br />
my $num = sprintf("%02d", $i);<br />
Log 5,"[getBlitzer] Reading: $num"; <br />
my $Poi_lat = ReadingsVal($httpDev,"pois_".$num."_lat",undef);<br />
my $Poi_lng = ReadingsVal($httpDev,"pois_".$num."_lng",undef);<br />
last if !defined $Poi_lat;<br />
#Log 1,"[getBlitzer] Reading: $Poi_lat"; <br />
last if !defined $Poi_lng;<br />
Log 5,"[getBlitzer] lat/lng: $Poi_lat $Poi_lng"; <br />
my $Poi_street = ReadingsVal($httpDev,"pois_".$num."_street","keine");<br />
my $Poi_vmax = ReadingsVal($httpDev,"pois_".$num."_vmax","kA");<br />
if (!defined $Poi_vmax){<br />
$Poi_vmax = ".";<br />
}<br />
if ($Poi_vmax eq ""){<br />
$Poi_vmax = ".";<br />
}<br />
Log 5,"[getBlitzer] $Poi_street $Poi_vmax"; <br />
<br />
#Entfernung zur Home-Koordinate (Luftlinie)<br />
#Berechnung nach: https://www.kompf.de/gps/distcalc.html<br />
#Einfache Variante<br />
my $dx = 71.5 * abs($lng - $Poi_lng);<br />
my $dy = 111.3 * abs($lat - $Poi_lat);<br />
my $distance = sqrt($dx * $dx + $dy * $dy);<br />
<br />
#MaxEntfernung einbeziehen<br />
if (not $distance > $maxkm){<br />
Log 5,"[getBlitzer] distance: $distance"; <br />
push @Liste, [ $distance, $Poi_street, $Poi_vmax, $Poi_lat, $Poi_lng ]; <br />
} else {<br />
Log 5,"[getBlitzer] $distance > $maxkm"; <br />
}<br />
<br />
<br />
}<br />
my $out = join(", ", @Liste)."\n";<br />
Log 5,"[getBlitzer] $out"; <br />
my @ListeSort = sort {$a->[0] <=> $b->[0]} @Liste;<br />
$out = join(", ", @ListeSort)."\n";<br />
Log 5,"[getBlitzer] $out"; <br />
<br />
#Eintragen ins Dummy-Device<br />
#Eintragungen erst löschen<br />
fhem("deletereading $BlitzerDev .*", 1);<br />
<br />
my $Text="";<br />
my $Anzahl = scalar(@ListeSort);<br />
for (my $i=0;$i<$Anzahl;$i++) {<br />
my $num = sprintf("%02d", $i);<br />
Log 5,"[getBlitzer] Num: $num"; <br />
fhem("setreading $BlitzerDev ".$num."Entfernung ".$ListeSort[$i][0]);<br />
fhem("setreading $BlitzerDev ".$num."Strasse ".$ListeSort[$i][1]);<br />
fhem("setreading $BlitzerDev ".$num."VMax ".$ListeSort[$i][2]);<br />
<br />
#Ort<br />
fhem("sleep 1; \{getBlitzerOrte(".$ListeSort[$i][3].",".$ListeSort[$i][4].",'$num','$BlitzerDev')};");<br />
<br />
}<br />
fhem("sleep 3; \{getBlitzerText('$BlitzerDev')};");<br />
#fhem("setreading $BlitzerDev Text $Text");<br />
<br />
}<br />
sub getBlitzerOrte($$$$){<br />
#https://nominatim.openstreetmap.org/search/52.xxxxx%208.xxxx?format=json&addressdetails=1<br />
my $Poi_lat = shift;<br />
my $Poi_lng = shift;<br />
my $num = shift;<br />
$num = sprintf("%02d", $num);<br />
my $BlitzerDev = shift;<br />
<br />
<br />
my $hash = {};<br />
$hash->{'blitzerdev'} = $BlitzerDev;<br />
$hash->{'num'} = $num;<br />
my $param = {<br />
url => "https://nominatim.openstreetmap.org/reverse?format=json&lat=".$Poi_lat."&lon=".$Poi_lng,<br />
timeout => 5,<br />
method => "GET", # Lesen von Inhalten<br />
hash => $hash, # Muss gesetzt werden, damit die Callback funktion wieder $hash hat<br />
header => "",<br />
callback => \&getBlitzerOrteCallback # Diese Funktion soll das Ergebnis dieser HTTP Anfrage bearbeiten<br />
};<br />
#agent: FHEM/1.0\r\nUser-Agent: FHEM/1.0\r\nAccept: application/json<br />
<br />
HttpUtils_NonblockingGet($param); # Starten der HTTP Abfrage. Es gibt keinen Return-Code.<br />
<br />
}<br />
sub getBlitzerOrteCallback($) {<br />
my ($param, $err, $data) = @_;<br />
my $hash = $param->{hash};<br />
my $BlitzerDev = $hash->{blitzerdev};<br />
my $num = $hash->{num};<br />
<br />
if($err ne "") # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist<br />
{<br />
Log3 "[getBlitzerOrte]", 3, "error while requesting ".$param->{url}." - $err"; # Eintrag fürs Log<br />
}<br />
#Log 1,"[getBlitzerOrte] $BlitzerDev ".$param->{data}." ".$param->{url}." ".$param->{httpheader}." ".$param->{code};<br />
#Log 1,"$data";<br />
<br />
my $Stadtteil = "";<br />
my $Stadt = "";<br />
<br />
my ($Stadtteil) = $data =~ m/suburb":"([^"]+)"/;<br />
if ((!defined $Stadtteil) or ($Stadtteil eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search city_district";<br />
($Stadtteil) = $data =~ m/city_district":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadtteil";<br />
}<br />
if ((!defined $Stadtteil) or ($Stadtteil eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] $Stadtteil";<br />
Log 5, "[getBlitzerOrteCallback] ".$param->{url};<br />
Log 5, "[getBlitzerOrteCallback] $data";<br />
$Stadtteil = ".";<br />
}<br />
<br />
my ($Stadt) = $data =~ m/city":"([^"]+)"/;<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search village $data";<br />
($Stadt) = $data =~ m/town":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
}<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search village $data";<br />
($Stadt) = $data =~ m/village":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
}<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
Log 5, "[getBlitzerOrteCallback] ".$param->{url};<br />
Log 5, "[getBlitzerOrteCallback] $data";<br />
$Stadt = ".";<br />
}<br />
my ($building) = $data =~ m/building":"([^"]+)"/;<br />
if ((!defined $building) or ($building eq "")){<br />
$building = ".";<br />
}<br />
Log 5,"[getBlitzerOrteCallback] $Stadt $Stadtteil $building";<br />
#Log 1,"[getBlitzerOrte] ".$decoded_json->{address}->{suburb}->[0];<br />
if ($Stadt eq "."){$Stadt = " "};<br />
if ($Stadtteil eq "."){$Stadtteil = " "};<br />
fhem("setreading $BlitzerDev ".$num."Ort $Stadt $Stadtteil");<br />
fhem("setreading $BlitzerDev ".$num."Building $building");<br />
}<br />
sub getBlitzerText($){<br />
my $BlitzerDev = shift;<br />
my $Text="<html> <p align='left'>";<br />
my $SollAnzeige=0;<br />
for(my $i=0;$i<100;$i++){<br />
my $num = sprintf("%02d", $i);<br />
my $Entf = ReadingsVal($BlitzerDev,$num."Entfernung",undef);<br />
last if !defined $Entf;<br />
my $Ort = ReadingsVal($BlitzerDev,$num."Ort",".");<br />
if ($Ort eq "."){$Ort = " "};<br />
my $building = ReadingsVal($BlitzerDev,$num."Building",0);<br />
if ($building eq "."){$building = " "};<br />
my $Strasse = ReadingsVal($BlitzerDev,$num."Strasse"," ");<br />
my $VMax = ReadingsVal($BlitzerDev,$num."VMax"," ");<br />
if (not $Text eq "<html> <p align='left'>"){<br />
$Text = $Text."\n <br>"; <br />
}<br />
$Text = $Text."$num $Ort $Strasse $building Max $VMax km/h (".sprintf("%.1f", "$Entf")."km) !!";<br />
$SollAnzeige=1;<br />
}<br />
$Text = $Text."</p></html>";<br />
fhem("setreading $BlitzerDev Text $Text");<br />
fhem("setreading $BlitzerDev Anzeige $SollAnzeige");<br />
}<br />
</source><br />
<br />
Von besonderem Interesse ist hier die Zeile <br />
<br />
<source lang="perl"><br />
$Text = $Text."$num $Ort $Strasse $building Max $VMax km/h (".sprintf("%.1f", "$Entf")."km) !!";<br />
</source><br />
<br />
Diese Zeile kann man den eigenen Bedürfnissen anpassen, beispielhaft so:<br />
<source lang="perl"><br />
$Text = $Text."$Ort $Strasse $building $VMax km/h";<br />
</source><br />
Dieser Version ist günstiger für [[FHEM Tablet UI|FTUI]], da die Zeilenausgaben kürzer ist.<br />
<br />
==Code für FTUI==<br />
<source lang="html"><br />
<div data-type="label"<br />
data-device="blitzer"<br />
data-get="Text"><br />
</source><br />
<br />
==Hinweis==<br />
Es gibt mehrere Anpassungsvorschäge. Diese sind im Forum zu finden: {{Link2Forum|Topic=90014|LinkText=Blitzer anzeigen}}. Fragen zum Code bitte dort stellen.<br />
<br />
Screenshot fehlt<br />
<br />
[[Kategorie:Code_Snippets]]<br />
[[Kategorie:FHEM Tablet UI|Blitzer]]</div>Curthttp://wiki.fhem.de/w/index.php?title=Stra%C3%9Fenverkehr_Blitzer&diff=30078Straßenverkehr Blitzer2019-04-03T18:15:49Z<p>Curt: </p>
<hr />
<div>@Wiki-Admin: <br />
* Link auf bismosa fehlt<br />
* Link auf https://forum.fhem.de/index.php/topic,99070.0.html fehlt{{Baustelle}} <br />
<br />
{{Infobox Modul|<br />
|ModPurpose=Geschwindigkeitsüberwachung Blitzer<br />
|ModType=x<br />
|ModCmdRef=blitzer<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=98_Blitzer.pm<br />
|ModOwner=bismosa<br />
}}<br />
<br />
'''Straßenverkehr Blitzer''' ist ein Modul, welches mobile Verkehrsüberwachungsanlagen (aka Blitzer) ein Internet Portal abfragt und für den Umkreis des eigenen Standorts listenförmig im Straßenverkehr innerhalb Deutschlands auflistet - bezogen auf eine anzugebende Koordinate, um den Radius um diese Koordinate.<br />
<br />
== Features ==<br />
* Die Ausgabe frei über Attribute konfigurierbar<br />
* HTML-Code bzw. plaintext einstellbar<br />
* Es kann mit einem set <Blitzer-Device> Update <Optional:LAT> <Optional:LONG> auch eine neue Koordinate vorgegeben werden.<br />
* Der Bereich, der bei Verkehrslage.de abgefragt wird, kann vom Modul berechnet werden.<br />
* Es kann ein Reading erzeugt werden, welches bei vorhanden Blitzern eine "1" und sonst eine "0" anzeigt (praktisch z.B. um in FTUI Bereiche auszublenden, wenn kein Blitzer gemeldet wurde).<br />
* Es kann die maximale Anzahl an anzuzeigenden Blitzern festgelegt werden.<br />
* Es kann ein Text festgelegt werden, wenn kein Blitzer in der Nähe ist.<br />
<br />
== Modul integrieren ==<br />
Das Modul ist in jeweils aktueller Version auf Github verfügbar. Es ist zunächst in den FHEM-Update-Prozess zu integieren:<br />
<br />
<source lang="html"><br />
update add https://raw.githubusercontent.com/bismosa/FHEM/master/controls_all.txt<br />
update check<br />
update all<br />
</source><br />
<br />
== Definition ==<br />
<source lang="html"><br />
define <Name> Blitzer <Interval><br />
</source><br />
Das Intervall hat die Basis "Minuten". Sofern kein Intervall angegeben ist, wird nicht automatisch aktualisiert.<br />
<br />
Sodann ist '''wesentlich''', dass die gewünschte Ausgangskoordinate sowie der gewünschte Radius in den Attributen gesetzt werden, beispielhaft:<br />
<source lang="html"><br />
attr <Name> home_latitude 51.8<br />
attr <Name> home_longitude 12.6346<br />
attr <Name> radius 25<br />
</source><br />
<br />
== Formatierung der Ausgabe ==<br />
<br />
Über das Attribut "Ausgabe" wird gesteuert, welche je Blitzer verfügbaren Informationen ausgegeben werden sollen. Ein Beispiel mit wenigen Informationen, für den ländlichen Raum geeignet:<br />
<source lang="html"><br />
attr <Name> Ausgabe {OR,suburb,city_district,town,village,},road,building,vmax,[km/h],newline<br />
</source><br />
<br />
Ein Beispiel für den großstädtischen Raum:<br />
<source lang="html"><br />
attr <Name> Ausgabe number,{OR,suburb,city_district,town,village,},road,building,[Max.],vmax,[km/h],[(],distanceShort,[km],[)],[!!],newline<br />
</source><br />
<br />
=== Spezielle Einträge ===<br />
*number Nummerierung<br />
* newline Neue Zeile<br />
* [Freitext] Beliebiger Text. Dieser wird ohne die Klammern übernommen.<br />
* distance Abstand des Blitzers von der Home-Koordinate (Luftlinie)<br />
* distanceShort Abstand des Blitzers von der Home-Koordinate (Luftlinie) eine Kommastelle<br />
* {OR ODER-Verknüpfung. Wenn ein Wert vorhanden ist, werden die nachfolgenden (bis zur geschweiften Klammer) nicht berücksichtigt<br />
* } Ende der ODER-Verknüpfung. Muss zwingend gesetzt werden, wenn eine ODER-Verknüpfung enthalten ist.<br />
<br />
Es können beliebig viele Werte so verknüpft werden.<br />
<br />
Welche Werte vorhanden sind, kann mit<br />
<source lang="html"><br />
get <Blitzer-Device> allReadings <Optional:Nummer><br />
</source><br />
überprüft werden. Wird eine nummer mitgegeben, werden nur die entsprechenden Einträge ausgegeben.<br />
<br />
-------------<br />
<br />
'''Ab hier ist veralteter Code ohne Modul, aber funktional!'''<br />
<br />
Vom gleichen Autoren gibt es mit gleicher Funktionalität nun ein inoffizielles Modul: https://forum.fhem.de/index.php/topic,90014.0.html<br />
<br />
Der [[{{PAGENAME}}|Code "Blitzer"]] (Autor: {{Link2FU|30971|bismosa}}]) ist ein Code zur listenförmigen Anzeige mobiler Geschwindigkeitsüberwachungen (Radarfallen) im Straßenverkehr. Er kann problemlos in [[FHEM Tablet UI]] genutzt werden. 2019-02 wurde es geprüft und war funktional.<br />
<br />
Es wird ausdrücklich auf den Thread {{Link2Forum|Topic=90014|LinkText=Blitzer anzeigen}} im FHEM-Forum verwiesen: Im ersten Beitrag pflegt der Autor den Code nach.<br />
<br />
==Funktionalität==<br />
Ausgehend von einer vorgegebenen Koordinate werden alle gemeldeten Blitzer im beliebigen Umkreis (bis 99 Kilometer) aufgelistet. Zusätzlich existiert ein Reading "Anzeige": "0", wenn keine Blitzer im definierten Umkreis vorliegen, "1" wenn dort Blitzer vorliegen.<br />
<br />
==Code mit Erläuterungen==<br />
<source lang="html"><br />
defmod blitzer dummy<br />
attr blitzer userattr lat lng maxkm<br />
attr blitzer icon ampel_rot<br />
attr blitzer lat 51.8644<br />
attr blitzer lng 12.6346<br />
attr blitzer maxkm 25<br />
attr blitzer stateFormat Text<br />
attr blitzer room 61 Verkehr<br />
</source><br />
<br />
Damit wird die Definition des basierenden Dummy-Devices vorgenommen. Hier ist die Mittelpunktskoordinate (lat/lon) an die eigenen Bedürfnisse anzupassen: HIer bin ich, welche Blitzer sind im Umkreis? - "maxkm" definiert den Radius um die Koordinate, in dessen Kreisfläche alle gemeldeten Blitzer gelistet werden sollen. "room" kann den eigenen Bedürfnissen angepasst werden.<br />
<br />
<source lang="html"><br />
defmod httpmod_blitzer HTTPMOD https://cdn2.atudo.net/api/1.0/vl.php?type=0,1,2,3,4,5,6&box=51.6,12.1,52.0,13.0 0<br />
attr httpmod_blitzer userattr getData getHeader1 getHeader2 getURL reading01DeleteIfUnmatched reading01JSON reading01Name reading01Regex reading02Name reading02RegOpt reading02Regex reading03JSON reading03Name readingEncode requestHeader1 requestHeader2 setParseResponse:0,1<br />
attr httpmod_blitzer enableControlSet 1<br />
attr httpmod_blitzer extractAllJSON 1<br />
attr httpmod_blitzer getHeader1 Content-Type: application/json<br />
attr httpmod_blitzer getHeader2 Accept: */*<br />
attr httpmod_blitzer readingEncode utf8<br />
attr httpmod_blitzer room 61 Verkehr<br />
</source><br />
<br />
Mit dieser Device wird die Internetabfrage definiert. Der "room" kann an eigene Befürfnisse angepasst werden. Die Definition selbst (defmod httpmod_blitzer) '''muss''' angepasst werden, es geht um den letzten Teil: "box=51.6,12.1,52.0,13.0 0". Gedanklich bildet man ein Quadrat um die Mittelpunktkoordinate. Für die ersten beiden Parameter bestimmt man die Koordinate der linken unteren Ecke. Für die beiden folgenden Parameter bestimmt man die Koordinaten der rechten oberen Ecke und trägt auch sie ein. Dabei muss man nicht sehr genau vorgehen: Ein ungefähres Rechteck reicht völlig. - Die abschließende Null '''muss''' unverändert bleiben: Der Abruf wird von einem Script gesteuert.<br />
<br />
<source lang="html"><br />
defmod at_Blitzer at +*00:10:00 {\<br />
fhem("deletereading httpmod_blitzer .*", 1);;\<br />
fhem("set httpmod_blitzer reread");;;;\<br />
fhem("sleep 2;; {getBlitzer};;");;;;\<br />
}<br />
attr at_Blitzer room 99_System<br />
</source><br />
<br />
Dieser Code-Teil sollte nicht geändert werden: Alle 10 Minuten werden alle Readings (Blitzer) gelöscht und via Web der aktuelle Stand erfragt.<br />
<br />
==99_myUtils.pm==<br />
In 99_myUtils.pm muss ein längerer Codeblock eingefügt werden. Er sollte ganz unten vor dem Codeteil<br />
<br />
<source lang="perl"><br />
1;<br />
</source><br />
stehen.<br />
<br />
<source lang="perl"><br />
################################################################<br />
### Blitzer ###<br />
################################################################<br />
sub getBlitzer(){<br />
my $httpDev = "httpmod_blitzer";<br />
my $BlitzerDev = "blitzer";<br />
my $lat = AttrVal($BlitzerDev,"lat",undef);<br />
my $lng = AttrVal($BlitzerDev,"lng",undef);<br />
my $maxkm = AttrVal($BlitzerDev,"maxkm",undef);<br />
if (!defined $lat){<br />
Log 5,"[getBlitzer] lat ist nicht definiert!"; <br />
}<br />
if (!defined $lng){<br />
Log 5,"[getBlitzer] lng ist nicht definiert!"; <br />
}<br />
if (!defined $maxkm){<br />
Log 5,"[getBlitzer] maxkm ist nicht definiert!"; <br />
}<br />
# Da unbekannt ist, wie viele es gibt...durchprobieren<br />
my @Liste;<br />
for(my $i=1;$i<100;$i++){<br />
my $num = sprintf("%02d", $i);<br />
Log 5,"[getBlitzer] Reading: $num"; <br />
my $Poi_lat = ReadingsVal($httpDev,"pois_".$num."_lat",undef);<br />
my $Poi_lng = ReadingsVal($httpDev,"pois_".$num."_lng",undef);<br />
last if !defined $Poi_lat;<br />
#Log 1,"[getBlitzer] Reading: $Poi_lat"; <br />
last if !defined $Poi_lng;<br />
Log 5,"[getBlitzer] lat/lng: $Poi_lat $Poi_lng"; <br />
my $Poi_street = ReadingsVal($httpDev,"pois_".$num."_street","keine");<br />
my $Poi_vmax = ReadingsVal($httpDev,"pois_".$num."_vmax","kA");<br />
if (!defined $Poi_vmax){<br />
$Poi_vmax = ".";<br />
}<br />
if ($Poi_vmax eq ""){<br />
$Poi_vmax = ".";<br />
}<br />
Log 5,"[getBlitzer] $Poi_street $Poi_vmax"; <br />
<br />
#Entfernung zur Home-Koordinate (Luftlinie)<br />
#Berechnung nach: https://www.kompf.de/gps/distcalc.html<br />
#Einfache Variante<br />
my $dx = 71.5 * abs($lng - $Poi_lng);<br />
my $dy = 111.3 * abs($lat - $Poi_lat);<br />
my $distance = sqrt($dx * $dx + $dy * $dy);<br />
<br />
#MaxEntfernung einbeziehen<br />
if (not $distance > $maxkm){<br />
Log 5,"[getBlitzer] distance: $distance"; <br />
push @Liste, [ $distance, $Poi_street, $Poi_vmax, $Poi_lat, $Poi_lng ]; <br />
} else {<br />
Log 5,"[getBlitzer] $distance > $maxkm"; <br />
}<br />
<br />
<br />
}<br />
my $out = join(", ", @Liste)."\n";<br />
Log 5,"[getBlitzer] $out"; <br />
my @ListeSort = sort {$a->[0] <=> $b->[0]} @Liste;<br />
$out = join(", ", @ListeSort)."\n";<br />
Log 5,"[getBlitzer] $out"; <br />
<br />
#Eintragen ins Dummy-Device<br />
#Eintragungen erst löschen<br />
fhem("deletereading $BlitzerDev .*", 1);<br />
<br />
my $Text="";<br />
my $Anzahl = scalar(@ListeSort);<br />
for (my $i=0;$i<$Anzahl;$i++) {<br />
my $num = sprintf("%02d", $i);<br />
Log 5,"[getBlitzer] Num: $num"; <br />
fhem("setreading $BlitzerDev ".$num."Entfernung ".$ListeSort[$i][0]);<br />
fhem("setreading $BlitzerDev ".$num."Strasse ".$ListeSort[$i][1]);<br />
fhem("setreading $BlitzerDev ".$num."VMax ".$ListeSort[$i][2]);<br />
<br />
#Ort<br />
fhem("sleep 1; \{getBlitzerOrte(".$ListeSort[$i][3].",".$ListeSort[$i][4].",'$num','$BlitzerDev')};");<br />
<br />
}<br />
fhem("sleep 3; \{getBlitzerText('$BlitzerDev')};");<br />
#fhem("setreading $BlitzerDev Text $Text");<br />
<br />
}<br />
sub getBlitzerOrte($$$$){<br />
#https://nominatim.openstreetmap.org/search/52.xxxxx%208.xxxx?format=json&addressdetails=1<br />
my $Poi_lat = shift;<br />
my $Poi_lng = shift;<br />
my $num = shift;<br />
$num = sprintf("%02d", $num);<br />
my $BlitzerDev = shift;<br />
<br />
<br />
my $hash = {};<br />
$hash->{'blitzerdev'} = $BlitzerDev;<br />
$hash->{'num'} = $num;<br />
my $param = {<br />
url => "https://nominatim.openstreetmap.org/reverse?format=json&lat=".$Poi_lat."&lon=".$Poi_lng,<br />
timeout => 5,<br />
method => "GET", # Lesen von Inhalten<br />
hash => $hash, # Muss gesetzt werden, damit die Callback funktion wieder $hash hat<br />
header => "",<br />
callback => \&getBlitzerOrteCallback # Diese Funktion soll das Ergebnis dieser HTTP Anfrage bearbeiten<br />
};<br />
#agent: FHEM/1.0\r\nUser-Agent: FHEM/1.0\r\nAccept: application/json<br />
<br />
HttpUtils_NonblockingGet($param); # Starten der HTTP Abfrage. Es gibt keinen Return-Code.<br />
<br />
}<br />
sub getBlitzerOrteCallback($) {<br />
my ($param, $err, $data) = @_;<br />
my $hash = $param->{hash};<br />
my $BlitzerDev = $hash->{blitzerdev};<br />
my $num = $hash->{num};<br />
<br />
if($err ne "") # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist<br />
{<br />
Log3 "[getBlitzerOrte]", 3, "error while requesting ".$param->{url}." - $err"; # Eintrag fürs Log<br />
}<br />
#Log 1,"[getBlitzerOrte] $BlitzerDev ".$param->{data}." ".$param->{url}." ".$param->{httpheader}." ".$param->{code};<br />
#Log 1,"$data";<br />
<br />
my $Stadtteil = "";<br />
my $Stadt = "";<br />
<br />
my ($Stadtteil) = $data =~ m/suburb":"([^"]+)"/;<br />
if ((!defined $Stadtteil) or ($Stadtteil eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search city_district";<br />
($Stadtteil) = $data =~ m/city_district":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadtteil";<br />
}<br />
if ((!defined $Stadtteil) or ($Stadtteil eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] $Stadtteil";<br />
Log 5, "[getBlitzerOrteCallback] ".$param->{url};<br />
Log 5, "[getBlitzerOrteCallback] $data";<br />
$Stadtteil = ".";<br />
}<br />
<br />
my ($Stadt) = $data =~ m/city":"([^"]+)"/;<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search village $data";<br />
($Stadt) = $data =~ m/town":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
}<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search village $data";<br />
($Stadt) = $data =~ m/village":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
}<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
Log 5, "[getBlitzerOrteCallback] ".$param->{url};<br />
Log 5, "[getBlitzerOrteCallback] $data";<br />
$Stadt = ".";<br />
}<br />
my ($building) = $data =~ m/building":"([^"]+)"/;<br />
if ((!defined $building) or ($building eq "")){<br />
$building = ".";<br />
}<br />
Log 5,"[getBlitzerOrteCallback] $Stadt $Stadtteil $building";<br />
#Log 1,"[getBlitzerOrte] ".$decoded_json->{address}->{suburb}->[0];<br />
if ($Stadt eq "."){$Stadt = " "};<br />
if ($Stadtteil eq "."){$Stadtteil = " "};<br />
fhem("setreading $BlitzerDev ".$num."Ort $Stadt $Stadtteil");<br />
fhem("setreading $BlitzerDev ".$num."Building $building");<br />
}<br />
sub getBlitzerText($){<br />
my $BlitzerDev = shift;<br />
my $Text="<html> <p align='left'>";<br />
my $SollAnzeige=0;<br />
for(my $i=0;$i<100;$i++){<br />
my $num = sprintf("%02d", $i);<br />
my $Entf = ReadingsVal($BlitzerDev,$num."Entfernung",undef);<br />
last if !defined $Entf;<br />
my $Ort = ReadingsVal($BlitzerDev,$num."Ort",".");<br />
if ($Ort eq "."){$Ort = " "};<br />
my $building = ReadingsVal($BlitzerDev,$num."Building",0);<br />
if ($building eq "."){$building = " "};<br />
my $Strasse = ReadingsVal($BlitzerDev,$num."Strasse"," ");<br />
my $VMax = ReadingsVal($BlitzerDev,$num."VMax"," ");<br />
if (not $Text eq "<html> <p align='left'>"){<br />
$Text = $Text."\n <br>"; <br />
}<br />
$Text = $Text."$num $Ort $Strasse $building Max $VMax km/h (".sprintf("%.1f", "$Entf")."km) !!";<br />
$SollAnzeige=1;<br />
}<br />
$Text = $Text."</p></html>";<br />
fhem("setreading $BlitzerDev Text $Text");<br />
fhem("setreading $BlitzerDev Anzeige $SollAnzeige");<br />
}<br />
</source><br />
<br />
Von besonderem Interesse ist hier die Zeile <br />
<br />
<source lang="perl"><br />
$Text = $Text."$num $Ort $Strasse $building Max $VMax km/h (".sprintf("%.1f", "$Entf")."km) !!";<br />
</source><br />
<br />
Diese Zeile kann man den eigenen Bedürfnissen anpassen, beispielhaft so:<br />
<source lang="perl"><br />
$Text = $Text."$Ort $Strasse $building $VMax km/h";<br />
</source><br />
Dieser Version ist günstiger für [[FHEM Tablet UI|FTUI]], da die Zeilenausgaben kürzer ist.<br />
<br />
==Code für FTUI==<br />
<source lang="html"><br />
<div data-type="label"<br />
data-device="blitzer"<br />
data-get="Text"><br />
</source><br />
<br />
==Hinweis==<br />
Es gibt mehrere Anpassungsvorschäge. Diese sind im Forum zu finden: {{Link2Forum|Topic=90014|LinkText=Blitzer anzeigen}}. Fragen zum Code bitte dort stellen.<br />
<br />
Screenshot fehlt<br />
<br />
[[Kategorie:Code_Snippets]]<br />
[[Kategorie:FHEM Tablet UI|Blitzer]]</div>Curthttp://wiki.fhem.de/w/index.php?title=Stra%C3%9Fenverkehr_Blitzer&diff=30077Straßenverkehr Blitzer2019-04-03T18:15:15Z<p>Curt: mom, fast fertig</p>
<hr />
<div>{{Baustelle}} <br />
<br />
{{Infobox Modul|<br />
|ModPurpose=Geschwindigkeitsüberwachung Blitzer<br />
|ModType=x<br />
|ModCmdRef=blitzer<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=98_Blitzer.pm<br />
|ModOwner=bismosa<br />
}}<br />
<br />
@Wiki-Admin: <br />
* Link auf bismosa fehlt<br />
* Link auf https://forum.fhem.de/index.php/topic,99070.0.html fehlt<br />
<br />
'''Straßenverkehr Blitzer''' ist ein Modul, welches mobile Verkehrsüberwachungsanlagen (aka Blitzer) ein Internet Portal abfragt und für den Umkreis des eigenen Standorts listenförmig im Straßenverkehr innerhalb Deutschlands auflistet - bezogen auf eine anzugebende Koordinate, um den Radius um diese Koordinate.<br />
<br />
== Features ==<br />
* Die Ausgabe frei über Attribute konfigurierbar<br />
* HTML-Code bzw. plaintext einstellbar<br />
* Es kann mit einem set <Blitzer-Device> Update <Optional:LAT> <Optional:LONG> auch eine neue Koordinate vorgegeben werden.<br />
* Der Bereich, der bei Verkehrslage.de abgefragt wird, kann vom Modul berechnet werden.<br />
* Es kann ein Reading erzeugt werden, welches bei vorhanden Blitzern eine "1" und sonst eine "0" anzeigt (praktisch z.B. um in FTUI Bereiche auszublenden, wenn kein Blitzer gemeldet wurde).<br />
* Es kann die maximale Anzahl an anzuzeigenden Blitzern festgelegt werden.<br />
* Es kann ein Text festgelegt werden, wenn kein Blitzer in der Nähe ist.<br />
<br />
== Modul integrieren ==<br />
Das Modul ist in jeweils aktueller Version auf Github verfügbar. Es ist zunächst in den FHEM-Update-Prozess zu integieren:<br />
<br />
<source lang="html"><br />
update add https://raw.githubusercontent.com/bismosa/FHEM/master/controls_all.txt<br />
update check<br />
update all<br />
</source><br />
<br />
== Definition ==<br />
<source lang="html"><br />
define <Name> Blitzer <Interval><br />
</source><br />
Das Intervall hat die Basis "Minuten". Sofern kein Intervall angegeben ist, wird nicht automatisch aktualisiert.<br />
<br />
Sodann ist '''wesentlich''', dass die gewünschte Ausgangskoordinate sowie der gewünschte Radius in den Attributen gesetzt werden, beispielhaft:<br />
<source lang="html"><br />
attr <Name> home_latitude 51.8<br />
attr <Name> home_longitude 12.6346<br />
attr <Name> radius 25<br />
</source><br />
<br />
== Formatierung der Ausgabe ==<br />
<br />
Über das Attribut "Ausgabe" wird gesteuert, welche je Blitzer verfügbaren Informationen ausgegeben werden sollen. Ein Beispiel mit wenigen Informationen, für den ländlichen Raum geeignet:<br />
<source lang="html"><br />
attr <Name> Ausgabe {OR,suburb,city_district,town,village,},road,building,vmax,[km/h],newline<br />
</source><br />
<br />
Ein Beispiel für den großstädtischen Raum:<br />
<source lang="html"><br />
attr <Name> Ausgabe number,{OR,suburb,city_district,town,village,},road,building,[Max.],vmax,[km/h],[(],distanceShort,[km],[)],[!!],newline<br />
</source><br />
<br />
=== Spezielle Einträge ===<br />
*number Nummerierung<br />
* newline Neue Zeile<br />
* [Freitext] Beliebiger Text. Dieser wird ohne die Klammern übernommen.<br />
* distance Abstand des Blitzers von der Home-Koordinate (Luftlinie)<br />
* distanceShort Abstand des Blitzers von der Home-Koordinate (Luftlinie) eine Kommastelle<br />
* {OR ODER-Verknüpfung. Wenn ein Wert vorhanden ist, werden die nachfolgenden (bis zur geschweiften Klammer) nicht berücksichtigt<br />
* } Ende der ODER-Verknüpfung. Muss zwingend gesetzt werden, wenn eine ODER-Verknüpfung enthalten ist.<br />
<br />
Es können beliebig viele Werte so verknüpft werden.<br />
<br />
Welche Werte vorhanden sind, kann mit<br />
<source lang="html"><br />
get <Blitzer-Device> allReadings <Optional:Nummer><br />
</source><br />
überprüft werden. Wird eine nummer mitgegeben, werden nur die entsprechenden Einträge ausgegeben.<br />
<br />
-------------<br />
<br />
'''Ab hier ist veralteter Code ohne Modul, aber funktional!'''<br />
<br />
Vom gleichen Autoren gibt es mit gleicher Funktionalität nun ein inoffizielles Modul: https://forum.fhem.de/index.php/topic,90014.0.html<br />
<br />
Der [[{{PAGENAME}}|Code "Blitzer"]] (Autor: {{Link2FU|30971|bismosa}}]) ist ein Code zur listenförmigen Anzeige mobiler Geschwindigkeitsüberwachungen (Radarfallen) im Straßenverkehr. Er kann problemlos in [[FHEM Tablet UI]] genutzt werden. 2019-02 wurde es geprüft und war funktional.<br />
<br />
Es wird ausdrücklich auf den Thread {{Link2Forum|Topic=90014|LinkText=Blitzer anzeigen}} im FHEM-Forum verwiesen: Im ersten Beitrag pflegt der Autor den Code nach.<br />
<br />
==Funktionalität==<br />
Ausgehend von einer vorgegebenen Koordinate werden alle gemeldeten Blitzer im beliebigen Umkreis (bis 99 Kilometer) aufgelistet. Zusätzlich existiert ein Reading "Anzeige": "0", wenn keine Blitzer im definierten Umkreis vorliegen, "1" wenn dort Blitzer vorliegen.<br />
<br />
==Code mit Erläuterungen==<br />
<source lang="html"><br />
defmod blitzer dummy<br />
attr blitzer userattr lat lng maxkm<br />
attr blitzer icon ampel_rot<br />
attr blitzer lat 51.8644<br />
attr blitzer lng 12.6346<br />
attr blitzer maxkm 25<br />
attr blitzer stateFormat Text<br />
attr blitzer room 61 Verkehr<br />
</source><br />
<br />
Damit wird die Definition des basierenden Dummy-Devices vorgenommen. Hier ist die Mittelpunktskoordinate (lat/lon) an die eigenen Bedürfnisse anzupassen: HIer bin ich, welche Blitzer sind im Umkreis? - "maxkm" definiert den Radius um die Koordinate, in dessen Kreisfläche alle gemeldeten Blitzer gelistet werden sollen. "room" kann den eigenen Bedürfnissen angepasst werden.<br />
<br />
<source lang="html"><br />
defmod httpmod_blitzer HTTPMOD https://cdn2.atudo.net/api/1.0/vl.php?type=0,1,2,3,4,5,6&box=51.6,12.1,52.0,13.0 0<br />
attr httpmod_blitzer userattr getData getHeader1 getHeader2 getURL reading01DeleteIfUnmatched reading01JSON reading01Name reading01Regex reading02Name reading02RegOpt reading02Regex reading03JSON reading03Name readingEncode requestHeader1 requestHeader2 setParseResponse:0,1<br />
attr httpmod_blitzer enableControlSet 1<br />
attr httpmod_blitzer extractAllJSON 1<br />
attr httpmod_blitzer getHeader1 Content-Type: application/json<br />
attr httpmod_blitzer getHeader2 Accept: */*<br />
attr httpmod_blitzer readingEncode utf8<br />
attr httpmod_blitzer room 61 Verkehr<br />
</source><br />
<br />
Mit dieser Device wird die Internetabfrage definiert. Der "room" kann an eigene Befürfnisse angepasst werden. Die Definition selbst (defmod httpmod_blitzer) '''muss''' angepasst werden, es geht um den letzten Teil: "box=51.6,12.1,52.0,13.0 0". Gedanklich bildet man ein Quadrat um die Mittelpunktkoordinate. Für die ersten beiden Parameter bestimmt man die Koordinate der linken unteren Ecke. Für die beiden folgenden Parameter bestimmt man die Koordinaten der rechten oberen Ecke und trägt auch sie ein. Dabei muss man nicht sehr genau vorgehen: Ein ungefähres Rechteck reicht völlig. - Die abschließende Null '''muss''' unverändert bleiben: Der Abruf wird von einem Script gesteuert.<br />
<br />
<source lang="html"><br />
defmod at_Blitzer at +*00:10:00 {\<br />
fhem("deletereading httpmod_blitzer .*", 1);;\<br />
fhem("set httpmod_blitzer reread");;;;\<br />
fhem("sleep 2;; {getBlitzer};;");;;;\<br />
}<br />
attr at_Blitzer room 99_System<br />
</source><br />
<br />
Dieser Code-Teil sollte nicht geändert werden: Alle 10 Minuten werden alle Readings (Blitzer) gelöscht und via Web der aktuelle Stand erfragt.<br />
<br />
==99_myUtils.pm==<br />
In 99_myUtils.pm muss ein längerer Codeblock eingefügt werden. Er sollte ganz unten vor dem Codeteil<br />
<br />
<source lang="perl"><br />
1;<br />
</source><br />
stehen.<br />
<br />
<source lang="perl"><br />
################################################################<br />
### Blitzer ###<br />
################################################################<br />
sub getBlitzer(){<br />
my $httpDev = "httpmod_blitzer";<br />
my $BlitzerDev = "blitzer";<br />
my $lat = AttrVal($BlitzerDev,"lat",undef);<br />
my $lng = AttrVal($BlitzerDev,"lng",undef);<br />
my $maxkm = AttrVal($BlitzerDev,"maxkm",undef);<br />
if (!defined $lat){<br />
Log 5,"[getBlitzer] lat ist nicht definiert!"; <br />
}<br />
if (!defined $lng){<br />
Log 5,"[getBlitzer] lng ist nicht definiert!"; <br />
}<br />
if (!defined $maxkm){<br />
Log 5,"[getBlitzer] maxkm ist nicht definiert!"; <br />
}<br />
# Da unbekannt ist, wie viele es gibt...durchprobieren<br />
my @Liste;<br />
for(my $i=1;$i<100;$i++){<br />
my $num = sprintf("%02d", $i);<br />
Log 5,"[getBlitzer] Reading: $num"; <br />
my $Poi_lat = ReadingsVal($httpDev,"pois_".$num."_lat",undef);<br />
my $Poi_lng = ReadingsVal($httpDev,"pois_".$num."_lng",undef);<br />
last if !defined $Poi_lat;<br />
#Log 1,"[getBlitzer] Reading: $Poi_lat"; <br />
last if !defined $Poi_lng;<br />
Log 5,"[getBlitzer] lat/lng: $Poi_lat $Poi_lng"; <br />
my $Poi_street = ReadingsVal($httpDev,"pois_".$num."_street","keine");<br />
my $Poi_vmax = ReadingsVal($httpDev,"pois_".$num."_vmax","kA");<br />
if (!defined $Poi_vmax){<br />
$Poi_vmax = ".";<br />
}<br />
if ($Poi_vmax eq ""){<br />
$Poi_vmax = ".";<br />
}<br />
Log 5,"[getBlitzer] $Poi_street $Poi_vmax"; <br />
<br />
#Entfernung zur Home-Koordinate (Luftlinie)<br />
#Berechnung nach: https://www.kompf.de/gps/distcalc.html<br />
#Einfache Variante<br />
my $dx = 71.5 * abs($lng - $Poi_lng);<br />
my $dy = 111.3 * abs($lat - $Poi_lat);<br />
my $distance = sqrt($dx * $dx + $dy * $dy);<br />
<br />
#MaxEntfernung einbeziehen<br />
if (not $distance > $maxkm){<br />
Log 5,"[getBlitzer] distance: $distance"; <br />
push @Liste, [ $distance, $Poi_street, $Poi_vmax, $Poi_lat, $Poi_lng ]; <br />
} else {<br />
Log 5,"[getBlitzer] $distance > $maxkm"; <br />
}<br />
<br />
<br />
}<br />
my $out = join(", ", @Liste)."\n";<br />
Log 5,"[getBlitzer] $out"; <br />
my @ListeSort = sort {$a->[0] <=> $b->[0]} @Liste;<br />
$out = join(", ", @ListeSort)."\n";<br />
Log 5,"[getBlitzer] $out"; <br />
<br />
#Eintragen ins Dummy-Device<br />
#Eintragungen erst löschen<br />
fhem("deletereading $BlitzerDev .*", 1);<br />
<br />
my $Text="";<br />
my $Anzahl = scalar(@ListeSort);<br />
for (my $i=0;$i<$Anzahl;$i++) {<br />
my $num = sprintf("%02d", $i);<br />
Log 5,"[getBlitzer] Num: $num"; <br />
fhem("setreading $BlitzerDev ".$num."Entfernung ".$ListeSort[$i][0]);<br />
fhem("setreading $BlitzerDev ".$num."Strasse ".$ListeSort[$i][1]);<br />
fhem("setreading $BlitzerDev ".$num."VMax ".$ListeSort[$i][2]);<br />
<br />
#Ort<br />
fhem("sleep 1; \{getBlitzerOrte(".$ListeSort[$i][3].",".$ListeSort[$i][4].",'$num','$BlitzerDev')};");<br />
<br />
}<br />
fhem("sleep 3; \{getBlitzerText('$BlitzerDev')};");<br />
#fhem("setreading $BlitzerDev Text $Text");<br />
<br />
}<br />
sub getBlitzerOrte($$$$){<br />
#https://nominatim.openstreetmap.org/search/52.xxxxx%208.xxxx?format=json&addressdetails=1<br />
my $Poi_lat = shift;<br />
my $Poi_lng = shift;<br />
my $num = shift;<br />
$num = sprintf("%02d", $num);<br />
my $BlitzerDev = shift;<br />
<br />
<br />
my $hash = {};<br />
$hash->{'blitzerdev'} = $BlitzerDev;<br />
$hash->{'num'} = $num;<br />
my $param = {<br />
url => "https://nominatim.openstreetmap.org/reverse?format=json&lat=".$Poi_lat."&lon=".$Poi_lng,<br />
timeout => 5,<br />
method => "GET", # Lesen von Inhalten<br />
hash => $hash, # Muss gesetzt werden, damit die Callback funktion wieder $hash hat<br />
header => "",<br />
callback => \&getBlitzerOrteCallback # Diese Funktion soll das Ergebnis dieser HTTP Anfrage bearbeiten<br />
};<br />
#agent: FHEM/1.0\r\nUser-Agent: FHEM/1.0\r\nAccept: application/json<br />
<br />
HttpUtils_NonblockingGet($param); # Starten der HTTP Abfrage. Es gibt keinen Return-Code.<br />
<br />
}<br />
sub getBlitzerOrteCallback($) {<br />
my ($param, $err, $data) = @_;<br />
my $hash = $param->{hash};<br />
my $BlitzerDev = $hash->{blitzerdev};<br />
my $num = $hash->{num};<br />
<br />
if($err ne "") # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist<br />
{<br />
Log3 "[getBlitzerOrte]", 3, "error while requesting ".$param->{url}." - $err"; # Eintrag fürs Log<br />
}<br />
#Log 1,"[getBlitzerOrte] $BlitzerDev ".$param->{data}." ".$param->{url}." ".$param->{httpheader}." ".$param->{code};<br />
#Log 1,"$data";<br />
<br />
my $Stadtteil = "";<br />
my $Stadt = "";<br />
<br />
my ($Stadtteil) = $data =~ m/suburb":"([^"]+)"/;<br />
if ((!defined $Stadtteil) or ($Stadtteil eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search city_district";<br />
($Stadtteil) = $data =~ m/city_district":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadtteil";<br />
}<br />
if ((!defined $Stadtteil) or ($Stadtteil eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] $Stadtteil";<br />
Log 5, "[getBlitzerOrteCallback] ".$param->{url};<br />
Log 5, "[getBlitzerOrteCallback] $data";<br />
$Stadtteil = ".";<br />
}<br />
<br />
my ($Stadt) = $data =~ m/city":"([^"]+)"/;<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search village $data";<br />
($Stadt) = $data =~ m/town":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
}<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search village $data";<br />
($Stadt) = $data =~ m/village":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
}<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
Log 5, "[getBlitzerOrteCallback] ".$param->{url};<br />
Log 5, "[getBlitzerOrteCallback] $data";<br />
$Stadt = ".";<br />
}<br />
my ($building) = $data =~ m/building":"([^"]+)"/;<br />
if ((!defined $building) or ($building eq "")){<br />
$building = ".";<br />
}<br />
Log 5,"[getBlitzerOrteCallback] $Stadt $Stadtteil $building";<br />
#Log 1,"[getBlitzerOrte] ".$decoded_json->{address}->{suburb}->[0];<br />
if ($Stadt eq "."){$Stadt = " "};<br />
if ($Stadtteil eq "."){$Stadtteil = " "};<br />
fhem("setreading $BlitzerDev ".$num."Ort $Stadt $Stadtteil");<br />
fhem("setreading $BlitzerDev ".$num."Building $building");<br />
}<br />
sub getBlitzerText($){<br />
my $BlitzerDev = shift;<br />
my $Text="<html> <p align='left'>";<br />
my $SollAnzeige=0;<br />
for(my $i=0;$i<100;$i++){<br />
my $num = sprintf("%02d", $i);<br />
my $Entf = ReadingsVal($BlitzerDev,$num."Entfernung",undef);<br />
last if !defined $Entf;<br />
my $Ort = ReadingsVal($BlitzerDev,$num."Ort",".");<br />
if ($Ort eq "."){$Ort = " "};<br />
my $building = ReadingsVal($BlitzerDev,$num."Building",0);<br />
if ($building eq "."){$building = " "};<br />
my $Strasse = ReadingsVal($BlitzerDev,$num."Strasse"," ");<br />
my $VMax = ReadingsVal($BlitzerDev,$num."VMax"," ");<br />
if (not $Text eq "<html> <p align='left'>"){<br />
$Text = $Text."\n <br>"; <br />
}<br />
$Text = $Text."$num $Ort $Strasse $building Max $VMax km/h (".sprintf("%.1f", "$Entf")."km) !!";<br />
$SollAnzeige=1;<br />
}<br />
$Text = $Text."</p></html>";<br />
fhem("setreading $BlitzerDev Text $Text");<br />
fhem("setreading $BlitzerDev Anzeige $SollAnzeige");<br />
}<br />
</source><br />
<br />
Von besonderem Interesse ist hier die Zeile <br />
<br />
<source lang="perl"><br />
$Text = $Text."$num $Ort $Strasse $building Max $VMax km/h (".sprintf("%.1f", "$Entf")."km) !!";<br />
</source><br />
<br />
Diese Zeile kann man den eigenen Bedürfnissen anpassen, beispielhaft so:<br />
<source lang="perl"><br />
$Text = $Text."$Ort $Strasse $building $VMax km/h";<br />
</source><br />
Dieser Version ist günstiger für [[FHEM Tablet UI|FTUI]], da die Zeilenausgaben kürzer ist.<br />
<br />
==Code für FTUI==<br />
<source lang="html"><br />
<div data-type="label"<br />
data-device="blitzer"<br />
data-get="Text"><br />
</source><br />
<br />
==Hinweis==<br />
Es gibt mehrere Anpassungsvorschäge. Diese sind im Forum zu finden: {{Link2Forum|Topic=90014|LinkText=Blitzer anzeigen}}. Fragen zum Code bitte dort stellen.<br />
<br />
Screenshot fehlt<br />
<br />
[[Kategorie:Code_Snippets]]<br />
[[Kategorie:FHEM Tablet UI|Blitzer]]</div>Curthttp://wiki.fhem.de/w/index.php?title=Stra%C3%9Fenverkehr_Blitzer&diff=30076Straßenverkehr Blitzer2019-04-03T18:03:21Z<p>Curt: mom</p>
<hr />
<div>{{Baustelle}} <br />
<br />
{{Infobox Modul|<br />
|ModPurpose=Geschwindigkeitsüberwachung Blitzer<br />
|ModType=x<br />
|ModCmdRef=blitzer<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=98_Blitzer.pm<br />
|ModOwner=bismosa<br />
}}<br />
<br />
@Wiki-Admin: <br />
* Link auf bismosa fehlt<br />
* Link auf https://forum.fhem.de/index.php/topic,99070.0.html fehlt<br />
<br />
'''Straßenverkehr Blitzer''' ist ein Modul, welches mobile Verkehrsüberwachungsanlagen (aka Blitzer) ein Internet Portal abfragt und für den Umkreis des eigenen Standorts auflistet. <br />
<br />
== Funktion ==<br />
Geleistet wird die listenförmige Anzeige mobiler Geschwindigkeitsüberwachungen (Radarfallen) im Straßenverkehr innerhalb Deutschlands - bezogen auf eine anzugebende Koordinate sowie Radius um diese Koordinate.<br />
<br />
== Modul integrieren ==<br />
Das Modul ist in jeweils aktueller Version auf Github verfügbar. Es ist zunächst in den FHEM-Update-Prozess zu integieren:<br />
<br />
<source lang="html"><br />
update add https://raw.githubusercontent.com/bismosa/FHEM/master/controls_all.txt<br />
update check<br />
update all<br />
</source><br />
<br />
== Definition ==<br />
<source lang="html"><br />
define <Name> Blitzer <Interval><br />
</source><br />
Das Intervall hat die Basis "Minuten". Sofern kein Intervall angegeben ist, wird nicht automatisch aktualisiert.<br />
<br />
Sodann ist '''wesentlich''', dass die gewünschte Ausgangskoordinate sowie der gewünschte Radius in den Attributen gesetzt werden, beispielhaft:<br />
<source lang="html"><br />
attr <Name> home_latitude 51.8<br />
attr <Name> home_longitude 12.6346<br />
attr <Name> radius 25<br />
</source><br />
<br />
== Features ==<br />
* Die Ausgabe frei über Attribute konfigurierbar<br />
* HTML-Code bzw. plaintext einstellbar<br />
* Es kann mit einem set <Blitzer-Device> Update <Optional:LAT> <Optional:LONG> auch eine neue Koordinate vorgegeben werden.<br />
* Der Bereich, der bei Verkehrslage.de abgefragt wird, kann vom Modul berechnet werden.<br />
* Es kann ein Reading erzeugt werden, welches bei vorhanden Blitzern eine "1" und sonst eine "0" anzeigt (praktisch z.B. um in FTUI Bereiche auszublenden, wenn kein Blitzer gemeldet wurde).<br />
* Es kann die maximale Anzahl an anzuzeigenden Blitzern festgelegt werden.<br />
* Es kann ein Text festgelegt werden, wenn kein Blitzer in der Nähe ist.<br />
<br />
<br />
<br />
'''Ab hier ist veralteter Code ohne Modul, aber funktional!'''<br />
<br />
Vom gleichen Autoren gibt es mit gleicher Funktionalität nun ein inoffizielles Modul: https://forum.fhem.de/index.php/topic,90014.0.html<br />
<br />
Der [[{{PAGENAME}}|Code "Blitzer"]] (Autor: {{Link2FU|30971|bismosa}}]) ist ein Code zur listenförmigen Anzeige mobiler Geschwindigkeitsüberwachungen (Radarfallen) im Straßenverkehr. Er kann problemlos in [[FHEM Tablet UI]] genutzt werden. 2019-02 wurde es geprüft und war funktional.<br />
<br />
Es wird ausdrücklich auf den Thread {{Link2Forum|Topic=90014|LinkText=Blitzer anzeigen}} im FHEM-Forum verwiesen: Im ersten Beitrag pflegt der Autor den Code nach.<br />
<br />
==Funktionalität==<br />
Ausgehend von einer vorgegebenen Koordinate werden alle gemeldeten Blitzer im beliebigen Umkreis (bis 99 Kilometer) aufgelistet. Zusätzlich existiert ein Reading "Anzeige": "0", wenn keine Blitzer im definierten Umkreis vorliegen, "1" wenn dort Blitzer vorliegen.<br />
<br />
==Code mit Erläuterungen==<br />
<source lang="html"><br />
defmod blitzer dummy<br />
attr blitzer userattr lat lng maxkm<br />
attr blitzer icon ampel_rot<br />
attr blitzer lat 51.8644<br />
attr blitzer lng 12.6346<br />
attr blitzer maxkm 25<br />
attr blitzer stateFormat Text<br />
attr blitzer room 61 Verkehr<br />
</source><br />
<br />
Damit wird die Definition des basierenden Dummy-Devices vorgenommen. Hier ist die Mittelpunktskoordinate (lat/lon) an die eigenen Bedürfnisse anzupassen: HIer bin ich, welche Blitzer sind im Umkreis? - "maxkm" definiert den Radius um die Koordinate, in dessen Kreisfläche alle gemeldeten Blitzer gelistet werden sollen. "room" kann den eigenen Bedürfnissen angepasst werden.<br />
<br />
<source lang="html"><br />
defmod httpmod_blitzer HTTPMOD https://cdn2.atudo.net/api/1.0/vl.php?type=0,1,2,3,4,5,6&box=51.6,12.1,52.0,13.0 0<br />
attr httpmod_blitzer userattr getData getHeader1 getHeader2 getURL reading01DeleteIfUnmatched reading01JSON reading01Name reading01Regex reading02Name reading02RegOpt reading02Regex reading03JSON reading03Name readingEncode requestHeader1 requestHeader2 setParseResponse:0,1<br />
attr httpmod_blitzer enableControlSet 1<br />
attr httpmod_blitzer extractAllJSON 1<br />
attr httpmod_blitzer getHeader1 Content-Type: application/json<br />
attr httpmod_blitzer getHeader2 Accept: */*<br />
attr httpmod_blitzer readingEncode utf8<br />
attr httpmod_blitzer room 61 Verkehr<br />
</source><br />
<br />
Mit dieser Device wird die Internetabfrage definiert. Der "room" kann an eigene Befürfnisse angepasst werden. Die Definition selbst (defmod httpmod_blitzer) '''muss''' angepasst werden, es geht um den letzten Teil: "box=51.6,12.1,52.0,13.0 0". Gedanklich bildet man ein Quadrat um die Mittelpunktkoordinate. Für die ersten beiden Parameter bestimmt man die Koordinate der linken unteren Ecke. Für die beiden folgenden Parameter bestimmt man die Koordinaten der rechten oberen Ecke und trägt auch sie ein. Dabei muss man nicht sehr genau vorgehen: Ein ungefähres Rechteck reicht völlig. - Die abschließende Null '''muss''' unverändert bleiben: Der Abruf wird von einem Script gesteuert.<br />
<br />
<source lang="html"><br />
defmod at_Blitzer at +*00:10:00 {\<br />
fhem("deletereading httpmod_blitzer .*", 1);;\<br />
fhem("set httpmod_blitzer reread");;;;\<br />
fhem("sleep 2;; {getBlitzer};;");;;;\<br />
}<br />
attr at_Blitzer room 99_System<br />
</source><br />
<br />
Dieser Code-Teil sollte nicht geändert werden: Alle 10 Minuten werden alle Readings (Blitzer) gelöscht und via Web der aktuelle Stand erfragt.<br />
<br />
==99_myUtils.pm==<br />
In 99_myUtils.pm muss ein längerer Codeblock eingefügt werden. Er sollte ganz unten vor dem Codeteil<br />
<br />
<source lang="perl"><br />
1;<br />
</source><br />
stehen.<br />
<br />
<source lang="perl"><br />
################################################################<br />
### Blitzer ###<br />
################################################################<br />
sub getBlitzer(){<br />
my $httpDev = "httpmod_blitzer";<br />
my $BlitzerDev = "blitzer";<br />
my $lat = AttrVal($BlitzerDev,"lat",undef);<br />
my $lng = AttrVal($BlitzerDev,"lng",undef);<br />
my $maxkm = AttrVal($BlitzerDev,"maxkm",undef);<br />
if (!defined $lat){<br />
Log 5,"[getBlitzer] lat ist nicht definiert!"; <br />
}<br />
if (!defined $lng){<br />
Log 5,"[getBlitzer] lng ist nicht definiert!"; <br />
}<br />
if (!defined $maxkm){<br />
Log 5,"[getBlitzer] maxkm ist nicht definiert!"; <br />
}<br />
# Da unbekannt ist, wie viele es gibt...durchprobieren<br />
my @Liste;<br />
for(my $i=1;$i<100;$i++){<br />
my $num = sprintf("%02d", $i);<br />
Log 5,"[getBlitzer] Reading: $num"; <br />
my $Poi_lat = ReadingsVal($httpDev,"pois_".$num."_lat",undef);<br />
my $Poi_lng = ReadingsVal($httpDev,"pois_".$num."_lng",undef);<br />
last if !defined $Poi_lat;<br />
#Log 1,"[getBlitzer] Reading: $Poi_lat"; <br />
last if !defined $Poi_lng;<br />
Log 5,"[getBlitzer] lat/lng: $Poi_lat $Poi_lng"; <br />
my $Poi_street = ReadingsVal($httpDev,"pois_".$num."_street","keine");<br />
my $Poi_vmax = ReadingsVal($httpDev,"pois_".$num."_vmax","kA");<br />
if (!defined $Poi_vmax){<br />
$Poi_vmax = ".";<br />
}<br />
if ($Poi_vmax eq ""){<br />
$Poi_vmax = ".";<br />
}<br />
Log 5,"[getBlitzer] $Poi_street $Poi_vmax"; <br />
<br />
#Entfernung zur Home-Koordinate (Luftlinie)<br />
#Berechnung nach: https://www.kompf.de/gps/distcalc.html<br />
#Einfache Variante<br />
my $dx = 71.5 * abs($lng - $Poi_lng);<br />
my $dy = 111.3 * abs($lat - $Poi_lat);<br />
my $distance = sqrt($dx * $dx + $dy * $dy);<br />
<br />
#MaxEntfernung einbeziehen<br />
if (not $distance > $maxkm){<br />
Log 5,"[getBlitzer] distance: $distance"; <br />
push @Liste, [ $distance, $Poi_street, $Poi_vmax, $Poi_lat, $Poi_lng ]; <br />
} else {<br />
Log 5,"[getBlitzer] $distance > $maxkm"; <br />
}<br />
<br />
<br />
}<br />
my $out = join(", ", @Liste)."\n";<br />
Log 5,"[getBlitzer] $out"; <br />
my @ListeSort = sort {$a->[0] <=> $b->[0]} @Liste;<br />
$out = join(", ", @ListeSort)."\n";<br />
Log 5,"[getBlitzer] $out"; <br />
<br />
#Eintragen ins Dummy-Device<br />
#Eintragungen erst löschen<br />
fhem("deletereading $BlitzerDev .*", 1);<br />
<br />
my $Text="";<br />
my $Anzahl = scalar(@ListeSort);<br />
for (my $i=0;$i<$Anzahl;$i++) {<br />
my $num = sprintf("%02d", $i);<br />
Log 5,"[getBlitzer] Num: $num"; <br />
fhem("setreading $BlitzerDev ".$num."Entfernung ".$ListeSort[$i][0]);<br />
fhem("setreading $BlitzerDev ".$num."Strasse ".$ListeSort[$i][1]);<br />
fhem("setreading $BlitzerDev ".$num."VMax ".$ListeSort[$i][2]);<br />
<br />
#Ort<br />
fhem("sleep 1; \{getBlitzerOrte(".$ListeSort[$i][3].",".$ListeSort[$i][4].",'$num','$BlitzerDev')};");<br />
<br />
}<br />
fhem("sleep 3; \{getBlitzerText('$BlitzerDev')};");<br />
#fhem("setreading $BlitzerDev Text $Text");<br />
<br />
}<br />
sub getBlitzerOrte($$$$){<br />
#https://nominatim.openstreetmap.org/search/52.xxxxx%208.xxxx?format=json&addressdetails=1<br />
my $Poi_lat = shift;<br />
my $Poi_lng = shift;<br />
my $num = shift;<br />
$num = sprintf("%02d", $num);<br />
my $BlitzerDev = shift;<br />
<br />
<br />
my $hash = {};<br />
$hash->{'blitzerdev'} = $BlitzerDev;<br />
$hash->{'num'} = $num;<br />
my $param = {<br />
url => "https://nominatim.openstreetmap.org/reverse?format=json&lat=".$Poi_lat."&lon=".$Poi_lng,<br />
timeout => 5,<br />
method => "GET", # Lesen von Inhalten<br />
hash => $hash, # Muss gesetzt werden, damit die Callback funktion wieder $hash hat<br />
header => "",<br />
callback => \&getBlitzerOrteCallback # Diese Funktion soll das Ergebnis dieser HTTP Anfrage bearbeiten<br />
};<br />
#agent: FHEM/1.0\r\nUser-Agent: FHEM/1.0\r\nAccept: application/json<br />
<br />
HttpUtils_NonblockingGet($param); # Starten der HTTP Abfrage. Es gibt keinen Return-Code.<br />
<br />
}<br />
sub getBlitzerOrteCallback($) {<br />
my ($param, $err, $data) = @_;<br />
my $hash = $param->{hash};<br />
my $BlitzerDev = $hash->{blitzerdev};<br />
my $num = $hash->{num};<br />
<br />
if($err ne "") # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist<br />
{<br />
Log3 "[getBlitzerOrte]", 3, "error while requesting ".$param->{url}." - $err"; # Eintrag fürs Log<br />
}<br />
#Log 1,"[getBlitzerOrte] $BlitzerDev ".$param->{data}." ".$param->{url}." ".$param->{httpheader}." ".$param->{code};<br />
#Log 1,"$data";<br />
<br />
my $Stadtteil = "";<br />
my $Stadt = "";<br />
<br />
my ($Stadtteil) = $data =~ m/suburb":"([^"]+)"/;<br />
if ((!defined $Stadtteil) or ($Stadtteil eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search city_district";<br />
($Stadtteil) = $data =~ m/city_district":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadtteil";<br />
}<br />
if ((!defined $Stadtteil) or ($Stadtteil eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] $Stadtteil";<br />
Log 5, "[getBlitzerOrteCallback] ".$param->{url};<br />
Log 5, "[getBlitzerOrteCallback] $data";<br />
$Stadtteil = ".";<br />
}<br />
<br />
my ($Stadt) = $data =~ m/city":"([^"]+)"/;<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search village $data";<br />
($Stadt) = $data =~ m/town":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
}<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search village $data";<br />
($Stadt) = $data =~ m/village":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
}<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
Log 5, "[getBlitzerOrteCallback] ".$param->{url};<br />
Log 5, "[getBlitzerOrteCallback] $data";<br />
$Stadt = ".";<br />
}<br />
my ($building) = $data =~ m/building":"([^"]+)"/;<br />
if ((!defined $building) or ($building eq "")){<br />
$building = ".";<br />
}<br />
Log 5,"[getBlitzerOrteCallback] $Stadt $Stadtteil $building";<br />
#Log 1,"[getBlitzerOrte] ".$decoded_json->{address}->{suburb}->[0];<br />
if ($Stadt eq "."){$Stadt = " "};<br />
if ($Stadtteil eq "."){$Stadtteil = " "};<br />
fhem("setreading $BlitzerDev ".$num."Ort $Stadt $Stadtteil");<br />
fhem("setreading $BlitzerDev ".$num."Building $building");<br />
}<br />
sub getBlitzerText($){<br />
my $BlitzerDev = shift;<br />
my $Text="<html> <p align='left'>";<br />
my $SollAnzeige=0;<br />
for(my $i=0;$i<100;$i++){<br />
my $num = sprintf("%02d", $i);<br />
my $Entf = ReadingsVal($BlitzerDev,$num."Entfernung",undef);<br />
last if !defined $Entf;<br />
my $Ort = ReadingsVal($BlitzerDev,$num."Ort",".");<br />
if ($Ort eq "."){$Ort = " "};<br />
my $building = ReadingsVal($BlitzerDev,$num."Building",0);<br />
if ($building eq "."){$building = " "};<br />
my $Strasse = ReadingsVal($BlitzerDev,$num."Strasse"," ");<br />
my $VMax = ReadingsVal($BlitzerDev,$num."VMax"," ");<br />
if (not $Text eq "<html> <p align='left'>"){<br />
$Text = $Text."\n <br>"; <br />
}<br />
$Text = $Text."$num $Ort $Strasse $building Max $VMax km/h (".sprintf("%.1f", "$Entf")."km) !!";<br />
$SollAnzeige=1;<br />
}<br />
$Text = $Text."</p></html>";<br />
fhem("setreading $BlitzerDev Text $Text");<br />
fhem("setreading $BlitzerDev Anzeige $SollAnzeige");<br />
}<br />
</source><br />
<br />
Von besonderem Interesse ist hier die Zeile <br />
<br />
<source lang="perl"><br />
$Text = $Text."$num $Ort $Strasse $building Max $VMax km/h (".sprintf("%.1f", "$Entf")."km) !!";<br />
</source><br />
<br />
Diese Zeile kann man den eigenen Bedürfnissen anpassen, beispielhaft so:<br />
<source lang="perl"><br />
$Text = $Text."$Ort $Strasse $building $VMax km/h";<br />
</source><br />
Dieser Version ist günstiger für [[FHEM Tablet UI|FTUI]], da die Zeilenausgaben kürzer ist.<br />
<br />
==Code für FTUI==<br />
<source lang="html"><br />
<div data-type="label"<br />
data-device="blitzer"<br />
data-get="Text"><br />
</source><br />
<br />
==Hinweis==<br />
Es gibt mehrere Anpassungsvorschäge. Diese sind im Forum zu finden: {{Link2Forum|Topic=90014|LinkText=Blitzer anzeigen}}. Fragen zum Code bitte dort stellen.<br />
<br />
Screenshot fehlt<br />
<br />
[[Kategorie:Code_Snippets]]<br />
[[Kategorie:FHEM Tablet UI|Blitzer]]</div>Curthttp://wiki.fhem.de/w/index.php?title=Stra%C3%9Fenverkehr_Blitzer&diff=30075Straßenverkehr Blitzer2019-04-03T17:48:47Z<p>Curt: /* Features / Funktionen */ mom</p>
<hr />
<div>{{Baustelle}} <br />
<br />
{{Infobox Modul|<br />
|ModPurpose=Geschwindigkeitsüberwachung Blitzer<br />
|ModType=x<br />
|ModCmdRef=blitzer<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=98_Blitzer.pm<br />
|ModOwner=bismosa<br />
}}<br />
<br />
@Wiki-Admin: <br />
* Link auf bismosa fehlt<br />
* Link auf https://forum.fhem.de/index.php/topic,99070.0.html fehlt<br />
<br />
'''Straßenverkehr Blitzer''' ist ein Modul, welches mobile Verkehrsüberwachungsanlagen (aka Blitzer) ein Internet Portal abfragt und für den Umkreis des eigenen Standorts auflistet. <br />
<br />
== Funktion ==<br />
Geleistet wird die listenförmige Anzeige mobiler Geschwindigkeitsüberwachungen (Radarfallen) im Straßenverkehr innerhalb Deutschlands - bezogen auf eine anzugebende Koordinate sowie Radius um diese Koordinate.<br />
<br />
== Modul integrieren ==<br />
Das Modul ist in jeweils aktueller Version auf Github verfügbar. Es ist zunächst in den FHEM-Update-Prozess zu integieren:<br />
<br />
<source lang="html"><br />
update add https://raw.githubusercontent.com/bismosa/FHEM/master/controls_all.txt<br />
update check<br />
update all<br />
</source><br />
<br />
== Definition ==<br />
<source lang="html"><br />
<br />
</source><br />
<br />
<br />
'''Ab hier ist veralteter Code ohne Modul, aber funktional!'''<br />
<br />
Vom gleichen Autoren gibt es mit gleicher Funktionalität nun ein inoffizielles Modul: https://forum.fhem.de/index.php/topic,90014.0.html<br />
<br />
Der [[{{PAGENAME}}|Code "Blitzer"]] (Autor: {{Link2FU|30971|bismosa}}]) ist ein Code zur listenförmigen Anzeige mobiler Geschwindigkeitsüberwachungen (Radarfallen) im Straßenverkehr. Er kann problemlos in [[FHEM Tablet UI]] genutzt werden. 2019-02 wurde es geprüft und war funktional.<br />
<br />
Es wird ausdrücklich auf den Thread {{Link2Forum|Topic=90014|LinkText=Blitzer anzeigen}} im FHEM-Forum verwiesen: Im ersten Beitrag pflegt der Autor den Code nach.<br />
<br />
==Funktionalität==<br />
Ausgehend von einer vorgegebenen Koordinate werden alle gemeldeten Blitzer im beliebigen Umkreis (bis 99 Kilometer) aufgelistet. Zusätzlich existiert ein Reading "Anzeige": "0", wenn keine Blitzer im definierten Umkreis vorliegen, "1" wenn dort Blitzer vorliegen.<br />
<br />
==Code mit Erläuterungen==<br />
<source lang="html"><br />
defmod blitzer dummy<br />
attr blitzer userattr lat lng maxkm<br />
attr blitzer icon ampel_rot<br />
attr blitzer lat 51.8644<br />
attr blitzer lng 12.6346<br />
attr blitzer maxkm 25<br />
attr blitzer stateFormat Text<br />
attr blitzer room 61 Verkehr<br />
</source><br />
<br />
Damit wird die Definition des basierenden Dummy-Devices vorgenommen. Hier ist die Mittelpunktskoordinate (lat/lon) an die eigenen Bedürfnisse anzupassen: HIer bin ich, welche Blitzer sind im Umkreis? - "maxkm" definiert den Radius um die Koordinate, in dessen Kreisfläche alle gemeldeten Blitzer gelistet werden sollen. "room" kann den eigenen Bedürfnissen angepasst werden.<br />
<br />
<source lang="html"><br />
defmod httpmod_blitzer HTTPMOD https://cdn2.atudo.net/api/1.0/vl.php?type=0,1,2,3,4,5,6&box=51.6,12.1,52.0,13.0 0<br />
attr httpmod_blitzer userattr getData getHeader1 getHeader2 getURL reading01DeleteIfUnmatched reading01JSON reading01Name reading01Regex reading02Name reading02RegOpt reading02Regex reading03JSON reading03Name readingEncode requestHeader1 requestHeader2 setParseResponse:0,1<br />
attr httpmod_blitzer enableControlSet 1<br />
attr httpmod_blitzer extractAllJSON 1<br />
attr httpmod_blitzer getHeader1 Content-Type: application/json<br />
attr httpmod_blitzer getHeader2 Accept: */*<br />
attr httpmod_blitzer readingEncode utf8<br />
attr httpmod_blitzer room 61 Verkehr<br />
</source><br />
<br />
Mit dieser Device wird die Internetabfrage definiert. Der "room" kann an eigene Befürfnisse angepasst werden. Die Definition selbst (defmod httpmod_blitzer) '''muss''' angepasst werden, es geht um den letzten Teil: "box=51.6,12.1,52.0,13.0 0". Gedanklich bildet man ein Quadrat um die Mittelpunktkoordinate. Für die ersten beiden Parameter bestimmt man die Koordinate der linken unteren Ecke. Für die beiden folgenden Parameter bestimmt man die Koordinaten der rechten oberen Ecke und trägt auch sie ein. Dabei muss man nicht sehr genau vorgehen: Ein ungefähres Rechteck reicht völlig. - Die abschließende Null '''muss''' unverändert bleiben: Der Abruf wird von einem Script gesteuert.<br />
<br />
<source lang="html"><br />
defmod at_Blitzer at +*00:10:00 {\<br />
fhem("deletereading httpmod_blitzer .*", 1);;\<br />
fhem("set httpmod_blitzer reread");;;;\<br />
fhem("sleep 2;; {getBlitzer};;");;;;\<br />
}<br />
attr at_Blitzer room 99_System<br />
</source><br />
<br />
Dieser Code-Teil sollte nicht geändert werden: Alle 10 Minuten werden alle Readings (Blitzer) gelöscht und via Web der aktuelle Stand erfragt.<br />
<br />
==99_myUtils.pm==<br />
In 99_myUtils.pm muss ein längerer Codeblock eingefügt werden. Er sollte ganz unten vor dem Codeteil<br />
<br />
<source lang="perl"><br />
1;<br />
</source><br />
stehen.<br />
<br />
<source lang="perl"><br />
################################################################<br />
### Blitzer ###<br />
################################################################<br />
sub getBlitzer(){<br />
my $httpDev = "httpmod_blitzer";<br />
my $BlitzerDev = "blitzer";<br />
my $lat = AttrVal($BlitzerDev,"lat",undef);<br />
my $lng = AttrVal($BlitzerDev,"lng",undef);<br />
my $maxkm = AttrVal($BlitzerDev,"maxkm",undef);<br />
if (!defined $lat){<br />
Log 5,"[getBlitzer] lat ist nicht definiert!"; <br />
}<br />
if (!defined $lng){<br />
Log 5,"[getBlitzer] lng ist nicht definiert!"; <br />
}<br />
if (!defined $maxkm){<br />
Log 5,"[getBlitzer] maxkm ist nicht definiert!"; <br />
}<br />
# Da unbekannt ist, wie viele es gibt...durchprobieren<br />
my @Liste;<br />
for(my $i=1;$i<100;$i++){<br />
my $num = sprintf("%02d", $i);<br />
Log 5,"[getBlitzer] Reading: $num"; <br />
my $Poi_lat = ReadingsVal($httpDev,"pois_".$num."_lat",undef);<br />
my $Poi_lng = ReadingsVal($httpDev,"pois_".$num."_lng",undef);<br />
last if !defined $Poi_lat;<br />
#Log 1,"[getBlitzer] Reading: $Poi_lat"; <br />
last if !defined $Poi_lng;<br />
Log 5,"[getBlitzer] lat/lng: $Poi_lat $Poi_lng"; <br />
my $Poi_street = ReadingsVal($httpDev,"pois_".$num."_street","keine");<br />
my $Poi_vmax = ReadingsVal($httpDev,"pois_".$num."_vmax","kA");<br />
if (!defined $Poi_vmax){<br />
$Poi_vmax = ".";<br />
}<br />
if ($Poi_vmax eq ""){<br />
$Poi_vmax = ".";<br />
}<br />
Log 5,"[getBlitzer] $Poi_street $Poi_vmax"; <br />
<br />
#Entfernung zur Home-Koordinate (Luftlinie)<br />
#Berechnung nach: https://www.kompf.de/gps/distcalc.html<br />
#Einfache Variante<br />
my $dx = 71.5 * abs($lng - $Poi_lng);<br />
my $dy = 111.3 * abs($lat - $Poi_lat);<br />
my $distance = sqrt($dx * $dx + $dy * $dy);<br />
<br />
#MaxEntfernung einbeziehen<br />
if (not $distance > $maxkm){<br />
Log 5,"[getBlitzer] distance: $distance"; <br />
push @Liste, [ $distance, $Poi_street, $Poi_vmax, $Poi_lat, $Poi_lng ]; <br />
} else {<br />
Log 5,"[getBlitzer] $distance > $maxkm"; <br />
}<br />
<br />
<br />
}<br />
my $out = join(", ", @Liste)."\n";<br />
Log 5,"[getBlitzer] $out"; <br />
my @ListeSort = sort {$a->[0] <=> $b->[0]} @Liste;<br />
$out = join(", ", @ListeSort)."\n";<br />
Log 5,"[getBlitzer] $out"; <br />
<br />
#Eintragen ins Dummy-Device<br />
#Eintragungen erst löschen<br />
fhem("deletereading $BlitzerDev .*", 1);<br />
<br />
my $Text="";<br />
my $Anzahl = scalar(@ListeSort);<br />
for (my $i=0;$i<$Anzahl;$i++) {<br />
my $num = sprintf("%02d", $i);<br />
Log 5,"[getBlitzer] Num: $num"; <br />
fhem("setreading $BlitzerDev ".$num."Entfernung ".$ListeSort[$i][0]);<br />
fhem("setreading $BlitzerDev ".$num."Strasse ".$ListeSort[$i][1]);<br />
fhem("setreading $BlitzerDev ".$num."VMax ".$ListeSort[$i][2]);<br />
<br />
#Ort<br />
fhem("sleep 1; \{getBlitzerOrte(".$ListeSort[$i][3].",".$ListeSort[$i][4].",'$num','$BlitzerDev')};");<br />
<br />
}<br />
fhem("sleep 3; \{getBlitzerText('$BlitzerDev')};");<br />
#fhem("setreading $BlitzerDev Text $Text");<br />
<br />
}<br />
sub getBlitzerOrte($$$$){<br />
#https://nominatim.openstreetmap.org/search/52.xxxxx%208.xxxx?format=json&addressdetails=1<br />
my $Poi_lat = shift;<br />
my $Poi_lng = shift;<br />
my $num = shift;<br />
$num = sprintf("%02d", $num);<br />
my $BlitzerDev = shift;<br />
<br />
<br />
my $hash = {};<br />
$hash->{'blitzerdev'} = $BlitzerDev;<br />
$hash->{'num'} = $num;<br />
my $param = {<br />
url => "https://nominatim.openstreetmap.org/reverse?format=json&lat=".$Poi_lat."&lon=".$Poi_lng,<br />
timeout => 5,<br />
method => "GET", # Lesen von Inhalten<br />
hash => $hash, # Muss gesetzt werden, damit die Callback funktion wieder $hash hat<br />
header => "",<br />
callback => \&getBlitzerOrteCallback # Diese Funktion soll das Ergebnis dieser HTTP Anfrage bearbeiten<br />
};<br />
#agent: FHEM/1.0\r\nUser-Agent: FHEM/1.0\r\nAccept: application/json<br />
<br />
HttpUtils_NonblockingGet($param); # Starten der HTTP Abfrage. Es gibt keinen Return-Code.<br />
<br />
}<br />
sub getBlitzerOrteCallback($) {<br />
my ($param, $err, $data) = @_;<br />
my $hash = $param->{hash};<br />
my $BlitzerDev = $hash->{blitzerdev};<br />
my $num = $hash->{num};<br />
<br />
if($err ne "") # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist<br />
{<br />
Log3 "[getBlitzerOrte]", 3, "error while requesting ".$param->{url}." - $err"; # Eintrag fürs Log<br />
}<br />
#Log 1,"[getBlitzerOrte] $BlitzerDev ".$param->{data}." ".$param->{url}." ".$param->{httpheader}." ".$param->{code};<br />
#Log 1,"$data";<br />
<br />
my $Stadtteil = "";<br />
my $Stadt = "";<br />
<br />
my ($Stadtteil) = $data =~ m/suburb":"([^"]+)"/;<br />
if ((!defined $Stadtteil) or ($Stadtteil eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search city_district";<br />
($Stadtteil) = $data =~ m/city_district":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadtteil";<br />
}<br />
if ((!defined $Stadtteil) or ($Stadtteil eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] $Stadtteil";<br />
Log 5, "[getBlitzerOrteCallback] ".$param->{url};<br />
Log 5, "[getBlitzerOrteCallback] $data";<br />
$Stadtteil = ".";<br />
}<br />
<br />
my ($Stadt) = $data =~ m/city":"([^"]+)"/;<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search village $data";<br />
($Stadt) = $data =~ m/town":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
}<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search village $data";<br />
($Stadt) = $data =~ m/village":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
}<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
Log 5, "[getBlitzerOrteCallback] ".$param->{url};<br />
Log 5, "[getBlitzerOrteCallback] $data";<br />
$Stadt = ".";<br />
}<br />
my ($building) = $data =~ m/building":"([^"]+)"/;<br />
if ((!defined $building) or ($building eq "")){<br />
$building = ".";<br />
}<br />
Log 5,"[getBlitzerOrteCallback] $Stadt $Stadtteil $building";<br />
#Log 1,"[getBlitzerOrte] ".$decoded_json->{address}->{suburb}->[0];<br />
if ($Stadt eq "."){$Stadt = " "};<br />
if ($Stadtteil eq "."){$Stadtteil = " "};<br />
fhem("setreading $BlitzerDev ".$num."Ort $Stadt $Stadtteil");<br />
fhem("setreading $BlitzerDev ".$num."Building $building");<br />
}<br />
sub getBlitzerText($){<br />
my $BlitzerDev = shift;<br />
my $Text="<html> <p align='left'>";<br />
my $SollAnzeige=0;<br />
for(my $i=0;$i<100;$i++){<br />
my $num = sprintf("%02d", $i);<br />
my $Entf = ReadingsVal($BlitzerDev,$num."Entfernung",undef);<br />
last if !defined $Entf;<br />
my $Ort = ReadingsVal($BlitzerDev,$num."Ort",".");<br />
if ($Ort eq "."){$Ort = " "};<br />
my $building = ReadingsVal($BlitzerDev,$num."Building",0);<br />
if ($building eq "."){$building = " "};<br />
my $Strasse = ReadingsVal($BlitzerDev,$num."Strasse"," ");<br />
my $VMax = ReadingsVal($BlitzerDev,$num."VMax"," ");<br />
if (not $Text eq "<html> <p align='left'>"){<br />
$Text = $Text."\n <br>"; <br />
}<br />
$Text = $Text."$num $Ort $Strasse $building Max $VMax km/h (".sprintf("%.1f", "$Entf")."km) !!";<br />
$SollAnzeige=1;<br />
}<br />
$Text = $Text."</p></html>";<br />
fhem("setreading $BlitzerDev Text $Text");<br />
fhem("setreading $BlitzerDev Anzeige $SollAnzeige");<br />
}<br />
</source><br />
<br />
Von besonderem Interesse ist hier die Zeile <br />
<br />
<source lang="perl"><br />
$Text = $Text."$num $Ort $Strasse $building Max $VMax km/h (".sprintf("%.1f", "$Entf")."km) !!";<br />
</source><br />
<br />
Diese Zeile kann man den eigenen Bedürfnissen anpassen, beispielhaft so:<br />
<source lang="perl"><br />
$Text = $Text."$Ort $Strasse $building $VMax km/h";<br />
</source><br />
Dieser Version ist günstiger für [[FHEM Tablet UI|FTUI]], da die Zeilenausgaben kürzer ist.<br />
<br />
==Code für FTUI==<br />
<source lang="html"><br />
<div data-type="label"<br />
data-device="blitzer"<br />
data-get="Text"><br />
</source><br />
<br />
==Hinweis==<br />
Es gibt mehrere Anpassungsvorschäge. Diese sind im Forum zu finden: {{Link2Forum|Topic=90014|LinkText=Blitzer anzeigen}}. Fragen zum Code bitte dort stellen.<br />
<br />
Screenshot fehlt<br />
<br />
[[Kategorie:Code_Snippets]]<br />
[[Kategorie:FHEM Tablet UI|Blitzer]]</div>Curthttp://wiki.fhem.de/w/index.php?title=Stra%C3%9Fenverkehr_Blitzer&diff=30074Straßenverkehr Blitzer2019-04-03T17:38:07Z<p>Curt: mom</p>
<hr />
<div>{{Baustelle}} <br />
<br />
{{Infobox Modul|<br />
|ModPurpose=Geschwindigkeitsüberwachung Blitzer<br />
|ModType=x<br />
|ModCmdRef=blitzer<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=98_Blitzer.pm<br />
|ModOwner=bismosa<br />
}}<br />
<br />
@Wiki-Admin: <br />
* Link auf bismosa fehlt<br />
* Link auf https://forum.fhem.de/index.php/topic,99070.0.html fehlt<br />
<br />
'''Straßenverkehr Blitzer''' ist ein Modul, welches mobile Verkehrsüberwachungsanlagen (aka Blitzer) ein Internet Portal abfragt und für den Umkreis des eigenen Standorts auflistet. <br />
<br />
== Features / Funktionen ==<br />
Die Haupteigenschaften von <br />
<br />
'''Ab hier ist veralteter Code ohne Modul, aber funktional!'''<br />
<br />
Vom gleichen Autoren gibt es mit gleicher Funktionalität nun ein inoffizielles Modul: https://forum.fhem.de/index.php/topic,90014.0.html<br />
<br />
Der [[{{PAGENAME}}|Code "Blitzer"]] (Autor: {{Link2FU|30971|bismosa}}]) ist ein Code zur listenförmigen Anzeige mobiler Geschwindigkeitsüberwachungen (Radarfallen) im Straßenverkehr. Er kann problemlos in [[FHEM Tablet UI]] genutzt werden. 2019-02 wurde es geprüft und war funktional.<br />
<br />
Es wird ausdrücklich auf den Thread {{Link2Forum|Topic=90014|LinkText=Blitzer anzeigen}} im FHEM-Forum verwiesen: Im ersten Beitrag pflegt der Autor den Code nach.<br />
<br />
==Funktionalität==<br />
Ausgehend von einer vorgegebenen Koordinate werden alle gemeldeten Blitzer im beliebigen Umkreis (bis 99 Kilometer) aufgelistet. Zusätzlich existiert ein Reading "Anzeige": "0", wenn keine Blitzer im definierten Umkreis vorliegen, "1" wenn dort Blitzer vorliegen.<br />
<br />
==Code mit Erläuterungen==<br />
<source lang="html"><br />
defmod blitzer dummy<br />
attr blitzer userattr lat lng maxkm<br />
attr blitzer icon ampel_rot<br />
attr blitzer lat 51.8644<br />
attr blitzer lng 12.6346<br />
attr blitzer maxkm 25<br />
attr blitzer stateFormat Text<br />
attr blitzer room 61 Verkehr<br />
</source><br />
<br />
Damit wird die Definition des basierenden Dummy-Devices vorgenommen. Hier ist die Mittelpunktskoordinate (lat/lon) an die eigenen Bedürfnisse anzupassen: HIer bin ich, welche Blitzer sind im Umkreis? - "maxkm" definiert den Radius um die Koordinate, in dessen Kreisfläche alle gemeldeten Blitzer gelistet werden sollen. "room" kann den eigenen Bedürfnissen angepasst werden.<br />
<br />
<source lang="html"><br />
defmod httpmod_blitzer HTTPMOD https://cdn2.atudo.net/api/1.0/vl.php?type=0,1,2,3,4,5,6&box=51.6,12.1,52.0,13.0 0<br />
attr httpmod_blitzer userattr getData getHeader1 getHeader2 getURL reading01DeleteIfUnmatched reading01JSON reading01Name reading01Regex reading02Name reading02RegOpt reading02Regex reading03JSON reading03Name readingEncode requestHeader1 requestHeader2 setParseResponse:0,1<br />
attr httpmod_blitzer enableControlSet 1<br />
attr httpmod_blitzer extractAllJSON 1<br />
attr httpmod_blitzer getHeader1 Content-Type: application/json<br />
attr httpmod_blitzer getHeader2 Accept: */*<br />
attr httpmod_blitzer readingEncode utf8<br />
attr httpmod_blitzer room 61 Verkehr<br />
</source><br />
<br />
Mit dieser Device wird die Internetabfrage definiert. Der "room" kann an eigene Befürfnisse angepasst werden. Die Definition selbst (defmod httpmod_blitzer) '''muss''' angepasst werden, es geht um den letzten Teil: "box=51.6,12.1,52.0,13.0 0". Gedanklich bildet man ein Quadrat um die Mittelpunktkoordinate. Für die ersten beiden Parameter bestimmt man die Koordinate der linken unteren Ecke. Für die beiden folgenden Parameter bestimmt man die Koordinaten der rechten oberen Ecke und trägt auch sie ein. Dabei muss man nicht sehr genau vorgehen: Ein ungefähres Rechteck reicht völlig. - Die abschließende Null '''muss''' unverändert bleiben: Der Abruf wird von einem Script gesteuert.<br />
<br />
<source lang="html"><br />
defmod at_Blitzer at +*00:10:00 {\<br />
fhem("deletereading httpmod_blitzer .*", 1);;\<br />
fhem("set httpmod_blitzer reread");;;;\<br />
fhem("sleep 2;; {getBlitzer};;");;;;\<br />
}<br />
attr at_Blitzer room 99_System<br />
</source><br />
<br />
Dieser Code-Teil sollte nicht geändert werden: Alle 10 Minuten werden alle Readings (Blitzer) gelöscht und via Web der aktuelle Stand erfragt.<br />
<br />
==99_myUtils.pm==<br />
In 99_myUtils.pm muss ein längerer Codeblock eingefügt werden. Er sollte ganz unten vor dem Codeteil<br />
<br />
<source lang="perl"><br />
1;<br />
</source><br />
stehen.<br />
<br />
<source lang="perl"><br />
################################################################<br />
### Blitzer ###<br />
################################################################<br />
sub getBlitzer(){<br />
my $httpDev = "httpmod_blitzer";<br />
my $BlitzerDev = "blitzer";<br />
my $lat = AttrVal($BlitzerDev,"lat",undef);<br />
my $lng = AttrVal($BlitzerDev,"lng",undef);<br />
my $maxkm = AttrVal($BlitzerDev,"maxkm",undef);<br />
if (!defined $lat){<br />
Log 5,"[getBlitzer] lat ist nicht definiert!"; <br />
}<br />
if (!defined $lng){<br />
Log 5,"[getBlitzer] lng ist nicht definiert!"; <br />
}<br />
if (!defined $maxkm){<br />
Log 5,"[getBlitzer] maxkm ist nicht definiert!"; <br />
}<br />
# Da unbekannt ist, wie viele es gibt...durchprobieren<br />
my @Liste;<br />
for(my $i=1;$i<100;$i++){<br />
my $num = sprintf("%02d", $i);<br />
Log 5,"[getBlitzer] Reading: $num"; <br />
my $Poi_lat = ReadingsVal($httpDev,"pois_".$num."_lat",undef);<br />
my $Poi_lng = ReadingsVal($httpDev,"pois_".$num."_lng",undef);<br />
last if !defined $Poi_lat;<br />
#Log 1,"[getBlitzer] Reading: $Poi_lat"; <br />
last if !defined $Poi_lng;<br />
Log 5,"[getBlitzer] lat/lng: $Poi_lat $Poi_lng"; <br />
my $Poi_street = ReadingsVal($httpDev,"pois_".$num."_street","keine");<br />
my $Poi_vmax = ReadingsVal($httpDev,"pois_".$num."_vmax","kA");<br />
if (!defined $Poi_vmax){<br />
$Poi_vmax = ".";<br />
}<br />
if ($Poi_vmax eq ""){<br />
$Poi_vmax = ".";<br />
}<br />
Log 5,"[getBlitzer] $Poi_street $Poi_vmax"; <br />
<br />
#Entfernung zur Home-Koordinate (Luftlinie)<br />
#Berechnung nach: https://www.kompf.de/gps/distcalc.html<br />
#Einfache Variante<br />
my $dx = 71.5 * abs($lng - $Poi_lng);<br />
my $dy = 111.3 * abs($lat - $Poi_lat);<br />
my $distance = sqrt($dx * $dx + $dy * $dy);<br />
<br />
#MaxEntfernung einbeziehen<br />
if (not $distance > $maxkm){<br />
Log 5,"[getBlitzer] distance: $distance"; <br />
push @Liste, [ $distance, $Poi_street, $Poi_vmax, $Poi_lat, $Poi_lng ]; <br />
} else {<br />
Log 5,"[getBlitzer] $distance > $maxkm"; <br />
}<br />
<br />
<br />
}<br />
my $out = join(", ", @Liste)."\n";<br />
Log 5,"[getBlitzer] $out"; <br />
my @ListeSort = sort {$a->[0] <=> $b->[0]} @Liste;<br />
$out = join(", ", @ListeSort)."\n";<br />
Log 5,"[getBlitzer] $out"; <br />
<br />
#Eintragen ins Dummy-Device<br />
#Eintragungen erst löschen<br />
fhem("deletereading $BlitzerDev .*", 1);<br />
<br />
my $Text="";<br />
my $Anzahl = scalar(@ListeSort);<br />
for (my $i=0;$i<$Anzahl;$i++) {<br />
my $num = sprintf("%02d", $i);<br />
Log 5,"[getBlitzer] Num: $num"; <br />
fhem("setreading $BlitzerDev ".$num."Entfernung ".$ListeSort[$i][0]);<br />
fhem("setreading $BlitzerDev ".$num."Strasse ".$ListeSort[$i][1]);<br />
fhem("setreading $BlitzerDev ".$num."VMax ".$ListeSort[$i][2]);<br />
<br />
#Ort<br />
fhem("sleep 1; \{getBlitzerOrte(".$ListeSort[$i][3].",".$ListeSort[$i][4].",'$num','$BlitzerDev')};");<br />
<br />
}<br />
fhem("sleep 3; \{getBlitzerText('$BlitzerDev')};");<br />
#fhem("setreading $BlitzerDev Text $Text");<br />
<br />
}<br />
sub getBlitzerOrte($$$$){<br />
#https://nominatim.openstreetmap.org/search/52.xxxxx%208.xxxx?format=json&addressdetails=1<br />
my $Poi_lat = shift;<br />
my $Poi_lng = shift;<br />
my $num = shift;<br />
$num = sprintf("%02d", $num);<br />
my $BlitzerDev = shift;<br />
<br />
<br />
my $hash = {};<br />
$hash->{'blitzerdev'} = $BlitzerDev;<br />
$hash->{'num'} = $num;<br />
my $param = {<br />
url => "https://nominatim.openstreetmap.org/reverse?format=json&lat=".$Poi_lat."&lon=".$Poi_lng,<br />
timeout => 5,<br />
method => "GET", # Lesen von Inhalten<br />
hash => $hash, # Muss gesetzt werden, damit die Callback funktion wieder $hash hat<br />
header => "",<br />
callback => \&getBlitzerOrteCallback # Diese Funktion soll das Ergebnis dieser HTTP Anfrage bearbeiten<br />
};<br />
#agent: FHEM/1.0\r\nUser-Agent: FHEM/1.0\r\nAccept: application/json<br />
<br />
HttpUtils_NonblockingGet($param); # Starten der HTTP Abfrage. Es gibt keinen Return-Code.<br />
<br />
}<br />
sub getBlitzerOrteCallback($) {<br />
my ($param, $err, $data) = @_;<br />
my $hash = $param->{hash};<br />
my $BlitzerDev = $hash->{blitzerdev};<br />
my $num = $hash->{num};<br />
<br />
if($err ne "") # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist<br />
{<br />
Log3 "[getBlitzerOrte]", 3, "error while requesting ".$param->{url}." - $err"; # Eintrag fürs Log<br />
}<br />
#Log 1,"[getBlitzerOrte] $BlitzerDev ".$param->{data}." ".$param->{url}." ".$param->{httpheader}." ".$param->{code};<br />
#Log 1,"$data";<br />
<br />
my $Stadtteil = "";<br />
my $Stadt = "";<br />
<br />
my ($Stadtteil) = $data =~ m/suburb":"([^"]+)"/;<br />
if ((!defined $Stadtteil) or ($Stadtteil eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search city_district";<br />
($Stadtteil) = $data =~ m/city_district":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadtteil";<br />
}<br />
if ((!defined $Stadtteil) or ($Stadtteil eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] $Stadtteil";<br />
Log 5, "[getBlitzerOrteCallback] ".$param->{url};<br />
Log 5, "[getBlitzerOrteCallback] $data";<br />
$Stadtteil = ".";<br />
}<br />
<br />
my ($Stadt) = $data =~ m/city":"([^"]+)"/;<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search village $data";<br />
($Stadt) = $data =~ m/town":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
}<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search village $data";<br />
($Stadt) = $data =~ m/village":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
}<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
Log 5, "[getBlitzerOrteCallback] ".$param->{url};<br />
Log 5, "[getBlitzerOrteCallback] $data";<br />
$Stadt = ".";<br />
}<br />
my ($building) = $data =~ m/building":"([^"]+)"/;<br />
if ((!defined $building) or ($building eq "")){<br />
$building = ".";<br />
}<br />
Log 5,"[getBlitzerOrteCallback] $Stadt $Stadtteil $building";<br />
#Log 1,"[getBlitzerOrte] ".$decoded_json->{address}->{suburb}->[0];<br />
if ($Stadt eq "."){$Stadt = " "};<br />
if ($Stadtteil eq "."){$Stadtteil = " "};<br />
fhem("setreading $BlitzerDev ".$num."Ort $Stadt $Stadtteil");<br />
fhem("setreading $BlitzerDev ".$num."Building $building");<br />
}<br />
sub getBlitzerText($){<br />
my $BlitzerDev = shift;<br />
my $Text="<html> <p align='left'>";<br />
my $SollAnzeige=0;<br />
for(my $i=0;$i<100;$i++){<br />
my $num = sprintf("%02d", $i);<br />
my $Entf = ReadingsVal($BlitzerDev,$num."Entfernung",undef);<br />
last if !defined $Entf;<br />
my $Ort = ReadingsVal($BlitzerDev,$num."Ort",".");<br />
if ($Ort eq "."){$Ort = " "};<br />
my $building = ReadingsVal($BlitzerDev,$num."Building",0);<br />
if ($building eq "."){$building = " "};<br />
my $Strasse = ReadingsVal($BlitzerDev,$num."Strasse"," ");<br />
my $VMax = ReadingsVal($BlitzerDev,$num."VMax"," ");<br />
if (not $Text eq "<html> <p align='left'>"){<br />
$Text = $Text."\n <br>"; <br />
}<br />
$Text = $Text."$num $Ort $Strasse $building Max $VMax km/h (".sprintf("%.1f", "$Entf")."km) !!";<br />
$SollAnzeige=1;<br />
}<br />
$Text = $Text."</p></html>";<br />
fhem("setreading $BlitzerDev Text $Text");<br />
fhem("setreading $BlitzerDev Anzeige $SollAnzeige");<br />
}<br />
</source><br />
<br />
Von besonderem Interesse ist hier die Zeile <br />
<br />
<source lang="perl"><br />
$Text = $Text."$num $Ort $Strasse $building Max $VMax km/h (".sprintf("%.1f", "$Entf")."km) !!";<br />
</source><br />
<br />
Diese Zeile kann man den eigenen Bedürfnissen anpassen, beispielhaft so:<br />
<source lang="perl"><br />
$Text = $Text."$Ort $Strasse $building $VMax km/h";<br />
</source><br />
Dieser Version ist günstiger für [[FHEM Tablet UI|FTUI]], da die Zeilenausgaben kürzer ist.<br />
<br />
==Code für FTUI==<br />
<source lang="html"><br />
<div data-type="label"<br />
data-device="blitzer"<br />
data-get="Text"><br />
</source><br />
<br />
==Hinweis==<br />
Es gibt mehrere Anpassungsvorschäge. Diese sind im Forum zu finden: {{Link2Forum|Topic=90014|LinkText=Blitzer anzeigen}}. Fragen zum Code bitte dort stellen.<br />
<br />
Screenshot fehlt<br />
<br />
[[Kategorie:Code_Snippets]]<br />
[[Kategorie:FHEM Tablet UI|Blitzer]]</div>Curthttp://wiki.fhem.de/w/index.php?title=Stra%C3%9Fenverkehr_Blitzer&diff=30034Straßenverkehr Blitzer2019-04-01T19:27:30Z<p>Curt: </p>
<hr />
<div>'''Dieser Beitrag ist veraltet!'''<br />
<br />
Vom gleichen Autoren gibt es mit gleicher Funktionalität nun ein inoffizielles Modul: https://forum.fhem.de/index.php/topic,90014.0.html<br />
<br />
Der [[{{PAGENAME}}|Code "Blitzer"]] (Autor: {{Link2FU|30971|bismosa}}]) ist ein Code zur listenförmigen Anzeige mobiler Geschwindigkeitsüberwachungen (Radarfallen) im Straßenverkehr. Er kann problemlos in [[FHEM Tablet UI]] genutzt werden. 2019-02 wurde es geprüft und war funktional.<br />
<br />
Es wird ausdrücklich auf den Thread {{Link2Forum|Topic=90014|LinkText=Blitzer anzeigen}} im FHEM-Forum verwiesen: Im ersten Beitrag pflegt der Autor den Code nach.<br />
<br />
==Funktionalität==<br />
Ausgehend von einer vorgegebenen Koordinate werden alle gemeldeten Blitzer im beliebigen Umkreis (bis 99 Kilometer) aufgelistet. Zusätzlich existiert ein Reading "Anzeige": "0", wenn keine Blitzer im definierten Umkreis vorliegen, "1" wenn dort Blitzer vorliegen.<br />
<br />
==Code mit Erläuterungen==<br />
<source lang="html"><br />
defmod blitzer dummy<br />
attr blitzer userattr lat lng maxkm<br />
attr blitzer icon ampel_rot<br />
attr blitzer lat 51.8644<br />
attr blitzer lng 12.6346<br />
attr blitzer maxkm 25<br />
attr blitzer stateFormat Text<br />
attr blitzer room 61 Verkehr<br />
</source><br />
<br />
Damit wird die Definition des basierenden Dummy-Devices vorgenommen. Hier ist die Mittelpunktskoordinate (lat/lon) an die eigenen Bedürfnisse anzupassen: HIer bin ich, welche Blitzer sind im Umkreis? - "maxkm" definiert den Radius um die Koordinate, in dessen Kreisfläche alle gemeldeten Blitzer gelistet werden sollen. "room" kann den eigenen Bedürfnissen angepasst werden.<br />
<br />
<source lang="html"><br />
defmod httpmod_blitzer HTTPMOD https://cdn2.atudo.net/api/1.0/vl.php?type=0,1,2,3,4,5,6&box=51.6,12.1,52.0,13.0 0<br />
attr httpmod_blitzer userattr getData getHeader1 getHeader2 getURL reading01DeleteIfUnmatched reading01JSON reading01Name reading01Regex reading02Name reading02RegOpt reading02Regex reading03JSON reading03Name readingEncode requestHeader1 requestHeader2 setParseResponse:0,1<br />
attr httpmod_blitzer enableControlSet 1<br />
attr httpmod_blitzer extractAllJSON 1<br />
attr httpmod_blitzer getHeader1 Content-Type: application/json<br />
attr httpmod_blitzer getHeader2 Accept: */*<br />
attr httpmod_blitzer readingEncode utf8<br />
attr httpmod_blitzer room 61 Verkehr<br />
</source><br />
<br />
Mit dieser Device wird die Internetabfrage definiert. Der "room" kann an eigene Befürfnisse angepasst werden. Die Definition selbst (defmod httpmod_blitzer) '''muss''' angepasst werden, es geht um den letzten Teil: "box=51.6,12.1,52.0,13.0 0". Gedanklich bildet man ein Quadrat um die Mittelpunktkoordinate. Für die ersten beiden Parameter bestimmt man die Koordinate der linken unteren Ecke. Für die beiden folgenden Parameter bestimmt man die Koordinaten der rechten oberen Ecke und trägt auch sie ein. Dabei muss man nicht sehr genau vorgehen: Ein ungefähres Rechteck reicht völlig. - Die abschließende Null '''muss''' unverändert bleiben: Der Abruf wird von einem Script gesteuert.<br />
<br />
<source lang="html"><br />
defmod at_Blitzer at +*00:10:00 {\<br />
fhem("deletereading httpmod_blitzer .*", 1);;\<br />
fhem("set httpmod_blitzer reread");;;;\<br />
fhem("sleep 2;; {getBlitzer};;");;;;\<br />
}<br />
attr at_Blitzer room 99_System<br />
</source><br />
<br />
Dieser Code-Teil sollte nicht geändert werden: Alle 10 Minuten werden alle Readings (Blitzer) gelöscht und via Web der aktuelle Stand erfragt.<br />
<br />
==99_myUtils.pm==<br />
In 99_myUtils.pm muss ein längerer Codeblock eingefügt werden. Er sollte ganz unten vor dem Codeteil<br />
<br />
<source lang="perl"><br />
1;<br />
</source><br />
stehen.<br />
<br />
<source lang="perl"><br />
################################################################<br />
### Blitzer ###<br />
################################################################<br />
sub getBlitzer(){<br />
my $httpDev = "httpmod_blitzer";<br />
my $BlitzerDev = "blitzer";<br />
my $lat = AttrVal($BlitzerDev,"lat",undef);<br />
my $lng = AttrVal($BlitzerDev,"lng",undef);<br />
my $maxkm = AttrVal($BlitzerDev,"maxkm",undef);<br />
if (!defined $lat){<br />
Log 5,"[getBlitzer] lat ist nicht definiert!"; <br />
}<br />
if (!defined $lng){<br />
Log 5,"[getBlitzer] lng ist nicht definiert!"; <br />
}<br />
if (!defined $maxkm){<br />
Log 5,"[getBlitzer] maxkm ist nicht definiert!"; <br />
}<br />
# Da unbekannt ist, wie viele es gibt...durchprobieren<br />
my @Liste;<br />
for(my $i=1;$i<100;$i++){<br />
my $num = sprintf("%02d", $i);<br />
Log 5,"[getBlitzer] Reading: $num"; <br />
my $Poi_lat = ReadingsVal($httpDev,"pois_".$num."_lat",undef);<br />
my $Poi_lng = ReadingsVal($httpDev,"pois_".$num."_lng",undef);<br />
last if !defined $Poi_lat;<br />
#Log 1,"[getBlitzer] Reading: $Poi_lat"; <br />
last if !defined $Poi_lng;<br />
Log 5,"[getBlitzer] lat/lng: $Poi_lat $Poi_lng"; <br />
my $Poi_street = ReadingsVal($httpDev,"pois_".$num."_street","keine");<br />
my $Poi_vmax = ReadingsVal($httpDev,"pois_".$num."_vmax","kA");<br />
if (!defined $Poi_vmax){<br />
$Poi_vmax = ".";<br />
}<br />
if ($Poi_vmax eq ""){<br />
$Poi_vmax = ".";<br />
}<br />
Log 5,"[getBlitzer] $Poi_street $Poi_vmax"; <br />
<br />
#Entfernung zur Home-Koordinate (Luftlinie)<br />
#Berechnung nach: https://www.kompf.de/gps/distcalc.html<br />
#Einfache Variante<br />
my $dx = 71.5 * abs($lng - $Poi_lng);<br />
my $dy = 111.3 * abs($lat - $Poi_lat);<br />
my $distance = sqrt($dx * $dx + $dy * $dy);<br />
<br />
#MaxEntfernung einbeziehen<br />
if (not $distance > $maxkm){<br />
Log 5,"[getBlitzer] distance: $distance"; <br />
push @Liste, [ $distance, $Poi_street, $Poi_vmax, $Poi_lat, $Poi_lng ]; <br />
} else {<br />
Log 5,"[getBlitzer] $distance > $maxkm"; <br />
}<br />
<br />
<br />
}<br />
my $out = join(", ", @Liste)."\n";<br />
Log 5,"[getBlitzer] $out"; <br />
my @ListeSort = sort {$a->[0] <=> $b->[0]} @Liste;<br />
$out = join(", ", @ListeSort)."\n";<br />
Log 5,"[getBlitzer] $out"; <br />
<br />
#Eintragen ins Dummy-Device<br />
#Eintragungen erst löschen<br />
fhem("deletereading $BlitzerDev .*", 1);<br />
<br />
my $Text="";<br />
my $Anzahl = scalar(@ListeSort);<br />
for (my $i=0;$i<$Anzahl;$i++) {<br />
my $num = sprintf("%02d", $i);<br />
Log 5,"[getBlitzer] Num: $num"; <br />
fhem("setreading $BlitzerDev ".$num."Entfernung ".$ListeSort[$i][0]);<br />
fhem("setreading $BlitzerDev ".$num."Strasse ".$ListeSort[$i][1]);<br />
fhem("setreading $BlitzerDev ".$num."VMax ".$ListeSort[$i][2]);<br />
<br />
#Ort<br />
fhem("sleep 1; \{getBlitzerOrte(".$ListeSort[$i][3].",".$ListeSort[$i][4].",'$num','$BlitzerDev')};");<br />
<br />
}<br />
fhem("sleep 3; \{getBlitzerText('$BlitzerDev')};");<br />
#fhem("setreading $BlitzerDev Text $Text");<br />
<br />
}<br />
sub getBlitzerOrte($$$$){<br />
#https://nominatim.openstreetmap.org/search/52.xxxxx%208.xxxx?format=json&addressdetails=1<br />
my $Poi_lat = shift;<br />
my $Poi_lng = shift;<br />
my $num = shift;<br />
$num = sprintf("%02d", $num);<br />
my $BlitzerDev = shift;<br />
<br />
<br />
my $hash = {};<br />
$hash->{'blitzerdev'} = $BlitzerDev;<br />
$hash->{'num'} = $num;<br />
my $param = {<br />
url => "https://nominatim.openstreetmap.org/reverse?format=json&lat=".$Poi_lat."&lon=".$Poi_lng,<br />
timeout => 5,<br />
method => "GET", # Lesen von Inhalten<br />
hash => $hash, # Muss gesetzt werden, damit die Callback funktion wieder $hash hat<br />
header => "",<br />
callback => \&getBlitzerOrteCallback # Diese Funktion soll das Ergebnis dieser HTTP Anfrage bearbeiten<br />
};<br />
#agent: FHEM/1.0\r\nUser-Agent: FHEM/1.0\r\nAccept: application/json<br />
<br />
HttpUtils_NonblockingGet($param); # Starten der HTTP Abfrage. Es gibt keinen Return-Code.<br />
<br />
}<br />
sub getBlitzerOrteCallback($) {<br />
my ($param, $err, $data) = @_;<br />
my $hash = $param->{hash};<br />
my $BlitzerDev = $hash->{blitzerdev};<br />
my $num = $hash->{num};<br />
<br />
if($err ne "") # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist<br />
{<br />
Log3 "[getBlitzerOrte]", 3, "error while requesting ".$param->{url}." - $err"; # Eintrag fürs Log<br />
}<br />
#Log 1,"[getBlitzerOrte] $BlitzerDev ".$param->{data}." ".$param->{url}." ".$param->{httpheader}." ".$param->{code};<br />
#Log 1,"$data";<br />
<br />
my $Stadtteil = "";<br />
my $Stadt = "";<br />
<br />
my ($Stadtteil) = $data =~ m/suburb":"([^"]+)"/;<br />
if ((!defined $Stadtteil) or ($Stadtteil eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search city_district";<br />
($Stadtteil) = $data =~ m/city_district":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadtteil";<br />
}<br />
if ((!defined $Stadtteil) or ($Stadtteil eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] $Stadtteil";<br />
Log 5, "[getBlitzerOrteCallback] ".$param->{url};<br />
Log 5, "[getBlitzerOrteCallback] $data";<br />
$Stadtteil = ".";<br />
}<br />
<br />
my ($Stadt) = $data =~ m/city":"([^"]+)"/;<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search village $data";<br />
($Stadt) = $data =~ m/town":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
}<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search village $data";<br />
($Stadt) = $data =~ m/village":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
}<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
Log 5, "[getBlitzerOrteCallback] ".$param->{url};<br />
Log 5, "[getBlitzerOrteCallback] $data";<br />
$Stadt = ".";<br />
}<br />
my ($building) = $data =~ m/building":"([^"]+)"/;<br />
if ((!defined $building) or ($building eq "")){<br />
$building = ".";<br />
}<br />
Log 5,"[getBlitzerOrteCallback] $Stadt $Stadtteil $building";<br />
#Log 1,"[getBlitzerOrte] ".$decoded_json->{address}->{suburb}->[0];<br />
if ($Stadt eq "."){$Stadt = " "};<br />
if ($Stadtteil eq "."){$Stadtteil = " "};<br />
fhem("setreading $BlitzerDev ".$num."Ort $Stadt $Stadtteil");<br />
fhem("setreading $BlitzerDev ".$num."Building $building");<br />
}<br />
sub getBlitzerText($){<br />
my $BlitzerDev = shift;<br />
my $Text="<html> <p align='left'>";<br />
my $SollAnzeige=0;<br />
for(my $i=0;$i<100;$i++){<br />
my $num = sprintf("%02d", $i);<br />
my $Entf = ReadingsVal($BlitzerDev,$num."Entfernung",undef);<br />
last if !defined $Entf;<br />
my $Ort = ReadingsVal($BlitzerDev,$num."Ort",".");<br />
if ($Ort eq "."){$Ort = " "};<br />
my $building = ReadingsVal($BlitzerDev,$num."Building",0);<br />
if ($building eq "."){$building = " "};<br />
my $Strasse = ReadingsVal($BlitzerDev,$num."Strasse"," ");<br />
my $VMax = ReadingsVal($BlitzerDev,$num."VMax"," ");<br />
if (not $Text eq "<html> <p align='left'>"){<br />
$Text = $Text."\n <br>"; <br />
}<br />
$Text = $Text."$num $Ort $Strasse $building Max $VMax km/h (".sprintf("%.1f", "$Entf")."km) !!";<br />
$SollAnzeige=1;<br />
}<br />
$Text = $Text."</p></html>";<br />
fhem("setreading $BlitzerDev Text $Text");<br />
fhem("setreading $BlitzerDev Anzeige $SollAnzeige");<br />
}<br />
</source><br />
<br />
Von besonderem Interesse ist hier die Zeile <br />
<br />
<source lang="perl"><br />
$Text = $Text."$num $Ort $Strasse $building Max $VMax km/h (".sprintf("%.1f", "$Entf")."km) !!";<br />
</source><br />
<br />
Diese Zeile kann man den eigenen Bedürfnissen anpassen, beispielhaft so:<br />
<source lang="perl"><br />
$Text = $Text."$Ort $Strasse $building $VMax km/h";<br />
</source><br />
Dieser Version ist günstiger für [[FHEM Tablet UI|FTUI]], da die Zeilenausgaben kürzer ist.<br />
<br />
==Code für FTUI==<br />
<source lang="html"><br />
<div data-type="label"<br />
data-device="blitzer"<br />
data-get="Text"><br />
</source><br />
<br />
==Hinweis==<br />
Es gibt mehrere Anpassungsvorschäge. Diese sind im Forum zu finden: {{Link2Forum|Topic=90014|LinkText=Blitzer anzeigen}}. Fragen zum Code bitte dort stellen.<br />
<br />
Screenshot fehlt<br />
<br />
[[Kategorie:Code_Snippets]]<br />
[[Kategorie:FHEM Tablet UI|Blitzer]]</div>Curthttp://wiki.fhem.de/w/index.php?title=Stra%C3%9Fenverkehr_Blitzer&diff=30033Straßenverkehr Blitzer2019-04-01T19:26:53Z<p>Curt: Anm: veraltet</p>
<hr />
<div>'''Dieser Beitrag ist veraltet!'''<br />
<br />
Vom gleichen Autoren gibt es mit gleicher Funktionalität nun ein inoffizielles Modul.<br />
<br />
Der [[{{PAGENAME}}|Code "Blitzer"]] (Autor: {{Link2FU|30971|bismosa}}]) ist ein Code zur listenförmigen Anzeige mobiler Geschwindigkeitsüberwachungen (Radarfallen) im Straßenverkehr. Er kann problemlos in [[FHEM Tablet UI]] genutzt werden. 2019-02 wurde es geprüft und war funktional.<br />
<br />
Es wird ausdrücklich auf den Thread {{Link2Forum|Topic=90014|LinkText=Blitzer anzeigen}} im FHEM-Forum verwiesen: Im ersten Beitrag pflegt der Autor den Code nach.<br />
<br />
==Funktionalität==<br />
Ausgehend von einer vorgegebenen Koordinate werden alle gemeldeten Blitzer im beliebigen Umkreis (bis 99 Kilometer) aufgelistet. Zusätzlich existiert ein Reading "Anzeige": "0", wenn keine Blitzer im definierten Umkreis vorliegen, "1" wenn dort Blitzer vorliegen.<br />
<br />
==Code mit Erläuterungen==<br />
<source lang="html"><br />
defmod blitzer dummy<br />
attr blitzer userattr lat lng maxkm<br />
attr blitzer icon ampel_rot<br />
attr blitzer lat 51.8644<br />
attr blitzer lng 12.6346<br />
attr blitzer maxkm 25<br />
attr blitzer stateFormat Text<br />
attr blitzer room 61 Verkehr<br />
</source><br />
<br />
Damit wird die Definition des basierenden Dummy-Devices vorgenommen. Hier ist die Mittelpunktskoordinate (lat/lon) an die eigenen Bedürfnisse anzupassen: HIer bin ich, welche Blitzer sind im Umkreis? - "maxkm" definiert den Radius um die Koordinate, in dessen Kreisfläche alle gemeldeten Blitzer gelistet werden sollen. "room" kann den eigenen Bedürfnissen angepasst werden.<br />
<br />
<source lang="html"><br />
defmod httpmod_blitzer HTTPMOD https://cdn2.atudo.net/api/1.0/vl.php?type=0,1,2,3,4,5,6&box=51.6,12.1,52.0,13.0 0<br />
attr httpmod_blitzer userattr getData getHeader1 getHeader2 getURL reading01DeleteIfUnmatched reading01JSON reading01Name reading01Regex reading02Name reading02RegOpt reading02Regex reading03JSON reading03Name readingEncode requestHeader1 requestHeader2 setParseResponse:0,1<br />
attr httpmod_blitzer enableControlSet 1<br />
attr httpmod_blitzer extractAllJSON 1<br />
attr httpmod_blitzer getHeader1 Content-Type: application/json<br />
attr httpmod_blitzer getHeader2 Accept: */*<br />
attr httpmod_blitzer readingEncode utf8<br />
attr httpmod_blitzer room 61 Verkehr<br />
</source><br />
<br />
Mit dieser Device wird die Internetabfrage definiert. Der "room" kann an eigene Befürfnisse angepasst werden. Die Definition selbst (defmod httpmod_blitzer) '''muss''' angepasst werden, es geht um den letzten Teil: "box=51.6,12.1,52.0,13.0 0". Gedanklich bildet man ein Quadrat um die Mittelpunktkoordinate. Für die ersten beiden Parameter bestimmt man die Koordinate der linken unteren Ecke. Für die beiden folgenden Parameter bestimmt man die Koordinaten der rechten oberen Ecke und trägt auch sie ein. Dabei muss man nicht sehr genau vorgehen: Ein ungefähres Rechteck reicht völlig. - Die abschließende Null '''muss''' unverändert bleiben: Der Abruf wird von einem Script gesteuert.<br />
<br />
<source lang="html"><br />
defmod at_Blitzer at +*00:10:00 {\<br />
fhem("deletereading httpmod_blitzer .*", 1);;\<br />
fhem("set httpmod_blitzer reread");;;;\<br />
fhem("sleep 2;; {getBlitzer};;");;;;\<br />
}<br />
attr at_Blitzer room 99_System<br />
</source><br />
<br />
Dieser Code-Teil sollte nicht geändert werden: Alle 10 Minuten werden alle Readings (Blitzer) gelöscht und via Web der aktuelle Stand erfragt.<br />
<br />
==99_myUtils.pm==<br />
In 99_myUtils.pm muss ein längerer Codeblock eingefügt werden. Er sollte ganz unten vor dem Codeteil<br />
<br />
<source lang="perl"><br />
1;<br />
</source><br />
stehen.<br />
<br />
<source lang="perl"><br />
################################################################<br />
### Blitzer ###<br />
################################################################<br />
sub getBlitzer(){<br />
my $httpDev = "httpmod_blitzer";<br />
my $BlitzerDev = "blitzer";<br />
my $lat = AttrVal($BlitzerDev,"lat",undef);<br />
my $lng = AttrVal($BlitzerDev,"lng",undef);<br />
my $maxkm = AttrVal($BlitzerDev,"maxkm",undef);<br />
if (!defined $lat){<br />
Log 5,"[getBlitzer] lat ist nicht definiert!"; <br />
}<br />
if (!defined $lng){<br />
Log 5,"[getBlitzer] lng ist nicht definiert!"; <br />
}<br />
if (!defined $maxkm){<br />
Log 5,"[getBlitzer] maxkm ist nicht definiert!"; <br />
}<br />
# Da unbekannt ist, wie viele es gibt...durchprobieren<br />
my @Liste;<br />
for(my $i=1;$i<100;$i++){<br />
my $num = sprintf("%02d", $i);<br />
Log 5,"[getBlitzer] Reading: $num"; <br />
my $Poi_lat = ReadingsVal($httpDev,"pois_".$num."_lat",undef);<br />
my $Poi_lng = ReadingsVal($httpDev,"pois_".$num."_lng",undef);<br />
last if !defined $Poi_lat;<br />
#Log 1,"[getBlitzer] Reading: $Poi_lat"; <br />
last if !defined $Poi_lng;<br />
Log 5,"[getBlitzer] lat/lng: $Poi_lat $Poi_lng"; <br />
my $Poi_street = ReadingsVal($httpDev,"pois_".$num."_street","keine");<br />
my $Poi_vmax = ReadingsVal($httpDev,"pois_".$num."_vmax","kA");<br />
if (!defined $Poi_vmax){<br />
$Poi_vmax = ".";<br />
}<br />
if ($Poi_vmax eq ""){<br />
$Poi_vmax = ".";<br />
}<br />
Log 5,"[getBlitzer] $Poi_street $Poi_vmax"; <br />
<br />
#Entfernung zur Home-Koordinate (Luftlinie)<br />
#Berechnung nach: https://www.kompf.de/gps/distcalc.html<br />
#Einfache Variante<br />
my $dx = 71.5 * abs($lng - $Poi_lng);<br />
my $dy = 111.3 * abs($lat - $Poi_lat);<br />
my $distance = sqrt($dx * $dx + $dy * $dy);<br />
<br />
#MaxEntfernung einbeziehen<br />
if (not $distance > $maxkm){<br />
Log 5,"[getBlitzer] distance: $distance"; <br />
push @Liste, [ $distance, $Poi_street, $Poi_vmax, $Poi_lat, $Poi_lng ]; <br />
} else {<br />
Log 5,"[getBlitzer] $distance > $maxkm"; <br />
}<br />
<br />
<br />
}<br />
my $out = join(", ", @Liste)."\n";<br />
Log 5,"[getBlitzer] $out"; <br />
my @ListeSort = sort {$a->[0] <=> $b->[0]} @Liste;<br />
$out = join(", ", @ListeSort)."\n";<br />
Log 5,"[getBlitzer] $out"; <br />
<br />
#Eintragen ins Dummy-Device<br />
#Eintragungen erst löschen<br />
fhem("deletereading $BlitzerDev .*", 1);<br />
<br />
my $Text="";<br />
my $Anzahl = scalar(@ListeSort);<br />
for (my $i=0;$i<$Anzahl;$i++) {<br />
my $num = sprintf("%02d", $i);<br />
Log 5,"[getBlitzer] Num: $num"; <br />
fhem("setreading $BlitzerDev ".$num."Entfernung ".$ListeSort[$i][0]);<br />
fhem("setreading $BlitzerDev ".$num."Strasse ".$ListeSort[$i][1]);<br />
fhem("setreading $BlitzerDev ".$num."VMax ".$ListeSort[$i][2]);<br />
<br />
#Ort<br />
fhem("sleep 1; \{getBlitzerOrte(".$ListeSort[$i][3].",".$ListeSort[$i][4].",'$num','$BlitzerDev')};");<br />
<br />
}<br />
fhem("sleep 3; \{getBlitzerText('$BlitzerDev')};");<br />
#fhem("setreading $BlitzerDev Text $Text");<br />
<br />
}<br />
sub getBlitzerOrte($$$$){<br />
#https://nominatim.openstreetmap.org/search/52.xxxxx%208.xxxx?format=json&addressdetails=1<br />
my $Poi_lat = shift;<br />
my $Poi_lng = shift;<br />
my $num = shift;<br />
$num = sprintf("%02d", $num);<br />
my $BlitzerDev = shift;<br />
<br />
<br />
my $hash = {};<br />
$hash->{'blitzerdev'} = $BlitzerDev;<br />
$hash->{'num'} = $num;<br />
my $param = {<br />
url => "https://nominatim.openstreetmap.org/reverse?format=json&lat=".$Poi_lat."&lon=".$Poi_lng,<br />
timeout => 5,<br />
method => "GET", # Lesen von Inhalten<br />
hash => $hash, # Muss gesetzt werden, damit die Callback funktion wieder $hash hat<br />
header => "",<br />
callback => \&getBlitzerOrteCallback # Diese Funktion soll das Ergebnis dieser HTTP Anfrage bearbeiten<br />
};<br />
#agent: FHEM/1.0\r\nUser-Agent: FHEM/1.0\r\nAccept: application/json<br />
<br />
HttpUtils_NonblockingGet($param); # Starten der HTTP Abfrage. Es gibt keinen Return-Code.<br />
<br />
}<br />
sub getBlitzerOrteCallback($) {<br />
my ($param, $err, $data) = @_;<br />
my $hash = $param->{hash};<br />
my $BlitzerDev = $hash->{blitzerdev};<br />
my $num = $hash->{num};<br />
<br />
if($err ne "") # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist<br />
{<br />
Log3 "[getBlitzerOrte]", 3, "error while requesting ".$param->{url}." - $err"; # Eintrag fürs Log<br />
}<br />
#Log 1,"[getBlitzerOrte] $BlitzerDev ".$param->{data}." ".$param->{url}." ".$param->{httpheader}." ".$param->{code};<br />
#Log 1,"$data";<br />
<br />
my $Stadtteil = "";<br />
my $Stadt = "";<br />
<br />
my ($Stadtteil) = $data =~ m/suburb":"([^"]+)"/;<br />
if ((!defined $Stadtteil) or ($Stadtteil eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search city_district";<br />
($Stadtteil) = $data =~ m/city_district":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadtteil";<br />
}<br />
if ((!defined $Stadtteil) or ($Stadtteil eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] $Stadtteil";<br />
Log 5, "[getBlitzerOrteCallback] ".$param->{url};<br />
Log 5, "[getBlitzerOrteCallback] $data";<br />
$Stadtteil = ".";<br />
}<br />
<br />
my ($Stadt) = $data =~ m/city":"([^"]+)"/;<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search village $data";<br />
($Stadt) = $data =~ m/town":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
}<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] search village $data";<br />
($Stadt) = $data =~ m/village":"([^"]+)"/;<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
}<br />
if ((!defined $Stadt) or ($Stadt eq "")){<br />
#Log 1, "[getBlitzerOrteCallback] $Stadt";<br />
Log 5, "[getBlitzerOrteCallback] ".$param->{url};<br />
Log 5, "[getBlitzerOrteCallback] $data";<br />
$Stadt = ".";<br />
}<br />
my ($building) = $data =~ m/building":"([^"]+)"/;<br />
if ((!defined $building) or ($building eq "")){<br />
$building = ".";<br />
}<br />
Log 5,"[getBlitzerOrteCallback] $Stadt $Stadtteil $building";<br />
#Log 1,"[getBlitzerOrte] ".$decoded_json->{address}->{suburb}->[0];<br />
if ($Stadt eq "."){$Stadt = " "};<br />
if ($Stadtteil eq "."){$Stadtteil = " "};<br />
fhem("setreading $BlitzerDev ".$num."Ort $Stadt $Stadtteil");<br />
fhem("setreading $BlitzerDev ".$num."Building $building");<br />
}<br />
sub getBlitzerText($){<br />
my $BlitzerDev = shift;<br />
my $Text="<html> <p align='left'>";<br />
my $SollAnzeige=0;<br />
for(my $i=0;$i<100;$i++){<br />
my $num = sprintf("%02d", $i);<br />
my $Entf = ReadingsVal($BlitzerDev,$num."Entfernung",undef);<br />
last if !defined $Entf;<br />
my $Ort = ReadingsVal($BlitzerDev,$num."Ort",".");<br />
if ($Ort eq "."){$Ort = " "};<br />
my $building = ReadingsVal($BlitzerDev,$num."Building",0);<br />
if ($building eq "."){$building = " "};<br />
my $Strasse = ReadingsVal($BlitzerDev,$num."Strasse"," ");<br />
my $VMax = ReadingsVal($BlitzerDev,$num."VMax"," ");<br />
if (not $Text eq "<html> <p align='left'>"){<br />
$Text = $Text."\n <br>"; <br />
}<br />
$Text = $Text."$num $Ort $Strasse $building Max $VMax km/h (".sprintf("%.1f", "$Entf")."km) !!";<br />
$SollAnzeige=1;<br />
}<br />
$Text = $Text."</p></html>";<br />
fhem("setreading $BlitzerDev Text $Text");<br />
fhem("setreading $BlitzerDev Anzeige $SollAnzeige");<br />
}<br />
</source><br />
<br />
Von besonderem Interesse ist hier die Zeile <br />
<br />
<source lang="perl"><br />
$Text = $Text."$num $Ort $Strasse $building Max $VMax km/h (".sprintf("%.1f", "$Entf")."km) !!";<br />
</source><br />
<br />
Diese Zeile kann man den eigenen Bedürfnissen anpassen, beispielhaft so:<br />
<source lang="perl"><br />
$Text = $Text."$Ort $Strasse $building $VMax km/h";<br />
</source><br />
Dieser Version ist günstiger für [[FHEM Tablet UI|FTUI]], da die Zeilenausgaben kürzer ist.<br />
<br />
==Code für FTUI==<br />
<source lang="html"><br />
<div data-type="label"<br />
data-device="blitzer"<br />
data-get="Text"><br />
</source><br />
<br />
==Hinweis==<br />
Es gibt mehrere Anpassungsvorschäge. Diese sind im Forum zu finden: {{Link2Forum|Topic=90014|LinkText=Blitzer anzeigen}}. Fragen zum Code bitte dort stellen.<br />
<br />
Screenshot fehlt<br />
<br />
[[Kategorie:Code_Snippets]]<br />
[[Kategorie:FHEM Tablet UI|Blitzer]]</div>Curthttp://wiki.fhem.de/w/index.php?title=Webserver_auf_Raspberry&diff=30032Webserver auf Raspberry2019-04-01T18:51:34Z<p>Curt: Artikel fertig, Baustellenschild entfernt</p>
<hr />
<div>Auf Raspberry-Systemen benötigt man oft einen Webserver. Zwar gibt es bereits Lösungen wie Apache2 oder Nginx, allerdings sind diese rechenzeit- und speicherintensiv. Oft wird auf kleinen Systemen wie dem RaspberryPi Zero eine Lösung gesucht, die ohne viel Ressourcen beispielsweise nur den Inhalt einer Datei via http ausliefert. Da bietet sich Gating von Fefe an; diese Lösung soll hier vorgestellt werden.<br />
<br />
==Installation==<br />
<source lang="html"><br />
apt install gatling<br />
</source><br />
<br />
Es muss sodann /lib/systemd/system/gatling.service erstellt werden:<br />
<source lang="html"><br />
#!/bin/sh<br />
<br />
[Unit]<br />
Description=Control gatling webserver<br />
After=network.target<br />
<br />
[Service]<br />
Type=simple<br />
ExecStart=/usr/bin/gatling -u www-data -V -F -S -D -c /var/www/<br />
ExecReload=/bin/kill $MAINPID && /usr/bin/gatling -u www-data -V -F -S -D -c /var/www/<br />
<br />
[Install]<br />
WantedBy=multi-user.target<br />
</source><br />
<br />
Danach muss diese Datei noch verlinkt werden:<br />
<source lang="html"><br />
cd /etc/systemd/system/multi-user.target.wants/<br />
ln -s /lib/systemd/system/gatling.service gatling.service<br />
</source><br />
<br />
Und nun starten:<br />
<source lang="html"><br />
service gatling start<br />
</source><br />
<br />
(Der Autor hat Zugriffsrechte nicht geprüft. Idealerweise sollten nun Dateien aus /var/www/ ausgeliefert werden.)<br />
<br />
==Alternativen==<br />
Im Forum wurden im Thread https://forum.fhem.de/index.php/topic,98295.15.html eine Vielzahl an Alternativen für kleine, leichtgewichtige Webserver genannt. Insbesondere sei auf die Listen unter https://gist.github.com/willurd/5720255 sowie https://www.pcsuggest.com/best-lightweight-web-server-linux/ verwiesen.</div>Curthttp://wiki.fhem.de/w/index.php?title=%C3%9Cberwachung_linuxbasierter_Server&diff=30031Überwachung linuxbasierter Server2019-04-01T18:49:59Z<p>Curt: Schrittchen für Schrittchen</p>
<hr />
<div>{{Baustelle}} <br />
<br />
Beachte: Artikel derzeit fragmentarisch, daher NICHT nutzbar.<br />
<br />
[[Datei:2019-03-13-serverueberwachung-1.jpg|right|500px]]<br />
<br />
In diesem Artikel wird im Sinne eines '''proof of concept''' die Möglichkeit der Überwachung vieler linuxbasierter Server auf ausstehende Updates, Plattenplatz usw. beschrieben. <br />
<!-- Falls das Inhaltsverzeichnis komplett darunter starten soll diese und die übernächste Zeile löschen...<br />
<br clear=all><br />
--><br />
==Vorbemerkung==<br />
Es gibt bereits mehrere, recht ausgefeilte Lösungen zur Überwachung von Servern: Angefangen von Nagios <br />
bis hin zum Modul [[SYSMON]]. Dem soll keine weitere Lösung hinzugefügt werden, es geht in diesem Projekt '''nicht''' um die minutengenaue Überwachung von Serverparametern. Hier geht es um einen '''täglichen''' Status aller Server im Hausnetz: Liegen Updates an, ist noch Plattenplatz frei? - Dabei ist der Fokus gelegt auf minimale Belastung der zu überwachenden Server (die im Folgenden "Clients" genannt werden) und des Netzes.<br />
<br />
==Begriffsbestimmung==<br />
In diesem Artikel ist "Server" das Gerät, auf dem FHEM läuft. Client/Clients sind Maschinen, die linuxbasiert (Debian, Ubuntu, Raspian) sind, beispielsweise kleine, leistungsschwache Raspberry Pi Zero. Obwohl auf diesen Clients ein Webserver erforderlich ist, installiert sein muss, werden sie der sprachlichen Klarheit wegen als "Client" benannt.<br />
<br />
==Installation auf den Clients==<br />
Jeder Client muss künftig zwei Bedingungen erfüllen: Erstens muss er täglich eine JSON-Datei seines Zustands bereitstellen. Zweitens muss ein Webserver diese Datei dem Server ausliefern können.<br />
<br />
===Installation Webserver auf Clients===<br />
Sofern noch kein Webserver installiert ist, sollte bei kleinen, schwachen Geräten ein möglichst leichtgewichtiger, ressourcensparender Webserver installiert werden. Ein Beispiel wird im Artikel [[Webserver auf Raspberry]] beschrieben, dort sind weitere Alternativen benannt. - Der Webserver sollte von /var/www ausliefern, dort ist händisch sodann ein Unterverzeichnis "html" anzulegen.<br />
<br />
===Installation JSON-Script auf Clients===<br />
Danach muss jeder Client in die Lage versetzt werden, eine JSON-Datei mit den tagesbezogenen Zustandsdaten des Client bereitzustellen. Dafür werden keinerlei Java oder Javascript (und im Sinne der Schlankheit auch nicht diesbezügliche riesige Pakete) benötigt.<br />
<br />
...<br />
<br />
==Installationen auf dem Server==<br />
...<br />
===FHEM Scripte und Devices=== <br />
<br />
Sofern eine IP 24 Stunden nicht erreichbar war, wird die entsprechende Device automatisch gelöscht:<br />
<source lang="html"><br />
##########<br />
# alte IP-Devices rausschmeissen<br />
# https://forum.fhem.de/index.php/topic,94475.0.html<br />
# <br />
<br />
sub check_dead() {<br />
my $maxAge = 86400;<br />
my @checkDev = devspec2array("192.168.*");<br />
my $alive = 0;<br />
<br />
foreach my $d (@checkDev){<br />
$alive = 0;<br />
foreach my $r (keys %{$defs{$d}{READINGS}}){<br />
my $age = ReadingsAge($d,$r,0);<br />
$alive = 1 if ($age < $maxAge);<br />
Debug "device: $d reading: $r age: $age";<br />
}<br />
# Debug "delete $d" unless $alive;<br />
CommandDelete(undef,$d) unless $alive;<br />
}<br />
}<br />
</source><br />
<br />
<br />
===[[FTUI]] Kachel=== <br />
<br />
<br />
===Fakultative Installation auf dem Server=== <br />
...<br />
<br />
==Danksagung==<br />
Bei der Umsetzung der Idee halfen -manchmal ohne es zu wissen- mehrere Teilnehmer des FHEM-Forums, denen der Primärautor des Beitrags für ihre uneigennützige, freundliche Hilfe zu Dank verpflichtet ist.</div>Curthttp://wiki.fhem.de/w/index.php?title=FTUI_Widget_Chart&diff=29992FTUI Widget Chart2019-03-27T21:28:55Z<p>Curt: /* Form der Linien */ +points</p>
<hr />
<div>Das [[{{PAGENAME}}|Chart Widget]] ist ein Widget für [[FHEM Tablet UI]], mit dem sich verschiedenste Diagramme darstellen lassen. Die Aneinanderreihung mehrerer Werte eines Device-Readings zu einem zeitlichen Verlauf wird dabei als Graph bezeichnet.<br />
<br />
Es können beliebige Werte dargestellt und entsprechend der Sinnhaftigkeit, oder persönlichem Geschmack, formatiert werden. Farbe und Form der Linien sind je Graph einstellbar, auch wenn mehrere gleichzeitig in einem Diagramm angezeigt werden.<br />
<br />
Jedes Diagramm kann zwei Y-Achsen besitzen. Die primäre Y-Achse (primary) wird auf der linken Seite angezeigt, die sekundäre Y-Achse (secondary) auf der rechten Seite. Beide Achsen können unterschiedlich formatiert werden.<br />
<br />
<gallery><br />
File:Chart_tabletUI.png<br />
Datei:FTUI Widget Chart Stacked.png<br />
Datei:FTUI Widget Chart-fc-Proplanta.png<br />
Datei:Wetterchart2.png<br />
Datei:PieChart.png<br />
</gallery><br />
<br />
==Attribute==<br />
{|class="wikitable"<br />
! style="width:150px"|Attribut<br />
!Beschreibung<br />
!Standard-Wert<br />
!Beispiel<br />
|-<br />
|'''data-device'''||Name des FHEM-Device, das die Aktualisierung des Charts triggert||||data-device="WohnzimmerHeizung"<br />
|-<br />
|'''data-get'''||Reading, das das Update des Diagramms triggert||'STATE'||<br />
|-<br />
|'''data-logdevice'''||Name des Log-Device, das dargestellt werden soll, oder ein Array, um mehrere Werte in einem Diagramm darzustellen||||data-logdevice="FileLog_WohnzimmerHeizung"<br />
|-<br />
|'''data-logfile'''|| Name des Log-Files, aus dem die Daten entnommen werden sollen (oder Array)||'-' = aktuelle Datei||data-logfile="WohnzimmerHeizung-2015.log"<br>Beachte: Der Wert "CURRENT" ermöglicht die Navigation auch zu älterne Logfiles (Jahreswechsel)<br />
|-<br />
|'''data-columnspec'''||Ermittelt den Wert aus dem Log-File, der angezeigt werden soll (oder Array)||||data-columnspec="4:meas.*"<br />
|-<br />
|'''data-style'''||Stil, wie die Graph-Linien dargestellt werden sollen (z.B. 'SVGplot l0' oder 'ftui l0dash'), oder ein Array, wenn mehrere Linien unterschiedlich dargestellt werden sollen (siehe [[#Aussehen_der_Linien|Hinweise]])||||<br />
|-<br />
|'''data-ptype'''||Form, wie die Graphen dargestellt werden sollen (z.B. 'lines', 'cubic' oder 'fa-cog'), oder ein Array (siehe [[#Form_der_Linien|Hinweise]])||'lines'||<br />
|-<br />
|'''data-uaxis'''||Name der Achse, die verwendet werden soll ('primary' = links, oder 'secondary' = rechts), oder ein Array||'primary'||<br />
|-<br />
|'''data-legend'''||Bezeichnung des Graphen (wird in Legende und am Cursor angezeigt), oder ein Array||||<br />
|-<br />
|'''data-minvalue'''||Minimaler Wert, der auf der linken Y-Achse ('primary') angezeigt werden soll. 'auto' = automatische Berechnung||'10'||<br />
|-<br />
|'''data-maxvalue'''||Maximaler Wert, der auf der linken Y-Achse ('primary') angezeigt werden soll. 'auto' = automatische Berechnung||'30'||<br />
|-<br />
|'''data-minvalue_sec'''||Minimaler Wert, der auf der rechten Y-Achse ('secondary') angezeigt werden soll. 'auto' = automatische Berechnung||'auto'||<br />
|-<br />
|'''data-maxvalue_sec'''||Maximaler Wert, der auf der rechten Y-Achse ('secondary') angezeigt werden soll. 'auto' = automatische Berechnung||'auto'||<br />
|-<br />
|'''data-xticks'''||Abstand zwischen den vertikalen Hilfslinien (bezogen auf die X-Achse) in Minuten. 'auto' = automatische Berechnung||'auto'||<br />
|-<br />
|'''data-yticks'''||Abstand zwischen den horizontalen Hilfslinien (bezogen auf die linke Y-Achse). Kann auch ein Array mit Werte-Paaren enthalten, um die Linien mit Text zu beschriften.||'auto'||data-yticks='[[0,"open"],[1,"closed"]]'<br />
|-<br />
|'''data-yticks_format'''||Dient zur Formatierung der Ticks der Y-Achse. Die Formatierung geschieht über Platzhalter, Trenner und einen beliebigen durch ' ' getrennten Text. Als Platzhalter dient ein oder mehrere '#', als Trenner können '.', ',' und ':' verwendet werden. Ist ein Trenner enthalten (z.B. '#.##') dann bedeutet das in dem Beispiel, dass der Ytick mit 2 Nachkommastellen versehen wird und vorne Platz für eine Stelle vor dem Komma vorgehalten wird (führende Nullen werden nicht dargestellt, aber de Platz wird reserviert so dass das ganze rechtsbündig immer passt). Ist kein Trenner vorhanden, dann wird der Ytick auf die Summe der Platzhalter mit einer festen Gesamtbreite gesetzt (#### würde also bedeuten, dass immer 4 Stellen (ohne Trenner) verwendet werden. aus 0.4 würde 0.400 aus 10.437 würde 10.44). Als Trenner kann man z.B. für Zeiten auch einen ':' verwenden und dadurch auch so etwas wie "12:00 Uhr" realisieren (in dem Beispiel wäre data-yticks_format="##:## Uhr" und kein data-yunit oder data-yticks="##:##" und data-yunit="Uhr").||||data-yticks_format="#.##"<br />
|-<br />
|'''data-yticks_sec'''||Abstand zwischen den horizontalen Hilfslinien (bezogen auf die rechte Y-Achse). Kann auch ein Array mit Werte-Paaren enthalten, um die Linien mit Text zu beschriften.||'auto'||data-yticks='[[0,"open"],[1,"closed"]]'<br />
|-<br />
|'''data-yticks_format_sec'''||Dient zur Formatierung der Ticks der Y-Achse. Die Formatierung geschieht über Platzhalter, Trenner und einen beliebigen durch ' ' getrennten Text. Als Platzhalter dient ein oder mehrere '#', als Trenner können '.', ',' und ':' verwendet werden. Ist ein Trenner enthalten (z.B. '#.##') dann bedeutet das in dem Beispiel, dass der Ytick mit 2 Nachkommastellen versehen wird und vorne Platz für eine Stelle vor dem Komma vorgehalten wird (führende Nullen werden nicht dargestellt, aber de Platz wird reserviert so dass das ganze rechtsbündig immer passt). Ist kein Trenner vorhanden, dann wird der Ytick auf die Summe der Platzhalter mit einer festen Gesamtbreite gesetzt (#### würde also bedeuten, dass immer 4 Stellen (ohne Trenner) verwendet werden. aus 0.4 würde 0.400 aus 10.437 würde 10.44). Als Trenner kann man z.B. für Zeiten auch einen ':' verwenden und dadurch auch so etwas wie "12:00 Uhr" realisieren (in dem Beispiel wäre data-yticks_format="##:## Uhr" und kein data-yunit oder data-yticks="##:##" und data-yunit="Uhr").||||data-yticks_format_sec="#.##"<br />
|-<br />
|'''data-yticks_prio'''||Legt fest, ob die horizontalen Hilfslinien der linken (primary) oder der rechten (secondary) Y-Achse zugeordnet werden sollen||||data-yticks_prio='secondary'<br />
|-<br />
|'''data-ytype'''||Legt fest, ob die primäre y Achse logarithmisch sein soll (wert "log")||||data-ytype="log"<br />
|-<br />
|'''data-ytype_sec'''||Legt fest, ob die sekundäre y Achse logarithmisch sein soll (wert "log")||||data-ytype_sec="log"<br />
|-<br />
|'''data-y_margin'''|||Gibt die Möglichkeit, Abstände zwischen den Graphen und dem oberen Rand des Plots zu definieren (Einheit Pixel). Falls der Wert skalar ist, werden oben und unten die gleichen Abstände eingehalten. Falls ein 2D Array angegeben wird, können die Werte unten (erster Wert im Array) und oben (zweiter Wert im Array) getrennt festgelegt werden||"0"|||data-y_margin='["10","20"]'<br />
|-<br />
|'''data-y_margin_sec'''|||Gibt die Möglichkeit, Abstände zwischen den Graphen und dem oberen Rand des Plots zu definieren (Einheit Pixel). Falls der Wert skalar ist, werden oben und unten die gleichen Abstände eingehalten. Falls ein 2D Array angegeben wird, können die Werte unten (erster Wert im Array) und oben (zweiter Wert im Array) getrennt festgelegt werden||"0"|||data-y_margin='["10","20"]'<br />
|-<br />
|'''data-daysago_start'''||Anzahl der vergangenen Tage, wo das Diagramm beginnen soll. '0' = Beginn heute 0:00 Uhr. (siehe [[#Zeitstrahl_.2F_Start_.26_Ende_auf_der_X-Achse|Hinweise]])||'0'||<br />
|-<br />
|'''data-daysago_end'''||Anzahl der vergangenen Tage, wo das Diagramm enden soll. '-1' = Ende heute 24:00 Uhr. (siehe [[#Zeitstrahl_.2F_Start_.26_Ende_auf_der_X-Achse|Hinweise]])||'-1'||<br />
|-<br />
|'''data-xticks_round'''||Wenn vorhanden und entweder 'h', 'd', 'w', wird auf Stunde, Tag oder Woche bei den xticks gerundet (also die Tickmarks und die Gridlines bei den entsprechend gerundeten Zeiten gesetzt). Es kann auch 'auto' angegeben werden, um eine autmoatische Rundung durchzuführen||||<br />
|-<br />
|'''data-nofulldays'''||Aktiviert/deaktiviert die Rundung der X-Achse auf ganze Tage. Binärwert ('true' oder 'false')||'false'||<br />
|-<br />
|'''data-timeformat'''||Zeitformat für die Anzeige an der X-Achse (siehe [[#Zeitformat_der_X-Achse|Hinweise]])||||<br />
|-<br />
|'''data-timeranges'''||Hierdurch können vordefinierte Zeiträume für die X-Achse festgelegt werden, die dann durch eine pulldown menu (neuer Button oben neben dem "-" Button) direkt ausgewählt werden können. Der Parameter ist ein Array aus Array Einträgen, welche jeweils [<Name>,<daysago_start>,<daysago_end>] enthalten)||<br />
||data-timeranges='[<br><br />
["Actual Year","0Y","-1Y"],<br><br />
["Last Year","1Y","0Y"],<br><br />
["Actual Month","0M","-1M"],<br><br />
["Last Month","1M","0M"],<br><br />
["Actual Week","0W","-1W"],<br><br />
["Last Week","1W","0W"],<br><br />
["Today","0D","-1D"],<br><br />
["Yesterday","1D","0D"]<br><br />
]'<br />
|-<br />
|'''data-ytext'''||Text, der neben der linken Y-Achse angezeigt wird||||<br />
|-<br />
|'''data-ytext_sec'''||Text, der neben der rechten Y-Achse angezeigt wird||||<br />
|-<br />
|'''data-yunit'''||Einheit, die an der linken Y-Achse angezeigt wird||||<br />
|-<br />
|'''data-yunit_sec'''||Einheit, die an der rechten Y-Achse angezeigt wird||||<br />
|-<br />
|'''data-show_both_axes'''||Legt fest ob beide Y-Achsen Linien gezeichnet werden sollen||false||<br />
|-<br />
|'''data-crosshair'''||Aktiviert/deaktiviert den Fadenkreuz-Cursor. Binärwert ('true' oder 'false')||'false'||<br />
|-<br />
|'''data-cursorgroup'''||Zahl zur Gruppierung der Werte am Fadenkreuz-Cursor ([[#Fadenkreuz-Cursor|Hinweise]])||||<br />
|-<br />
|'''data-scrollgroup'''||Zahl zur Gruppierung der Graphen beim Bewegen und Zoomen. Alle Linien mit der selben Zahl werden miteinander gekoppelt und bewegen sich gemeinsam.||||<br />
|-<br />
|'''data-showlegend'''||Aktiviert/deaktiviert die Anzeige der Legene. Binärwert ('true' oder 'false')||'false'||<br />
|-<br />
|'''data-legendpos'''||Array von zwei Werten, die die horizontale und vertikale Position der Legende festlegen ([[#Legende|Hinweise]])||'["top","right"]'||<br />
|-<br />
|'''data-legend_horiz'''||legt fest, dass die Legendeneinträge horizontal angeordnet sind (anstatt vertikal wie im default Fall)||false||data-legend_horiz="true"<br />
|-<br />
|'''data-width'''||Breite des Diagramms (in % oder px)||||<br />
|-<br />
|'''data-height'''||Höhe des Diagramms (in % oder px)||||<br />
|-<br />
|'''data-graphsshown'''||Aktiviert/deaktiviert die initiale Anzeige von Graphen. Binärwert ('true' oder 'false'). Array, wenn mehrere Linien angezeigt werden sollen.||||data-graphsshown='[true,false,true]'<br />
|-<br />
|'''data-ddd'''||Einstellung für die 3D-Drehung ([[#3-dimensionale_Drehung|Hinweise]])||||data-ddd='["40","60","0"]'<br />
|-<br />
|'''data-dddspace'''||Abstand zwischen zwei Graphen, wenn die 3D-Anzeige aktiviert wurde (px)||'15'||<br />
|-<br />
|'''data-dddwidth'''||Breite, bzw. Tiefe der Graphen, wenn diese 3-dimensional angezeigt werden (px)||'10'||<br />
|-<br />
|'''data-title'''||Titel, der über dem Diagramm angezeigt werden soll. Der Inhalt kann auch dynamisch erzeugt werden ([[#Diagrammtitel|Hinweise]])||||<br />
|-<br />
|'''data-title_class'''||Klassenname für die Formatierung des Titels. Die Eigenschaften müssen dann entsprechend in einem CSS File angegeben werden (z.B. in fhem-tablet-ui-user.css)||||<br />
|-<br />
|'''data-prefetch'''||Legt fest, ob zusätzliche Daten rechts und links des Plots im Hintergrund vom Server geholt werden sollen||false||data-prefetch="true"<br />
|}<br />
Einige Parameter (style, maxvalue, minvalue, maxvalue_sec, minvalue_sec) können auch aus Readings dynamisch gesetzt werden wenn "<device>:<reading>" als Parameter gesetzt wird. Damit kann man z.B. in FHEM über notify etc. die Linientypen dynamisch anpassen (z.B. wenn der Wert eines Devices in einem bestimmten Bereich liegt, ändert sich die Farbe des Graphen).<br />
<br />
==CSS Klassen==<br />
{|class="wikitable"<br />
!Klasse!!Beschreibung<br />
{{FTUI Klasse|fullsize}}{{FTUI Klasse|noticks}}{{FTUI Klasse|nobuttons}}{{FTUI Klasse|small}}{{FTUI Klasse|normal}}{{FTUI Klasse|big}}<br />
|}<br />
<br />
<br />
Folgende Widget-spezifsche Klassen können zusätzlich in einer eigenen CSS-Datei definiert werden:<br />
<br />
{|class="wikitable"<br />
!Klasse<br />
!Beschreibung<br />
|-<br />
|'''chart-background'''||Hintergrundfarbe des Diagramms<br />
|-<br />
|'''buttons'''||Größe und Farbe der Buttons<br />
|-<br />
|'''text.axes'''||Generelle Schriftart und Farbe der Achsen<br />
|-<br />
|'''gridlines'''||Generelle Farbe und Größe der Gitternetzlinien<br />
|-<br />
|'''xaxis'''||Schriftart, Größe und Farbe der X-Achse<br />
|-<br />
|'''yaxis'''||Schriftart, Größe und Farbe der Y-Achse<br />
|-<br />
|'''xticks'''||Schriftart, Größe und Farbe der X-Achse (Zwischenlinien)<br />
|-<br />
|'''yticks'''||Schriftart, Größe und Farbe der Y-Achse (Zwischenlinien)<br />
|-<br />
|'''crosshair'''||Schriftart, Größe und Vordergrund/Hintergrundfarbe der Momentanwerte am Fadenkreuzcursor<br />
|-<br />
|'''caption'''||Schriftart, Größe und Farbe der Text-Buttons für Legende und Cursor<br />
|-<br />
|'''legend'''||Schriftart, Größe und Farbe der Legende<br />
|}<br />
<br />
Die Standardwerte sind in der Datei <code>css/ftui_chart.css</code> zu finden.<br />
<br />
==Datenquellen==<br />
Beim Chart-Widget können die gleichen Datenquellen genutzt werden, die auch für SVG-Plots verwendet werden können:<br />
# [[FileLog]]: Verlaufsdaten einer Textdatei entnehmen<br />
# [[DbLog]]: Verlaufsdaten einer Datenbank entnehmen<br />
# [[LogProxy]]: Daten dynamisch berechnet<br />
<br />
===FileLog===<br />
Um [[FileLog]] zu nutzen, wird als '''data-logdevice''' das FHEM-Device für das FileLog angegeben. In der Regel entstehen hier im Laufe der Zeit mehrere Log-Dateien. Name und Anzahl sind von der Definition abhängig - meist wird jeden Monat oder jedes Jahr eine neue Datei angelegt. Die gewünschte Datei kann mit '''data-logfile''' ausgewählt werden. Möchte man stets die aktuelle Datei verwenden (macht vor allem dann Sinn, wenn man die neusten Daten anzeigen will), kann das Attribut weggelassen, oder explizit <code>-</code> eingetragen werden. Zuletzt wird '''data-columnspec''' benötigt, um die gewünschten Daten zu in der Logdatei zu identifizieren. Hier wird die Spalte, in der die Daten stehen, gefolgt von Doppelpunkt und Readingname angegeben.<br />
<br />
Für ein Heizungsthermostat von Homematic mit dem Namen ''DG.wz.HZ.Heizungsventil'' ergibt sich somit beispielhaft folgende Definition, um gemessene Temperatur, Sollwert und Ventilstellung im Diagramm darzustellen:<br />
<br />
<syntaxhighlight lang="html"><br />
<div data-type="chart"<br />
data-device="DG.wz.HZ.Heizungsventil"<br />
data-logdevice="FileLog_DG.wz.HZ.Heizungsventil"<br />
data-logfile="-"<br />
data-columnspec='["4:measured-temp","4:desired-temp","4:actuator"]'<br />
...><br />
</div><br />
</syntaxhighlight><br />
<br />
Sollen Daten von unterschiedlichen Geräten in einem Diagramm angezeigt werden, muss '''data-logdevice''' als Array nach dem Schema <code>data-logdevice='["<Logdatei_1>","<Logdatei_2>","<Logdatei_3>"]'</code> definiert werden. Für jeden Eintrag in '''data-columnspec''' muss es auch den passenden Eintrag in '''data-logdevice''' geben (auch die Reihenfolge ist relevant).<br />
<br />
===DbLog===<br />
Um die Daten aus [[DbLog]] anzeigen zu können, werden die gleichen Attribute verwendet und mit für die Datenbank angepassten Werten beschrieben. Bei '''data-logdevice''' das FHEM-Device für die Datenbank angegeben. Im nachfolgenden Beispiel heißt diese <code>logdb</code> und besitzt wie üblich zwei Tabellen: <code>current</code> und <code>history</code> (der zeitliche Verlauf liegt in letzterer). Der Tabellenname wird bei '''data-logfile''' eingetragen. Da die Daten in der Datenbank etwas anders abgelegt werden, muss auch '''data-columnspec''' entsprechend angepasst werden. Statt der Spalte wird hier das FHEM-Device, gefolgt von Doppelpunkt und Readingname angegeben.<br />
<br />
Für das oben beschriebene Homematic-Heizungsthermostat ergibt sich dann folgende Definition, um die gleichen Daten aus einer Datenbank, statt einem LogFile zu lesen:<br />
<br />
<syntaxhighlight lang="html"><br />
<div data-type="chart"<br />
data-device="DG.wz.HZ.Heizungsventil"<br />
data-logdevice="logdb"<br />
data-logfile="HISTORY"<br />
data-columnspec='["DG.wz.HZ.Heizungsventil:measured-temp","DG.wz.HZ.Heizungsventil:desired-temp","DG.wz.HZ.Heizungsventil:actuator"]'<br />
...><br />
</div><br />
</syntaxhighlight><br />
<br />
Für die Anzeige von unterschiedlichen Geräten in einem Diagramm, muss nur '''data-columnspec''' entsprechend angepasst werden, solange sich alle Daten in der Datenbank befinden.<br />
<br />
===LogProxy===<br />
Um die Daten mittels [[LogProxy]] berechnen und anzeigen zu können, muss in FHEM ein LogProxy-Device definiert sein:<br />
<br />
<pre><br />
define myLogProxy logProxy<br />
</pre><br />
<br />
Weitere Einstellungen am LogProxy sind nicht nötig, die bloße Existenz reicht.<br />
<br />
Bei '''data-logdevice''' wird das FHEM-Device für den LogProxy angegeben. Im nachfolgenden Beispiel heißt dieses <code>myLogProxy</code>. Das Attribut '''data-logfile''' wird für LogProxy nicht benötigt. Befinden sich nur LogProxy-Werte im Diagramm kann das Attribut komplett entfallen. Sollen weitere Werte angezeigt werden, bleibt die Definition im Array einfach leer.<br />
<br />
Im Attribut '''data-columnspec''' wird eine Formel angegeben, wie die Werte berechnet werden sollen. Hier können die Formeln 1:1 von einem eventuell vorhandenen SVG-Plot übernommen werden. '''Dabei gibt es jedoch folgendes zu beachten:''' Befindet sich die Formel in einem Array, dürfen die Formeln keine Anführungszeichen (<code>"</code>) beinhalten. Stattdessen müssen sie als escapter Ascii-Code (<code>\\x22</code>) eingefügt werden.<br />
<br />
Das nachfolgende Beispiel zeigt, wie Vorhersagewerte aus einem FHEM-Device vom Typ Proplanta (Name hier <code>AU.xx.WE.Proplanta</code>) angezeigt werden können.<br />
<br />
<syntaxhighlight lang="html"><br />
<div data-type="chart"<br />
data-device="AU.xx.WE.Proplanta"<br />
data-logdevice='[<br />
"myLogProxy",<br />
"myLogProxy",<br />
"myLogProxy",<br />
"myLogProxy"<br />
]'<br />
data-columnspec='[<br />
"Func:logProxy_proplanta2Plot(\\x22AU.xx.WE.Proplanta\\x22,\\x22temp_\\x22,$from,$to,12,\\x22day\\x22)",<br />
"Func:logProxy_proplanta2Plot(\\x22AU.xx.WE.Proplanta\\x22,\\x22rain_\\x22,$from,$to,12,\\x22day\\x22)",<br />
"Func:logProxy_proplanta2Plot(\\x22AU.xx.WE.Proplanta\\x22,\\x22chOfRain_\\x22,$from,$to,12,\\x22day\\x22)",<br />
"Func:logProxy_proplanta2Plot(\\x22AU.xx.WE.Proplanta\\x22,\\x22cloud_\\x22,$from,$to,12,\\x22day\\x22)"<br />
]'<br />
...><br />
</div><br />
</syntaxhighlight><br />
<br />
'''Auch alle anderen Funktionen, die [[LogProxy]] bietet, können hier angewendet werden.'''<br />
<br />
==Hinweise==<br />
===Aktualisierung des Charts===<br />
Damit der Refresh des Charts funktioniert, muss auch ein Device angegeben werden, der das Refresh triggert. Das Diagramm wird immer dann aktualisiert, wenn sich der Inhalt von '''data-get''' ändert.<br />
<br />
<syntaxhighlight lang="html"><br />
<div data-type="chart"<br />
data-device="WohnzimmerHeizung"<br />
data-logdevice="FileLog_WohnzimmerHeizung"<br />
...><br />
</div><br />
</syntaxhighlight><br />
<br />
===Aussehen der Linien===<br />
Mit dem Attribut '''data-style''' kann das Aussehen der Linien des jeweiligen Graphen verändert werden. Hierfür können die Standard-FHEM-Styles verwendet werden. Dazu wird das Attribut mit <code>SVGplot</code>, gefolgt von einem Leerzeichen und der gewünschten Farbe/Stil befüllt. Es existieren jedoch auch noch weitere, an FTUI angepasste Styles, zu finden in der CSS-Datei <code>css/ftui_chart.css</code>. Um diese zu verwenden, wird das Attribut mit <code>ftui</code>, gefolgt von einem Leerzeichen und der gewünschten Farbe/Stil befüllt. Eigene Styles können zum Beispiel in der Datei <code>css/fhem-table-ui-user.css</code> definiert werden.<br />
<br />
Folgende Übersicht zeigt die im Standard verfügbaren '''Farben''', alle Abbildungen sind mit im FTUI-Style entstanden:<br />
<div><ul> <br />
<li style="display: inline-block;"> [[File:FTUI_Widget_Chart_Farbe-f0.png|thumb|none|150px|Farbe "l0"]] </li><br />
<li style="display: inline-block;"> [[File:FTUI_Widget_Chart_Farbe-f1.png|thumb|none|150px|Farbe "l1"]] </li><br />
<li style="display: inline-block;"> [[File:FTUI_Widget_Chart_Farbe-f2.png|thumb|none|150px|Farbe "l2"]] </li><br />
<li style="display: inline-block;"> [[File:FTUI_Widget_Chart_Farbe-f3.png|thumb|none|150px|Farbe "l3"]] </li><br />
<li style="display: inline-block;"> [[File:FTUI_Widget_Chart_Farbe-f4.png|thumb|none|150px|Farbe "l4"]] </li><br />
<li style="display: inline-block;"> [[File:FTUI_Widget_Chart_Farbe-f5.png|thumb|none|150px|Farbe "l5"]] </li><br />
<li style="display: inline-block;"> [[File:FTUI_Widget_Chart_Farbe-f6.png|thumb|none|150px|Farbe "l6"]] </li><br />
</ul></div><br />
<br />
Die Angabe zur Farbe kann dann mit der Linienart kombiniert werden. Dazu stehen folgende '''Stile''' zur Verfügung:<br />
<div><ul> <br />
<li style="display: inline-block;"> [[File:FTUI_Widget_Chart_Form-2D-normal.png|thumb|none|225px|Darstellung in 2D: Stil "normal"]] </li><br />
<li style="display: inline-block;"> [[File:FTUI_Widget_Chart_Form-2D-dot.png|thumb|none|225px|Darstellung in 2D: Stil "dot"]] </li><br />
<li style="display: inline-block;"> [[File:FTUI_Widget_Chart_Form-2D-dash.png|thumb|none|225px|Darstellung in 2D: Stil "dash"]] </li><br />
<li style="display: inline-block;"> [[File:FTUI_Widget_Chart_Form-2D-fill.png|thumb|none|225px|Darstellung in 2D: Stil "fill"]] </li><br />
<li style="display: inline-block;"> [[File:FTUI_Widget_Chart_Form-2D-sym.png|thumb|none|225px|Darstellung in 2D: Stil "sym"]] </li><br />
</ul></div><br />
<br />
<div><ul> <br />
<li style="display: inline-block;"> [[File:FTUI_Widget_Chart_Form-3D-normal.png|thumb|none|225px|Darstellung in 3D: Stil "normal"]] </li><br />
<li style="display: inline-block;"> [[File:FTUI_Widget_Chart_Form-3D-dot.png|thumb|none|225px|Darstellung in 3D: Stil "dot"]] </li><br />
<li style="display: inline-block;"> [[File:FTUI_Widget_Chart_Form-3D-dash.png|thumb|none|225px|Darstellung in 3D: Stil "dash"]] </li><br />
<li style="display: inline-block;"> [[File:FTUI_Widget_Chart_Form-3D-fill.png|thumb|none|225px|Darstellung in 3D: Stil "fill"]] </li><br />
<li style="display: inline-block;"> [[File:FTUI_Widget_Chart_Form-3D-sym.png|thumb|none|225px|Darstellung in 3D: Stil "sym"]] </li><br />
</ul></div><br />
<br />
Farbe und Stil werden kombiniert (zusammengeschrieben) beim Attribut '''data-style''' angegeben, sodass sich beispielsweise für eine graue Punktlinie folgendes ergibt: <code>data-style="ftui l1dot"</code>.<br />
Um die Darstellung als normale Linie zu erhalten, darf im Gegensatz zu den anderen Linienformen der Stil <code>normal</code> nicht angegeben werden. Für eine einfache graue Linie ist also die Angabe <code>data-style="ftui l1"</code> korrekt, wohingegen <code>data-style="ftui l1normal"</code> zu einer fehlerhaften Anzeige führt.<br />
<br />
'''Hinweis:''' Der Stil ''sym'' ist speziell dafür geeignet, Symbole statt Linien zu zeichnen. Dazu kann beim Attribut '''data-ptype''' als Linienform ein beliebiges Font-Awsome-, oder Open Automation-Icon angegeben werden. Alle in diesem Abschnitt enthaltenen Abbildungen sind mit <code>data-ptype="lines"</code> entstanden.<br />
<br />
'''Übergänge mit datenabhängigen Grenzen:''' Plotstile (data-style) können auch direkt als Gradienten auf Basis von Plot-Datenwerten definiert werden. Dazu muss der Plotstil als Array angegeben werden. Der erste Wert des Arrays gibt an, ob nur die Linie gezeichnet werden soll (Zahl angeben, die die Dicke der Linie definiert) oder gefüllt ("fill" eintragen). Alle danach folgenden Array Elemente sind beliebig viele Stopp Punkte für die Farbübergänge, welche wiederum aus Arrays mit 3 Parametern bestehen. Für jeden Stopp Punkt werden der Datenwert, die Farbe und die Durchsichtigkeit gesetzt. Hierdurch lassen sich z.B. Einfärbungen setzen, die für Temperaturplots immer negative Werte blau einfärben und positive Werte rot. Zwischen den Stop Punkten wird die Farbe interpoliert, also ein weicher Übergang generiert. Will man harte Übergänge muss man Zwei Stopp Punkte mit unterschiedlichen Farbwerten aber dem gleichen Datenwert erzeugen.<br><br />
Beispiel 1 für einen weichen Gradienten, der bei 0 von blau nach rot übergeht, bei diesem Übergang durchsichtig ist und von dort nach negativen bzw. positiven Werden immer deckender wird:<br><br />
<code>data-style='["fill",["-20","#0000ff","0.7"],["0","#0000ff","0"],["0","#ff0000","0"],["302","#ff0000","0.7"]]'</code><br><br />
Beispiel 2 mit einem harten Übergang von blau nach rot bei 0:<br><br />
<code>data-style='["fill",["-20","#0000ff","0.7"],["0","#0000ff","0.7"],["0","#ff0000","0.7"],["50","#ff0000","0.7"]]'</code><br />
Es gibt auch die Möglichkeit den Bereich zwischen zwei Graphen einzufärben. Dazu muss ein Wert in Columnspec als Array angegeben werden. Ist dies der Fall, dann wird der zweite Graph umgekehrt an den ersten angehängt.<br><br />
Beispiel:<br />
<syntaxhighlight lang="html"><br />
data-columnspec='[<br />
"Func:logProxy_proplanta2Plot(\\x22AgroWeather\\x22,\\x22weatherIcon\\x22,$from,$to,12)",<br />
[<br />
"Func:logProxy_proplanta2Plot(\\x22AgroWeather\\x22,\\x22tempMax\\x22,$from,$to,12)",<br />
"Func:logProxy_proplanta2Plot(\\x22AgroWeather\\x22,\\x22tempMin\\x22,$from,$to,12)"<br />
],<br />
"Func:logProxy_proplanta2Plot(\\x22AgroWeather\\x22,\\x22rain\\x22,$from,$to,0,\\x22day\\x22)"<br />
]'<br />
</syntaxhighlight><br />
[[Datei:FTUI Widget Chart DynamicStyles.png|thumb|none|225px|dynamischer Übergang]]<br />
<br />
===Form der Linien===<br />
Das Attribut '''data-ptype''' beeinflusst die Form der Linien. Hier sind folgende Werte möglich:<br />
<br />
* <code>lines</code><br />
* <code>points</code><br />
* <code>steps</code><br />
* <code>fsteps</code><br />
* <code>histeps</code><br />
* <code>bars</code><br />
* <code>ibars</code><br />
* <code>cubic</code><br />
* <code>quadratic</code><br />
* <code>quadraticSmooth</code><br />
<br />
Zusätzlich ist es möglich, Symbole anzeigen zu lassen. Unterstützt werden Font-Awesome ('fa-...'), Open Automation ('oa-...') und FHEM-Symbole ('fs-...')). Damit die Symbole korrekt angezeigt werden, muss im Attribut '''data-style''' der Stil <code>sym</code> gewählt werden, da sonst nur Punkte, statt der Symbole gezeichnet werden.<br />
<br />
<syntaxhighlight lang="html"><br />
<div data-type="chart"<br />
data-device="DG.wz.HZ.Heizungsventil"<br />
data-logdevice="FileLog_DG.wz.HZ.Heizungsventil"<br />
...<br />
data-style="ftui l1sym"<br />
data-ptype="fa-cog"<br />
...><br />
</div><br />
</syntaxhighlight><br />
<br />
Die Größe der Symbole ist in der Datei <code>css/ftui_chart.css</code> auf 12px festgelegt. Dieser Wert kann in einer eigenen CSS-Datei durch Anpassung von <code>stroke-width</code> überschrieben werden.<br />
<br />
<syntaxhighlight lang="css"><br />
.ftui.l0sym { stroke:#DDA400; stroke-width:12px; fill:none; }<br />
.ftui.l1sym { stroke:#BBBBBB; stroke-width:12px; fill:none; }<br />
.ftui.l2sym { stroke:#CC0000; stroke-width:12px; fill:none; }<br />
.ftui.l3sym { stroke:#CCCC00; stroke-width:12px; fill:none; }<br />
.ftui.l4sym { stroke:#33CC33; stroke-width:12px; fill:none; }<br />
.ftui.l5sym { stroke:#33CCCC; stroke-width:12px; fill:none; }<br />
.ftui.l6sym { stroke:#3333CC; stroke-width:12px; fill:none; }<br />
</syntaxhighlight><br />
<br />
'''data-ptype''' kann auch Inhalt im Format <code>'icon:1'</code> verarbeiten. Dann muss der zugehörige Wert in '''data-columnspec''' den Pfad zu einem Icon (z.B. für Wettervorhersagen) beinhalten. Der Y-Wert wird dann vom ersten Graphen übernommen. Weitere Ausführungen hierzu im Beispiel [[#Darstellung der Wetter Icons im Diagramm]].<br />
<br />
===Stapeln von Linien===<br />
Über '''data-ptype''' kann zusätzlich festgelegt werden, ob Graphen übereinander gestapelt werden sollen. <code>data-ptype='lines:1'</code> bedeutet, dass der zugehörige Graph auf den Graph mit der Nummer 1 gestapelt werden soll. So etwas kann z.B. Sinn machen, wenn man den Stromverbrauch einzelner Devices darstellen und zusätzlich sehen will, wie hoch die Summe ist. Beispiel siehe unten.<br />
<br />
[[Datei:FTUI Widget Chart Stacked.png]]<br />
<br />
===Zeitstrahl / Start & Ende auf der X-Achse===<br />
Die Attribute '''data-daysago_start''' und '''data-daysago_end''' dienen der Definition von Anfang und Ende der X-Achse. Im einfachsten Fall wird eine Anzahl an Tagen eingegeben, die sich auf das aktuelle Datum beziehen. Dabei gilt es zu beachten, dass es sich um ''vergangene Tage'' handelt. Das bedeutet, dass Tage in der Vergangenheit als positive Zahl angegeben werden, Tage in der Zukunft hingegen als negative Zahl. Es kann jeweils auch ein fixes Datum (z.B. '2013-10-23') angegeben werden. Uhrzeitangaben werden nur berücksichtigt, wenn '''data-nofulldays='true' ''' verwendet wird.<br />
<br />
'''Relative Zeitangabe in Stunden/Tagen/Wochen/Monaten/Jahren'''<br /><br />
Zur Ausgabe einer Anzahl an zurückliegenden Stunden bis zum aktuellen Zeitpunkt wird als Startzeitpunkt die Anzahl der Stunden/Tage/Wochen/Monate/Jahre angegeben, die angezeigt werden sollen, gefolgt vom Kleinbuchstaben '''h''' für Stunden, '''d''' für Tage, '''w''' für Wochen, '''m''' für Monate, '''y''' für Jahre, . Als Endzeitpunkt wird '''now''' gewählt.<br /><br />
Das nachfolgende Beispiel zeigt die Werte der vergangenen 3 Stunden an:<br />
<syntaxhighlight lang="html"><br />
data-nofulldays="true"<br />
data-daysago_start="3h"<br />
data-daysago_end="now"<br />
</syntaxhighlight><br />
<br />
'''Fester Zeitbereich des heutigen Tages (Stunden/Tage/Wochen/Monate/Jahre)'''<br /><br />
Um ein festes Stunden/Tages/Wochen/Monats/Jahresfenster anzuzeigen, werden die absoluten Stunden/Tages/Wochen/Monats/Jahreszahlen mit negativem Vorzeichen, gefolgt vom Großbuchstaben '''H''' (entsprechend D/W/M/Y für Tage/Wochen/Monate/Jahre) angegeben. Wird '''data-daysago_start''' als positiver Wert angegeben, wird die Anzahl der Stunden/Tage/Wochen/Monate/Jahre von heute 0:00 Uhr subtrahiert (siehe Rechenweg weiter unten).<br /><br />
Das Beispiel zeigt den Zeitbereich von heute 5:00 Uhr bis heute 22:00 Uhr:<br />
<syntaxhighlight lang="html"><br />
data-nofulldays="true"<br />
data-daysago_start="-5H"<br />
data-daysago_end="-22H"<br />
</syntaxhighlight><br />
<br />
'''Fester Zeitbereich Tage-übergreifend'''<br /><br />
Die Zeit in Tagen kann als Gleitkommazahl angegeben werden. Damit ist es möglich, Tage und Uhrzeiten zu kombinieren. Die Werte sind dann als Teil eines ganzen Tages, bezogen auf heute 0:00 Uhr zu errechnen und mit <code>.</code> als Teiler anzugeben.<br /><br />
Das nachfolgende Beispiel zeigt einen Zeitbereich von '''gestern 15:00 Uhr''' bis '''morgen 3:00 Uhr'''.<br />
<syntaxhighlight lang="html"><br />
data-nofulldays="true"<br />
data-daysago_start="0.375"<br />
data-daysago_end="-1.125"<br />
</syntaxhighlight><br />
<br />
Für die nachfolgenden Rechenwege sind die Einheiten nur zur Verdeutlichung angegeben. Die Einheiten werden im Attribut nicht angegeben.<br />
<br />
Der Wert für '''GESTERN''' wird wie folgt ermittelt:<br /><br />
Ausgangspunkt ist heute 0:00 Uhr, gestern 15:00 Uhr liegt also 9 Stunden davor. Diese 9 Stunden sind ein <code>9/24 Tag</code> und errechnet sich so:<br />
<pre><br />
1d / 24h = 0.0416666...d/h<br />
0.0416d/h * 9h = 0.375d<br />
</pre><br />
<br />
Der Wert für '''MORGEN''' wird wie folgt ermittelt:<br /><br />
Ausgangspunkt ist wieder heute 0:00 Uhr, morgen 3:00 Uhr liegt dann 27 Stunden dahinter. Der Einfachheit halber werden hier nur die 3 Stunden errechnet und dann ein ganzer Tag addiert:<br />
<pre><br />
1d / 24h = 0.0416666...d/h<br />
0.0416d/h * 3h = 0.125d<br />
<br />
0.125d + 1d = 1.125d<br />
</pre><br />
Da das Attribut Tage in der Vergangenheit erwartet, muss für einen Wert in der Zukunft wieder eine negative Zahl angegeben werden.<br />
<br />
===Zeitformat der X-Achse===<br />
Die Zeitanzeige auf der X-Achse kann sehr flexibel eingestellt werden. Dafür stehen verschiedene Platzhalter zur Verfügung, die durch spezielle Zeichen (<code>-</code>, <code>.</code>, <code>/</code>, <code> </code> (Leerzeichen), <code>:</code>, <code>,</code>, <code>\</code>) getrennt werden. Alle Zeichen werden trotz Escape-Zeichen (<code>\</code>) in der Ausgabe angezeigt.<br />
<br />
Folgende Platzhalter werden unterstützt:<br />
*<code>'mm'</code>: Minuten als zweistellige Zahl<br />
*<code>'hh'</code>: Stunden als zweistellige Zahl<br />
*<code>'dd'</code>: Tag als zweistellige Zahl (Kalenderdatum)<br />
*<code>'MM'</code>: Monat als zweistellige Zahl (z.B. 02 für Februar)<br />
*<code>'MMM'</code>: Monat als dreistellige Abkürzung (z.B. Dec für Dezember)<br />
*<code>'MMMM'</code>: Langname des Monats (z.B. March)<br />
*<code>'ee'</code>: Wochentag als zweistellige Zahl (z.B. 00 für Sonntag)<br />
*<code>'eee'</code>: Wochentag als dreistellige Abkürzung (z.B. Mon für Montag)<br />
*<code>'eeee'</code>: Langname des Wochentags (z.B. Tuesday)<br />
*<code>'yy'</code>: Jahr als zweistellige Zahl (z.B. 16 für 2016)<br />
*<code>'yyyy'</code>: Jahr als vierstellige Zahl (z.B. 2016)<br />
*<code>'LF'</code>: Fügt einen Zeilenumbruch hinzu<br />
<br />
Beispiel: Der String <code>'MMM\LF\yyyy'</code> zeigt <code>'Jan'</code> in der ersten, und <code>'2016'</code> in der zweiten Zeile. <code>'MM.dd 2016'</code> wird zu <code>'03.05 2016'</code>.<br />
<br />
===Fadenkreuz-Cursor===<br />
Der Fadenkreuz-Cursor zeigt die Momentanwerte, indem man ihn über die Graphen bewegt. In Desktop-Browsern reicht einfaches Bewegen des Maus. Unter iOS und Android kann der Cursor wird der Cursor durch einfaches Tippen auf die neue Position bewegt.<br />
<br />
Mit dem Attribut '''data-cursorgroup''' können Graphen gruppiert werden. Am Cursor werden dann die Momentanwerte aller Graphen gleichzeitig angezeigt, die die selbe Zahl besitzen, sobald man die Maus über einen aus der Gruppe bewegt.<br />
<br />
===Legende===<br />
Mit dem Attribut '''data-legendpos''' kann die Position der Legende innerhalb des Diagramms festgelegt werden. Die Position wird mit einem Array, bestehend aus zwei Werten im Format <code>'["<horizontal>","<vertikal>"]'</code> angegeben. Für die horizontale Positionierung sind <code>'left'</code>, <code>'right'</code>, <code>'before'</code>, und <code>'behind'</code>, die vertikale Positionierung <code>'top'</code>, <code>'bottom'</code>, <code>'above'</code>, <code>'below'</code> erlaubt (der Unterschied zwischen <code>'left'</code> und <code>'before'</code> liegt darin, dass im zweiten Fall die Legende nicht in den Zeichenbereich gesetzt wird sondern vor das ganze Chart (entsprechend für <code>'after'</code>, <code>'above'</code> und <code>'below'</code>). Alternativ können auch Zahlen verwendet werden, die die Position in Prozent angeben. Durch verschieben mit der Maus oder durch verschieben mit dem Finger oder Stift auf Touch Devices kann die Legende auch an eine andere Position verschoben werden.<br />
<br />
Wenn die Legende eingeblendet ist, kann mittels Klick auf einen Legendeneintrag der zugehörige Graph ein- und ausgeblendet werden.<br />
<br />
===3-dimensionale Drehung===<br />
'''data-ddd''' ermöglicht, den Graphen 3-dimensional zu drehen. Als Wert wird ein Array mit den 3 Winkeln für x, y und z erwartet, wobei z selbst bisher nicht unterstützt wird.<br />
<br />
Beispiel: <code>data-ddd='["40","60","0"]'</code>. <br />
<br />
Wenn der 3D Modus aktiv ist ('''data-ddd''' gesetzt) sind 2 zusätzliche Parameter verfügbar um das Aussehen der Graphen zu beeinflussen. '''data-dddspace''' gibt an, wie viele pixel der Raum zwischen den einzelnen in z-Richtung hintereinander angeordneten Graphen betragen soll.<br />
'''data-dddwidth''' legt fest, wie viele pixel die einzelnen Graphen tief (oder dick) sein sollen.<br />
<br />
Wenn das Array angegeben wird, erscheinen zwei zusätzliche Buttons im Diagramm, mit denen die Drehung in X- und Y-Richtung verändert werden kann.<br />
<br />
===Diagrammtitel===<br />
Mit dem Attribut '''data-title''' kann dem Diagramm, ähnlich wie in FHEM-SVG-Plots, ein Titel hinzugefügt werden.<br />
<br />
Folgende Platzhalter werden unterstützt:<br />
*<code>'min1'</code>: Minimaler Y-Wert des ersten Graphs<br />
*<code>'max1'</code>: Maximaler Y-Wert des ersten Graphs<br />
*<code>'avg1'</code>: Mittlerer Y-Wert des ersten Graphs<br />
*<code>'cnt1'</code>: Anzahl der dargestellten Einzelwerte im ersten Graph<br />
*<code>'currval1'</code>: Letzter, bzw. aktuellster Y-Wert des ersten Graphs<br />
*<code>'mindate1'</code>: Niedrigster Wert auf der X-Achse des ersten Graphs<br />
*<code>'maxdate1'</code>: Höchster Wert auf der X-Achse vom ersten Graphs<br />
*<code>'currdate1'</code>: Letzter, bzw. aktuellster Wert auf der X-Achse des ersten Graphs<br />
<br />
Durch Einsetzen einer anderen Zahl statt '1' können auch die Werte der anderen Graphen angezeigt werden. Das Weglassen der Zahl bewirkt, dass der jeweils zutreffende Wert automatisch ermittelt wird. Bedeutet: <code>max</code> führt dazu, dass der höchste Wert aller angezeigter Graphen verwendet wird.<br />
Zusätzlich ist es möglich durch "$eval(<regexp>)" regular Expressions auszuwerten (also z.B. Berechnungen durchzuführen). In <regexp> können auch "$data()" vorkommen.<br />
<br />
Beispiel: <code>data-title="Klima Wohnzimmer Average: $eval(parseInt($data{avg1}*10)/10)°C / Max: $eval(parseInt($data{max1}*10)/10)°C"</code><br />
<br />
===Buttons im Diagramm===<br />
Es gibt mehrere Buttons, mit denen sich die Anzeige des Diagramms verändern lässt. <code><-</code> und <code>-></code> bewegen die Graphen nach links und rechts. <code>+</code> und <code>-</code> zoomen die Anzeige. <code>legend</code> und <code>cursor</code> schalten die zugehörigen Anzeigen ein und aus. Falls der 3D Modus eingeschaltet ist, gibt es Buttons zum Drehen der Darstellung um die X- und Y-Achse. Falls <code>data-timeranges</code> gesetzt ist, wird ein Pulldown Menü dargestellt, welches die Auswahl von dort definierten Zeiträumen für die X-Achse erlaubt.<br />
<br />
==Beispiele==<br />
===Einfaches Diagramm===<br />
Das Beispiel zeigt ein einfaches Diagramm mit 4 unterschiedlich formatierten Graphen, Legende und Momentanwerten am Fadenkreuz-Cursor.<br />
<br />
[[File:Chart_tabletUI.png]]<br />
<br />
<syntaxhighlight lang="html"><br />
<div data-type="chart"<br />
data-logdevice='["Log.Garden","Log.Garden","Log.Garden","Log.Predicted"]'<br />
data-columnspec='["4:Garden.T:15:","10:Garden.T:0:delta-h","10:Garden.T:0:delta-d","4:predicted.*:15:"]'<br />
data-style='["ftui l0fill","ftui l1fill","ftui l2","ftui l3dot"]'<br />
data-ptype='["lines","histeps","histeps","cubic"]'<br />
data-uaxis='["primary","secondary","secondary","primary"]'<br />
data-legend='["Temperature","Rain/hour","Rain/day","Predicted Temp."]'<br />
data-yunit="°C"<br />
data-ytext="Temperature"<br />
data-minvalue="auto"<br />
data-maxvalue="auto"<br />
data-yunit_sec="mm"<br />
data-ytext_sec="Rain (mm)"<br />
data-height="250"<br />
data-yticks="auto"<br />
data-minvalue_sec="auto"<br />
data-maxvalue_sec="auto"<br />
data-nofulldays="true"<br />
data-daysago_start="2013-08-13T00:00:00"<br />
data-daysago_end="2013-08-14T00:00:00"<br />
data-cursorgroup="1"<br />
data-scrollgroup="1"<br />
data-xticks="auto"><br />
</div><br />
</syntaxhighlight><br />
<br />
===7-Tage-Wettervorhersage mit Proplanta===<br />
In diesem Beispiel wird gezeigt, wie die Vorhersagewerte von [[PROPLANTA]] in einem Diagramm dargestellt werden können. Da die Werte nicht in einer Datenbank oder einem FileLog vorliegen, müssen sie über [[LogProxy]] verarbeitet werden. Dafür sind einige Vorbereitungen in FHEM nötig.<br />
<br />
[[File:FTUI_Widget_Chart-fc-Proplanta.png|941px]]<br />
<br />
'''1.''' Ein LogProxy-Device muss vorhanden sein:<br />
<pre><br />
define myLogProxy logProxy<br />
</pre><br />
<br />
'''2.''' In der Datei <code>99_myUtils.pm</code> muss folgende Routine hinzugefügt werden, die die Daten bereitstellt:<br />
<syntaxhighlight lang="perl"><br />
#---------------------------------------<br />
# Proplanta LogProxy-Funktion<br />
#---------------------------------------<br />
sub logProxy_proplanta2Plot($$$$;$$) {<br />
my ($device, $fcValue, $from, $to, $fcHour, $expMode) = @_;<br />
my $regex;<br />
my @rl;<br />
<br />
return undef if(!$device);<br />
<br />
if($fcValue =~ s/_$//) {<br />
$regex = "^fc[\\d]+_".$fcValue."[\\d]{2}\$";<br />
}<br />
else {<br />
$regex = "^fc[\\d]+_".$fcValue."\$";<br />
}<br />
<br />
$fcHour = 12 if(!defined $fcHour);<br />
$expMode = "point" if(!defined $expMode);<br />
<br />
if( defined($defs{$device}) ) {<br />
if( $defs{$device}{TYPE} eq "PROPLANTA" ) {<br />
@rl = sort{<br />
my ($an) = ($a =~ m/fc(\d+)_.*/);<br />
my ($bn) = ($b =~ m/fc(\d+)_.*/);<br />
$an <=> $bn or $a cmp $b;<br />
}( grep /${regex}/,keys %{$defs{$device}{READINGS}} );<br />
return undef if( !@rl );<br />
} else {<br />
Log3 undef, 2, "logProxy_proplanta2Plot: $device is not a PROPLANTA device";<br />
return undef;<br />
}<br />
}<br />
<br />
my $fromsec = SVG_time_to_sec($from);<br />
my $tosec = SVG_time_to_sec($to);<br />
my $sec = $fromsec;<br />
my ($h,$fcDay,$mday,$mon,$year);<br />
my $timestamp;<br />
<br />
my $reading;<br />
my $value;<br />
my $prev_value;<br />
my $min = 999999;<br />
my $max = -999999;<br />
my $ret = "";<br />
<br />
# while not end of plot range reached<br />
while(($sec < $tosec) && @rl) {<br />
#remember previous value for start of plot range<br />
$prev_value = $value;<br />
<br />
$reading = shift @rl;<br />
($fcDay) = $reading =~ m/^fc(\d+).*/;<br />
$h = ($reading =~ m/.*(\d\d)$/)?$1:$fcHour;<br />
$value = ReadingsVal($device,$reading,undef);<br />
<br />
($mday,$mon,$year) = split('\.',ReadingsVal($device,"fc".$fcDay."_date",undef));<br />
$timestamp = sprintf("%04d-%02d-%02d_%02d:%02d:%02d", $year, $mon, $mday, $h, 0, 0);<br />
$sec = SVG_time_to_sec($timestamp);<br />
<br />
# skip all values before start of plot range<br />
next if( SVG_time_to_sec($timestamp) < $fromsec );<br />
<br />
# add first value at start of plot range<br />
if( !$ret && $prev_value ) {<br />
$min = $prev_value if( (looks_like_number($prev_value) && ($prev_value < $min)) || ($prev_value lt $min) );<br />
$max = $prev_value if( (looks_like_number($prev_value) && ($prev_value > $max)) || ($prev_value gt $max) );<br />
$ret .= "$from $prev_value\n";<br />
}<br />
<br />
# done if after end of plot range<br />
last if($sec > $tosec);<br />
<br />
$min = $value if( (looks_like_number($value) && ($value < $min )) || ($value lt $min) );<br />
$max = $value if( (looks_like_number($value) && ($value > $max )) || ($value gt $max) );<br />
<br />
# add actual controll point<br />
$ret .= "$timestamp $value\n";<br />
<br />
# Log 1, "$timestamp $value -0- $reading";<br />
}<br />
if(($sec < $tosec) && !@rl && ($expMode eq "day")) {<br />
$timestamp = sprintf("%04d-%02d-%02d_%02d:%02d:%02d", $year, $mon, $mday, 23, 59, 59);<br />
if(SVG_time_to_sec($timestamp) < $tosec) {<br />
$ret .= "$timestamp $value\n";<br />
}<br />
else {<br />
$ret .= "$to $value\n";<br />
}<br />
}<br />
elsif(($sec > $tosec) && ($expMode eq "day")) {<br />
$value = $prev_value + ($value - $prev_value)*(86400 + ($tosec - $sec))/86400;<br />
$ret .= "$to $value\n";<br />
}<br />
return ($ret,$min,$max,$prev_value);<br />
}<br />
</syntaxhighlight><br />
<br />
Anschließend können die Daten im Chart-Widget angezeigt werden. Der Device-Name von Proplanta heißt hier im Beispiel <code>AU.xx.WE.Proplanta</code>.<br />
<br />
<syntaxhighlight lang="html"><br />
<div data-type="chart"<br />
data-device="AU.xx.WE.Proplanta"<br />
data-logdevice='[<br />
"myLogProxy",<br />
"myLogProxy",<br />
"myLogProxy"<br />
]'<br />
data-columnspec='[<br />
"Func:logProxy_proplanta2Plot(\\x22AU.xx.WE.Proplanta\\x22,\\x22rain_\\x22,$from,$to,12,\\x22day\\x22)",<br />
"Func:logProxy_proplanta2Plot(\\x22AU.xx.WE.Proplanta\\x22,\\x22chOfRain_\\x22,$from,$to,12,\\x22day\\x22)",<br />
"Func:logProxy_proplanta2Plot(\\x22AU.xx.WE.Proplanta\\x22,\\x22cloud_\\x22,$from,$to,12,\\x22day\\x22)"<br />
]'<br />
data-style='[<br />
"ftui l6fill",<br />
"ftui l5fill",<br />
"ftui l1fill"<br />
]'<br />
data-ptype='[<br />
"steps",<br />
"quadraticSmooth",<br />
"quadraticSmooth"<br />
]'<br />
data-uaxis='[<br />
"primary",<br />
"secondary",<br />
"secondary"<br />
]'<br />
data-legend='[<br />
"Regen",<br />
"Regenwahrscheinlichkeit",<br />
"Wolken"<br />
]'<br />
data-yunit="mm"<br />
data-ytext="Regen"<br />
data-yunit_sec="%"<br />
data-ytext_sec="Chance auf Regen / Wolken"<br />
data-timeformat="eeee"<br />
data-minvalue="auto"<br />
data-maxvalue="auto"<br />
data-minvalue_sec="auto"<br />
data-maxvalue_sec="auto"<br />
data-daysago_start = "0"<br />
data-daysago_end = "-7"<br />
data-xticks="1440"<br />
data-yticks="auto"<br />
data-title="7-Tage-Wettervorhersage"<br />
data-showlegend="true"<br />
class="nobuttons fullsize"><br />
</div><br />
</syntaxhighlight><br />
<br />
'''Hilfreiche Links und Quellen zu diesem Beispiel:'''<br />
*[[LogProxy|LogProxy im FHEM-Wiki]]<br />
*{{Link2Forum|Topic=22967|Message=246973|LinkText=Stundengenaue Wettervorhersage (#1) im FHEM-Forum}}<br />
*{{Link2Forum|Topic=22967|Message=334713|LinkText=Stundengenaue Wettervorhersage (#2) im FHEM-Forum}}<br />
<br />
===Darstellung der Wetter Icons im Diagramm===<br />
<br />
[[File:Wetterchart2.png]]<br />
<br />
Wie oben bereits beschrieben, gibt es beim Chart grundsätzlich die Möglichkeit, Icons, welche in Form von URLs in den Logs abgelegt sind oder welche per logProxy generiert werden, darzustellen. Die Icons werden auf genau dem gleichen Weg von FHEM gelesen, wie alle anderen Datenpunkte. Im Folgenden wird ein Beispiel gezeigt, mit dem die im Proplanta Modul als Readings abgelegten Icons per logProxy Funktion gelesen und in ein Chart eingebaut werden könnnen.<br />
Da es beim Proplanta Modul für die ersten 7 Tage nicht das Reading <code>fc#_weatherIcon</code> gibt, sondern mehrere Readings für unterschiedliche Tageszeiten wogegen für die zweiten 7 Tage ausschließlich das Reading <code>fc#_weatherIcon</code> vorhanden ist, sollte per <code>attr device userReading</code> mit folgendem Eintrag dafür gesorgt werden, dass für alle Tage ein Reading <code>fc#_weatherIcon</code> vorhanden ist (alternativ könnten auch 2 Graphen gezeichnet werden, wobei der erste dann nur die ersten 7 Tage enthält und der zweite die letzen 7 Tage, will man nur die ersten 7 Tage darstellen braucht man das userReading nicht unbedingt).<br />
<syntaxhighlight lang="perl"><br />
fc0_weatherIcon {ReadingsVal("AU.xx.WE.Proplanta","fc0_weatherDayIcon","");},<br />
fc1_weatherIcon {ReadingsVal("AU.xx.WE.Proplanta","fc1_weatherDayIcon","");},<br />
fc2_weatherIcon {ReadingsVal("AU.xx.WE.Proplanta","fc2_weatherDayIcon","");},<br />
fc3_weatherIcon {ReadingsVal("AU.xx.WE.Proplanta","fc3_weatherDayIcon","");},<br />
fc4_weatherIcon {ReadingsVal("AU.xx.WE.Proplanta","fc4_weatherDayIcon","");},<br />
fc5_weatherIcon {ReadingsVal("AU.xx.WE.Proplanta","fc5_weatherDayIcon","");},<br />
fc6_weatherIcon {ReadingsVal("AU.xx.WE.Proplanta","fc6_weatherDayIcon","");}<br />
</syntaxhighlight><br />
Um die Icons darzustellen muss ein zusätzlicher Graph definiert werden. Dieser nutzt neben der Columnspec, die die URLs abruft den Parameter <code>data-ptype="icons:#"</code> (# ist eine Zahl und steht für die Nummer, beginnend bei 0 des Graphen, welcher für die y-Position der Icons verwendet werden soll) und den Stil <code>sym</code>. Der Wert für die Symbolgröße sollte z.B. durch eine zusätzliche Definition im File fhem-tablet-ui-user.css in der Form:<br />
<syntaxhighlight lang="css"><br />
/* icon lines */<br />
.ftui.l99icon { stroke:#DDA400; stroke-width:48px; fill:none; }<br />
</syntaxhighlight><br />
angepasst werden.<br />
<br />
Im folgenden ein Beispiel, welches eine Linie für die Maximale Tagestemperatur zeichnet und auf dieser Linie die Wetter Icons darstellt.<br />
<syntaxhighlight lang="html"><br />
<div data-type="chart"<br />
data-device="AU.xx.WE.Proplanta"<br />
data-logdevice='[<br />
"myLogProxy",<br />
"myLogProxy"<br />
]'<br />
data-columnspec='[<br />
"Func:logProxy_proplanta2Plot(\\x22AU.xx.WE.Proplanta\\x22,\\x22weatherIcon\\x22,$from,$to,12,\\x22day\\x22)",<br />
"Func:logProxy_proplanta2Plot(\\x22AU.xx.WE.Proplanta\\x22,\\x22tempMax\\x22,$from,$to,12,\\x22day\\x22)"<br />
]'<br />
data-style='[<br />
"ftui l99icon",<br />
"ftui l1fill"<br />
]'<br />
data-ptype='[<br />
"icons:1",<br />
"quadraticSmooth"<br />
]'<br />
data-uaxis='[<br />
"primary",<br />
"primary"<br />
]'<br />
data-legend='[<br />
"Wetterbedingung",<br />
"Max. Temperature"<br />
]'<br />
data-yunit="°C"<br />
data-ytext="Temperature (°C)"<br />
data-timeformat="ee\LF\dd.MM"<br />
data-minvalue="auto"<br />
data-maxvalue="auto"<br />
data-minvalue_sec="auto"<br />
data-maxvalue_sec="auto"<br />
data-daysago_start="-1w"<br />
data-y_margin="20"<br />
data-daysago_end="-3w"<br />
data-xticks="1440"<br />
data-yticks="auto"<br />
data-title="14-Tage-Wettervorhersage"<br />
data-showlegend="true"<br />
class="nobuttons fullsize"><br />
</div><br />
</syntaxhighlight><br />
<br />
===Kuchendiagramme===<br />
In folgendem Beispiel wird gezeigt, wie man ein "Kuchendiagramm" darstellen kann.<br />
<br />
[[File:PieChart.png]]<br />
<br />
Ähnlich wie bei den Beispielen für die Wetter Darstellungen wird hierzu auch wieder logProxy benötigt. Zunächst muss die folgende zusätzliche Funktion in <code>99_myUtils.pm</code> einfügen.<br />
<syntaxhighlight lang="perl"><br />
#---------------------------------------<br />
# Funktion zum Erzeugen der Inputs für Kuchendiagramme<br />
#---------------------------------------<br />
sub logProxy_values2PieChart($$$$;$$) {<br />
my ($device, $reading, $angle_start, $angle_dif, $inner_rad, $show_text) = @_;<br />
Log3 undef, 1, "$device, $reading, $angle_start, $angle_dif, $inner_rad, $show_text\n";<br />
<br />
use constant PI => 4 * atan2(1,1);<br />
<br />
my $value=ReadingsVal($device,$reading,0);<br />
<br />
my $angle_delta = $value/100*360;<br />
$angle_start = $angle_start/100*360;<br />
<br />
my $rad=10;<br />
my $irad=0;<br />
if ($inner_rad) {<br />
$irad = $rad*$inner_rad;<br />
}<br />
my $angle=$angle_start/360*2.0*PI;<br />
my $x=$irad*sin($angle);<br />
my $y=$irad*cos($angle);<br />
my $ret .= ";p ".$x." ".$y."\n"; # add segment at angle $angle<br />
<br />
for (my $i=$angle_start; $i<=$angle_start+$angle_delta; $i+=$angle_dif) {<br />
$angle = $i/360*2.0*PI;<br />
$x = $rad*sin($angle);<br />
$y = $rad*cos($angle);<br />
$ret .= ";p ".$x." ".$y."\n"; # add segment at angle $angle<br />
}<br />
<br />
$angle = ($angle_start+$angle_delta)/360*2.0*PI; # add last segment <br />
$ret .= ";p ".$rad*sin($angle)." ".$rad*cos($angle)."\n";<br />
<br />
if ($inner_rad) {<br />
for (my $i=$angle_start; $i<$angle_start+$angle_delta; $i+=$angle_dif) {<br />
$angle = ($angle_start+$angle_start+$angle_delta-$i)/360*2.0*PI;<br />
$x = $irad*sin($angle);<br />
$y = $irad*cos($angle);<br />
$ret .= ";p ".$x." ".$y."\n"; # add segment at angle $angle<br />
}<br />
}<br />
<br />
$angle = ($angle_start)/360*2.0*PI; # add last segment <br />
$ret .= ";p ".$irad*sin($angle)." ".$irad*cos($angle)."\n";<br />
<br />
if ($show_text) { # show text values<br />
$x = ($rad+$irad)/2*sin((2*$angle_start+$angle_delta)/2/360*2.0*PI);<br />
$y = ($rad+$irad)/2*cos((2*$angle_start+$angle_delta)/2/360*2.0*PI);<br />
<br />
$ret .= ";t ".$x." ".$y." middle ".$show_text.":".$value."%\n";<br />
}<br />
<br />
return($ret);<br />
}<br />
</syntaxhighlight><br />
In FHEM braucht man Readings, welche eine Zahl enthalten, die als Prozentwert interpretiert wird. Für jeden Prozentwert (also für jedes Reading) generiert die o.a. Funktion nun den Chart Input für ein Kuchenstück und liefert diesen als Antwort auf das GET, welches das Chart Widget auslöst. Dazu braucht die Funktion folgende Parameter: (Name des FHEM Devices, Name des Readings, Start Winkel des Kuchenstücks (Mathematisch gegen den Uhrzeigersinn in Grad), Delta Winkel zum Zeichnen (legt fest in welchen Schritten der Teilkreis des Kuchenstücks gezeichnet wird), Skalierungsfaktor für inneren Ring wenn ein Ring gezeichtnet werden soll (0 bedeutet komplette Kuchenstücke), optionaler Text der ins Kuchenstück vor die Prozentzahl geschrieben wird).<br />
Im Folgenden eine Beispielkonfiguration für die Darstellung als Kuchendiagramm, die Readings heißen hier dPer1 bis dPer4. Der Startwinkel wird duch Aufsummierung der jeweils vorher schon gezeichneten Kuchenstücke gebildet, dadurch entstehen aneinander hängende Stücke.<br />
<syntaxhighlight lang="html"><br />
[[Datei:[[Datei:Beispiel.jpg]]]]<div class="normal noaxes nobuttons"<br />
data-type="chart"<br />
data-logdevice='["lp"]'<br />
data-logfile="CURRENT"<br />
data-columnspec='[<br />
"Func:logProxy_values2PieChart(\"dPer1\",\"state\",ReadingsVal(\"dPer4\",\"state\",0)+ReadingsVal(\"dPer3\",\"state\",0),5,0,\"first\")",<br />
"Func:logProxy_values2PieChart(\"dPer2\",\"state\",ReadingsVal(\"dPer4\",\"state\",0)+ReadingsVal(\"dPer3\",\"state\",0)+ReadingsVal(\"dPer1\",\"state\",0),5,0,\"second\")",<br />
"Func:logProxy_values2PieChart(\"dPer3\",\"state\",ReadingsVal(\"dPer4\",\"state\",0),5,0,\"third\")",<br />
"Func:logProxy_values2PieChart(\"dPer4\",\"state\",0,5,0,\"fourth\")"<br />
]'<br />
data-style='["ftui l0fill","ftui l1fill","ftui l2fill","ftui l3fill"]'<br />
data-ptype='["lines"]'<br />
data-uaxis='["primary"]'<br />
data-legend='["First","Second","Third","Fourth"]'<br />
data-legendpos='["left","top"]'<br />
data-yunit=""<br />
data-height="300"<br />
data-width="300"<br />
data-ddd='["-40","0","0"]'<br />
data-dddspace='["-10"]'<br />
data-dddwidth='["10"]'<br />
data-showlegend="true"<br />
data-legend_horiz="true"<br />
data-xticks="auto"><br />
</div><br />
</syntaxhighlight><br />
<br />
===Fensterstatus offen/geschlossen===<br />
Dieses Beispiel zeigt, wie ein Fensterkontakt, dessen Reading die Werte <code>closed</code> und <code>open</code> einnimmt, als Graph gezeichnet werden kann. Technisch gesehen werden hier die Werte <code>0</code> und <code>1</code> gezeichnet, indem über das Attribut '''data-columnspec''' dem Zustand <code>open</code> der Wert <code>1</code> und allen anderen Zuständen der Wert <code>0</code> zugeordnet wird. Über das Attribut '''data-yticks''' wird die Beschriftung an der Y-Achse (<code>0</code> und <code>1</code>) gegen einen frei definierbaren Text ausgetauscht.<br />
<br />
<syntaxhighlight lang="html"><br />
<div data-type="chart"<br />
data-device="wz_fensterstatus"<br />
data-logdevice='["myDbLog"]'<br />
data-logfile='["HISTORY"]'<br />
data-columnspec='["wz_fensterstatus:state:0::$val=($val=~\\x22open\\x22?1:0)"]'<br />
data-style='["ftui l4fill"]'<br />
data-ptype='["steps"]'<br />
data-height="290"<br />
data-yticks='[[0,"geschlossen"],[1,"offen"]]'<br />
data-minvalue="0"<br />
data-maxvalue="1.1"<br />
data-nofulldays="true"<br />
data-daysago_start="1"<br />
data-daysago_end="-1"<br />
data-cursorgroup="1"<br />
data-scrollgroup="1"><br />
</div><br />
</syntaxhighlight><br />
<br />
'''Hinweis:''' Das Beispiel funktioniert nur mit DbLog. Falls Logfiles verwendet werden muss statt '$val' '$fld[''num'']' verwendet werden. Hierbei steht ''num'' für die Spalte (beginnend bei 0) in der die Daten stehen.<br />
<br />
==Links==<br />
{{Link2Forum|Topic= 48450 |Message=401006|LinkText=Thread im FHEM-Forum}}<br />
<br />
[[Kategorie:FHEM Tablet UI|Chart]]</div>Curthttp://wiki.fhem.de/w/index.php?title=%C3%9Cberwachung_linuxbasierter_Server&diff=29983Überwachung linuxbasierter Server2019-03-26T01:31:09Z<p>Curt: /* Vorbemerkung */</p>
<hr />
<div>{{Baustelle}} <br />
[[Datei:2019-03-13-serverueberwachung-1.jpg|right|500px]]<br />
<br />
In diesem Artikel wird im Sinne eines '''proof of concept''' die Möglichkeit der Überwachung vieler linuxbasierter Server auf ausstehende Updates, Plattenplatz usw. beschrieben. <br />
<!-- Falls das Inhaltsverzeichnis komplett darunter starten soll diese und die übernächste Zeile löschen...<br />
<br clear=all><br />
--><br />
==Vorbemerkung==<br />
Es gibt bereits mehrere, recht ausgefeilte Lösungen zur Überwachung von Servern: Angefangen von Nagios <br />
bis hin zum Modul [[SYSMON]]. Dem soll keine weitere Lösung hinzugefügt werden, es geht in diesem Projekt '''nicht''' um die minutengenaue Überwachung von Serverparametern. Hier geht es um einen '''täglichen''' Status aller Server im Hausnetz: Liegen Updates an, ist noch Plattenplatz frei? - Dabei ist der Fokus gelegt auf minimale Belastung der zu überwachenden Server (die im Folgenden "Clients" genannt werden) und des Netzes.<br />
<br />
==Begriffsbestimmung==<br />
In diesem Artikel ist "Server" das Gerät, auf dem FHEM läuft. Client/Clients sind Maschinen, die linuxbasiert (Debian, Ubuntu, Raspian) sind, beispielsweise kleine, leistungsschwache Raspberry Pi Zero. Obwohl auf diesen Clients ein Webserver erforderlich ist, installiert sein muss, werden sie der sprachlichen Klarheit wegen als "Client" benannt.<br />
<br />
==Installation auf den Clients==<br />
Jeder Client muss künftig zwei Bedingungen erfüllen: Erstens muss er täglich eine JSON-Datei seines Zustands bereitstellen. Zweitens muss ein Webserver diese Datei dem Server ausliefern können.<br />
<br />
===Installation Webserver auf Clients===<br />
Sofern noch kein Webserver installiert ist, sollte bei kleinen, schwachen Geräten ein möglichst leichtgewichtiger, ressourcensparender Webserver installiert werden. Ein Beispiel wird im Artikel [[Webserver auf Raspberry]] beschrieben, dort sind weitere Alternativen benannt. - Der Webserver sollte von /var/www ausliefern, dort ist händisch sodann ein Unterverzeichnis "html" anzulegen.<br />
<br />
===Installation JSON-Script auf Clients===<br />
Danach muss jeder Client in die Lage versetzt werden, eine JSON-Datei mit den tagesbezogenen Zustandsdaten des Client bereitzustellen. Dafür werden keinerlei Java oder Javascript (und im Sinne der Schlankheit auch nicht diesbezügliche riesige Pakete) benötigt.<br />
<br />
...<br />
<br />
==Installationen auf dem Server==<br />
...<br />
===FHEM Scripte und Devices=== <br />
<br />
===[[FTUI]] Kachel=== <br />
<br />
<br />
===Fakultative Installation auf dem Server=== <br />
...<br />
<br />
==Danksagung==<br />
Bei der Umsetzung der Idee halfen -manchmal ohne es zu wissen- mehrere Teilnehmer des FHEM-Forums, denen der Primärautor des Beitrags für ihre uneigennützige, freundliche Hilfe zu Dank verpflichtet ist.</div>Curthttp://wiki.fhem.de/w/index.php?title=%C3%9Cberwachung_linuxbasierter_Server&diff=29898Überwachung linuxbasierter Server2019-03-14T03:33:00Z<p>Curt: </p>
<hr />
<div>{{Baustelle}} <br />
[[Datei:2019-03-13-serverueberwachung-1.jpg]]<br />
<br />
In diesem Artikel wird im Sinne eines '''proof of concept''' die Möglichkeit der Überwachung vieler linuxbasierter Server auf ausstehende Updates, Plattenplatz usw. beschrieben. <br />
<br />
Editor: Die Grafik muss rechts neben die Einleitung. Ich muss noch herausfinden wie das geht: Einleitungssatz links, etwas verkleinerte Grafik rechts, erst darunter dann das Inhaltsverzeichnis.<br />
<br />
Editor: Wer Hand anlegen mag - frisch ans Werk!<br />
<br />
==Vorbemerkung==<br />
Es gibt bereits mehrere, recht ausgefeilte Lösungen zur Überwachung von Servern: Angefangen von Nagios <br />
bis hin zum Modul [[SYSMON]]. Dem soll keine weitere Lösung hinzugefügt werden, es geht in diesem Projekt '''nicht''' um die minutengenaue Überwachung von Serverparametern. Hier geht es um einen '''täglichen''' Status aller Server im Hausnetz. Dabei ist der Fokus gelegt auf minimale Belastung der zu überwachenden Server (die im Folgenden "Clients" genannt werden) und des Netzes.<br />
<br />
==Begriffsbestimmung==<br />
In diesem Artikel ist "Server" das Gerät, auf dem FHEM läuft. Client/Clients sind Maschinen, die linuxbasiert (Debian, Ubuntu, Raspian) sind, beispielsweise kleine, leistungsschwache Raspberry Pi Zero. Obwohl auf diesen Clients ein Webserver erforderlich ist, installiert sein muss, werden sie der sprachlichen Klarheit wegen als "Client" benannt.<br />
<br />
==Installation auf den Clients==<br />
Jeder Client muss künftig zwei Bedingungen erfüllen: Erstens muss er täglich eine JSON-Datei seines Zustands bereitstellen. Zweitens muss ein Webserver diese Datei dem Server ausliefern können.<br />
<br />
===Installation Webserver auf Clients===<br />
Sofern noch kein Webserver installiert ist, sollte bei kleinen, schwachen Geräten ein möglichst leichtgewichtiger, ressourcensparender Webserver installiert werden. Ein Beispiel wird im Artikel [[Webserver auf Raspberry]] beschrieben, dort sind weitere Alternativen benannt. - Der Webserver sollte von /var/www ausliefern, dort ist händisch sodann ein Unterverzeichnis "html" anzulegen.<br />
<br />
===Installation JSON-Script auf Clients===<br />
Danach muss jeder Client in die Lage versetzt werden, eine JSON-Datei mit den tagesbezogenen Zustandsdaten des Client bereitzustellen. Dafür werden keinerlei Java oder Javascript (und im Sinne der Schlankheit auch nicht diesbezügliche riesige Pakete) benötigt.<br />
<br />
...<br />
<br />
==Installationen auf dem Server==<br />
...<br />
===FHEM Scripte und Devices=== <br />
<br />
===[[FTUI]] Kachel=== <br />
<br />
<br />
===Fakultative Installation auf dem Server=== <br />
...<br />
<br />
==Danksagung==<br />
Bei der Umsetzung der Idee halfen -manchmal ohne es zu wissen- mehrere Teilnehmer des FHEM-Forums, denen der Primärautor des Beitrags für ihre uneigennützige, freundliche Hilfe zu Dank verpflichtet ist.</div>Curthttp://wiki.fhem.de/w/index.php?title=%C3%9Cberwachung_linuxbasierter_Server&diff=29897Überwachung linuxbasierter Server2019-03-14T03:30:27Z<p>Curt: /* Installationen auf dem Server */</p>
<hr />
<div>{{Baustelle}} <br />
[[Datei:2019-03-13-serverueberwachung-1.jpg]]<br />
<br />
In diesem Artikel wird im Sinne eines '''proof of concept''' die Möglichkeit der Überwachung vieler linuxbasierter Server auf ausstehende Updates, Plattenplatz usw. beschrieben. <br />
<br />
==Vorbemerkung==<br />
Es gibt bereits mehrere, recht ausgefeilte Lösungen zur Überwachung von Servern: Angefangen von Nagios <br />
bis hin zum Modul [[SYSMON]]. Dem soll keine weitere Lösung hinzugefügt werden, es geht in diesem Projekt '''nicht''' um die minutengenaue Überwachung von Serverparametern. Hier geht es um einen '''täglichen''' Status aller Server im Hausnetz. Dabei ist der Fokus gelegt auf minimale Belastung der zu überwachenden Server (die im Folgenden "Clients" genannt werden) und des Netzes.<br />
<br />
==Begriffsbestimmung==<br />
In diesem Artikel ist "Server" das Gerät, auf dem FHEM läuft. Client/Clients sind Maschinen, die linuxbasiert (Debian, Ubuntu, Raspian) sind, beispielsweise kleine, leistungsschwache Raspberry Pi Zero. Obwohl auf diesen Clients ein Webserver erforderlich ist, installiert sein muss, werden sie der sprachlichen Klarheit wegen als "Client" benannt.<br />
<br />
==Installation auf den Clients==<br />
Jeder Client muss künftig zwei Bedingungen erfüllen: Erstens muss er täglich eine JSON-Datei seines Zustands bereitstellen. Zweitens muss ein Webserver diese Datei dem Server ausliefern können.<br />
<br />
===Installation Webserver auf Clients===<br />
Sofern noch kein Webserver installiert ist, sollte bei kleinen, schwachen Geräten ein möglichst leichtgewichtiger, ressourcensparender Webserver installiert werden. Ein Beispiel wird im Artikel [[Webserver auf Raspberry]] beschrieben, dort sind weitere Alternativen benannt. - Der Webserver sollte von /var/www ausliefern, dort ist händisch sodann ein Unterverzeichnis "html" anzulegen.<br />
<br />
===Installation JSON-Script auf Clients===<br />
Danach muss jeder Client in die Lage versetzt werden, eine JSON-Datei mit den tagesbezogenen Zustandsdaten des Client bereitzustellen. Dafür werden keinerlei Java oder Javascript (und im Sinne der Schlankheit auch nicht diesbezügliche riesige Pakete) benötigt.<br />
<br />
...<br />
<br />
==Installationen auf dem Server==<br />
...<br />
===FHEM Scripte und Devices=== <br />
<br />
===[[FTUI]] Kachel=== <br />
<br />
<br />
===Fakultative Installation auf dem Server=== <br />
...<br />
<br />
==Danksagung==<br />
Bei der Umsetzung der Idee halfen -manchmal ohne es zu wissen- mehrere Teilnehmer des FHEM-Forums, denen der Primärautor des Beitrags für ihre uneigennützige, freundliche Hilfe zu Dank verpflichtet ist.</div>Curthttp://wiki.fhem.de/w/index.php?title=%C3%9Cberwachung_linuxbasierter_Server&diff=29896Überwachung linuxbasierter Server2019-03-14T03:29:56Z<p>Curt: /* Installationen auf dem Server */</p>
<hr />
<div>{{Baustelle}} <br />
[[Datei:2019-03-13-serverueberwachung-1.jpg]]<br />
<br />
In diesem Artikel wird im Sinne eines '''proof of concept''' die Möglichkeit der Überwachung vieler linuxbasierter Server auf ausstehende Updates, Plattenplatz usw. beschrieben. <br />
<br />
==Vorbemerkung==<br />
Es gibt bereits mehrere, recht ausgefeilte Lösungen zur Überwachung von Servern: Angefangen von Nagios <br />
bis hin zum Modul [[SYSMON]]. Dem soll keine weitere Lösung hinzugefügt werden, es geht in diesem Projekt '''nicht''' um die minutengenaue Überwachung von Serverparametern. Hier geht es um einen '''täglichen''' Status aller Server im Hausnetz. Dabei ist der Fokus gelegt auf minimale Belastung der zu überwachenden Server (die im Folgenden "Clients" genannt werden) und des Netzes.<br />
<br />
==Begriffsbestimmung==<br />
In diesem Artikel ist "Server" das Gerät, auf dem FHEM läuft. Client/Clients sind Maschinen, die linuxbasiert (Debian, Ubuntu, Raspian) sind, beispielsweise kleine, leistungsschwache Raspberry Pi Zero. Obwohl auf diesen Clients ein Webserver erforderlich ist, installiert sein muss, werden sie der sprachlichen Klarheit wegen als "Client" benannt.<br />
<br />
==Installation auf den Clients==<br />
Jeder Client muss künftig zwei Bedingungen erfüllen: Erstens muss er täglich eine JSON-Datei seines Zustands bereitstellen. Zweitens muss ein Webserver diese Datei dem Server ausliefern können.<br />
<br />
===Installation Webserver auf Clients===<br />
Sofern noch kein Webserver installiert ist, sollte bei kleinen, schwachen Geräten ein möglichst leichtgewichtiger, ressourcensparender Webserver installiert werden. Ein Beispiel wird im Artikel [[Webserver auf Raspberry]] beschrieben, dort sind weitere Alternativen benannt. - Der Webserver sollte von /var/www ausliefern, dort ist händisch sodann ein Unterverzeichnis "html" anzulegen.<br />
<br />
===Installation JSON-Script auf Clients===<br />
Danach muss jeder Client in die Lage versetzt werden, eine JSON-Datei mit den tagesbezogenen Zustandsdaten des Client bereitzustellen. Dafür werden keinerlei Java oder Javascript (und im Sinne der Schlankheit auch nicht diesbezügliche riesige Pakete) benötigt.<br />
<br />
...<br />
<br />
==Installationen auf dem Server==<br />
...<br />
===FHEM Scripte und Devices=== <br />
<br />
===[[FTUI]] Kachel=== <br />
<br />
<br />
===fakultative Installation auf dem Server=== <br />
...<br />
<br />
==Danksagung==<br />
Bei der Umsetzung der Idee halfen -manchmal ohne es zu wissen- mehrere Teilnehmer des FHEM-Forums, denen der Primärautor des Beitrags für ihre uneigennützige, freundliche Hilfe zu Dank verpflichtet ist.</div>Curthttp://wiki.fhem.de/w/index.php?title=%C3%9Cberwachung_linuxbasierter_Server&diff=29895Überwachung linuxbasierter Server2019-03-14T03:28:42Z<p>Curt: Schrittchen für Schrittchen</p>
<hr />
<div>{{Baustelle}} <br />
[[Datei:2019-03-13-serverueberwachung-1.jpg]]<br />
<br />
In diesem Artikel wird im Sinne eines '''proof of concept''' die Möglichkeit der Überwachung vieler linuxbasierter Server auf ausstehende Updates, Plattenplatz usw. beschrieben. <br />
<br />
==Vorbemerkung==<br />
Es gibt bereits mehrere, recht ausgefeilte Lösungen zur Überwachung von Servern: Angefangen von Nagios <br />
bis hin zum Modul [[SYSMON]]. Dem soll keine weitere Lösung hinzugefügt werden, es geht in diesem Projekt '''nicht''' um die minutengenaue Überwachung von Serverparametern. Hier geht es um einen '''täglichen''' Status aller Server im Hausnetz. Dabei ist der Fokus gelegt auf minimale Belastung der zu überwachenden Server (die im Folgenden "Clients" genannt werden) und des Netzes.<br />
<br />
==Begriffsbestimmung==<br />
In diesem Artikel ist "Server" das Gerät, auf dem FHEM läuft. Client/Clients sind Maschinen, die linuxbasiert (Debian, Ubuntu, Raspian) sind, beispielsweise kleine, leistungsschwache Raspberry Pi Zero. Obwohl auf diesen Clients ein Webserver erforderlich ist, installiert sein muss, werden sie der sprachlichen Klarheit wegen als "Client" benannt.<br />
<br />
==Installation auf den Clients==<br />
Jeder Client muss künftig zwei Bedingungen erfüllen: Erstens muss er täglich eine JSON-Datei seines Zustands bereitstellen. Zweitens muss ein Webserver diese Datei dem Server ausliefern können.<br />
<br />
===Installation Webserver auf Clients===<br />
Sofern noch kein Webserver installiert ist, sollte bei kleinen, schwachen Geräten ein möglichst leichtgewichtiger, ressourcensparender Webserver installiert werden. Ein Beispiel wird im Artikel [[Webserver auf Raspberry]] beschrieben, dort sind weitere Alternativen benannt. - Der Webserver sollte von /var/www ausliefern, dort ist händisch sodann ein Unterverzeichnis "html" anzulegen.<br />
<br />
===Installation JSON-Script auf Clients===<br />
Danach muss jeder Client in die Lage versetzt werden, eine JSON-Datei mit den tagesbezogenen Zustandsdaten des Client bereitzustellen. Dafür werden keinerlei Java oder Javascript (und im Sinne der Schlankheit auch nicht diesbezügliche riesige Pakete) benötigt.<br />
<br />
...<br />
<br />
==Installationen auf dem Server==<br />
...<br />
===FHEM Scripte und Devices=== <br />
<br />
===[[FTUI Kachel=== <br />
<br />
<br />
===fakultative Installation auf dem Server=== <br />
...<br />
<br />
==Danksagung==<br />
Bei der Umsetzung der Idee halfen -manchmal ohne es zu wissen- mehrere Teilnehmer des FHEM-Forums, denen der Primärautor des Beitrags für ihre uneigennützige, freundliche Hilfe zu Dank verpflichtet ist.</div>Curthttp://wiki.fhem.de/w/index.php?title=%C3%9Cberwachung_linuxbasierter_Server&diff=29894Überwachung linuxbasierter Server2019-03-14T01:52:55Z<p>Curt: /* Installation auf den Clients */</p>
<hr />
<div>{{Baustelle}} <br />
[[Datei:2019-03-13-serverueberwachung-1.jpg]]<br />
<br />
In diesem Artikel wird im Sinne eines '''proof of concept''' die Möglichkeit der Überwachung vieler linuxbasierter Server auf ausstehende Updates, Plattenplatz usw. beschrieben. <br />
<br />
==Vorbemerkung==<br />
Es gibt bereits mehrere, recht ausgefeilte Lösungen zur Überwachung von Servern: Angefangen von Nagios <br />
bis hin zum Modul [[SYSMON]]. Dem soll keine weitere Lösung hinzugefügt werden, es geht in diesem Projekt '''nicht''' um die minutengenaue Überwachung von Serverparametern. Hier geht es um einen '''täglichen''' Status aller Server im Hausnetz. Dabei ist der Fokus gelegt auf minimale Belastung der zu überwachenden Server (die im Folgenden "Clients" genannt werden) und des Netzes.<br />
<br />
==Begriffsbestimmung==<br />
In diesem Artikel ist "Server" das Gerät, auf dem FHEM läuft. Client/Clients sind Maschinen, die linuxbasiert (Debian, Ubuntu, Raspian) sind, beispielsweise kleine, leistungsschwache Raspberry Pi Zero. Obwohl auf diesen Clients ein Webserver erforderlich ist, installiert sein muss, werden sie der sprachlichen Klarheit wegen als "Client" benannt.<br />
<br />
==Installation==<br />
===Installation auf den Clients===<br />
Jeder Client muss künftig zwei Bedingungen erfüllen: Erstens muss er täglich eine JSON-Datei seines Zustands bereitstellen. Zweitens muss ein Webserver diese Datei dem Server ausliefern können.<br />
<br />
Zunächst zum Webserver auf den Clients: Sofern noch kein Webserver installiert ist, sollte bei kleinen, schwachen Geräten ein möglichst leichtgewichtiger, ressourcensparender Webserver installiert werden. Ein Beispiel wird im Artikel [[Webserver auf Raspberry]] beschrieben, dort sind weitere Alternativen benannt. - Der Webserver sollte von /var/www ausliefern, dort ist händisch sodann ein Unterverzeichnis "html" anzulegen.<br />
<br />
Danach muss jeder Client in die Lage versetzt werden, eine JSON-Datei mit den tagesbezogenen Zustandsdaten des Client bereitzustellen. Dafür werden keinerlei Java oder Javascript (und im Sinne der Schlankheit auch nicht diesbezügliche riesige Pakete) benötigt.<br />
<br />
...<br />
<br />
===Installation auf dem Server===<br />
...<br />
===fakultative Installation auf dem Server=== <br />
...<br />
<br />
==Danksagung==<br />
Bei der Umsetzung der Idee halfen -manchmal ohne es zu wissen- mehrere Teilnehmer des FHEM-Forums, denen der Primärautor des Beitrags für ihre uneigennützige, freundliche Hilfe zu Dank verpflichtet ist.</div>Curthttp://wiki.fhem.de/w/index.php?title=%C3%9Cberwachung_linuxbasierter_Server&diff=29893Überwachung linuxbasierter Server2019-03-14T01:40:17Z<p>Curt: /* Vorbemerkung */</p>
<hr />
<div>{{Baustelle}} <br />
[[Datei:2019-03-13-serverueberwachung-1.jpg]]<br />
<br />
In diesem Artikel wird im Sinne eines '''proof of concept''' die Möglichkeit der Überwachung vieler linuxbasierter Server auf ausstehende Updates, Plattenplatz usw. beschrieben. <br />
<br />
==Vorbemerkung==<br />
Es gibt bereits mehrere, recht ausgefeilte Lösungen zur Überwachung von Servern: Angefangen von Nagios <br />
bis hin zum Modul [[SYSMON]]. Dem soll keine weitere Lösung hinzugefügt werden, es geht in diesem Projekt '''nicht''' um die minutengenaue Überwachung von Serverparametern. Hier geht es um einen '''täglichen''' Status aller Server im Hausnetz. Dabei ist der Fokus gelegt auf minimale Belastung der zu überwachenden Server (die im Folgenden "Clients" genannt werden) und des Netzes.<br />
<br />
==Begriffsbestimmung==<br />
In diesem Artikel ist "Server" das Gerät, auf dem FHEM läuft. Client/Clients sind Maschinen, die linuxbasiert (Debian, Ubuntu, Raspian) sind, beispielsweise kleine, leistungsschwache Raspberry Pi Zero. Obwohl auf diesen Clients ein Webserver erforderlich ist, installiert sein muss, werden sie der sprachlichen Klarheit wegen als "Client" benannt.<br />
<br />
==Installation==<br />
===Installation auf den Clients===<br />
...<br />
[[Webserver auf Raspberry]] <-- nein, das ist nicht die Lösung, das ist eine Vormerkung!<br />
...<br />
<br />
===Installation auf dem Server===<br />
...<br />
===fakultative Installation auf dem Server=== <br />
...<br />
<br />
==Danksagung==<br />
Bei der Umsetzung der Idee halfen -manchmal ohne es zu wissen- mehrere Teilnehmer des FHEM-Forums, denen der Primärautor des Beitrags für ihre uneigennützige, freundliche Hilfe zu Dank verpflichtet ist.</div>Curthttp://wiki.fhem.de/w/index.php?title=%C3%9Cberwachung_linuxbasierter_Server&diff=29892Überwachung linuxbasierter Server2019-03-14T01:36:11Z<p>Curt: </p>
<hr />
<div>{{Baustelle}} <br />
[[Datei:2019-03-13-serverueberwachung-1.jpg]]<br />
<br />
In diesem Artikel wird im Sinne eines '''proof of concept''' die Möglichkeit der Überwachung vieler linuxbasierter Server auf ausstehende Updates, Plattenplatz usw. beschrieben. <br />
<br />
==Vorbemerkung==<br />
Es gibt bereits mehrere, recht ausgefeilte Lösungen zur Überwachung von Servern: Angefangen von Nagios <br />
bis hin zum Modul [[SYSMON]]. Dem soll keine weitere Lösung hinzugefügt werden, es geht in diesem Projekt '''nicht''' um die minutengenaue Überwachung von Serverparametern. Hier geht es um einen '''täglichen''' Status aller Server im Hausnetz. Dabei ist der Fokus gelegt auf minimale Belastung der zu überwachenden Server und des Netzes.<br />
<br />
==Begriffsbestimmung==<br />
In diesem Artikel ist "Server" das Gerät, auf dem FHEM läuft. Client/Clients sind Maschinen, die linuxbasiert (Debian, Ubuntu, Raspian) sind, beispielsweise kleine, leistungsschwache Raspberry Pi Zero. Obwohl auf diesen Clients ein Webserver erforderlich ist, installiert sein muss, werden sie der sprachlichen Klarheit wegen als "Client" benannt.<br />
<br />
==Installation==<br />
===Installation auf den Clients===<br />
...<br />
[[Webserver auf Raspberry]] <-- nein, das ist nicht die Lösung, das ist eine Vormerkung!<br />
...<br />
<br />
===Installation auf dem Server===<br />
...<br />
===fakultative Installation auf dem Server=== <br />
...<br />
<br />
==Danksagung==<br />
Bei der Umsetzung der Idee halfen -manchmal ohne es zu wissen- mehrere Teilnehmer des FHEM-Forums, denen der Primärautor des Beitrags für ihre uneigennützige, freundliche Hilfe zu Dank verpflichtet ist.</div>Curthttp://wiki.fhem.de/w/index.php?title=%C3%9Cberwachung_linuxbasierter_Server&diff=29891Überwachung linuxbasierter Server2019-03-14T01:35:44Z<p>Curt: </p>
<hr />
<div>[[Datei:2019-03-13-serverueberwachung-1.jpg]]<br />
<br />
{{Baustelle}} <br />
<br />
In diesem Artikel wird im Sinne eines '''proof of concept''' die Möglichkeit der Überwachung vieler linuxbasierter Server auf ausstehende Updates, Plattenplatz usw. beschrieben. <br />
<br />
==Vorbemerkung==<br />
Es gibt bereits mehrere, recht ausgefeilte Lösungen zur Überwachung von Servern: Angefangen von Nagios <br />
bis hin zum Modul [[SYSMON]]. Dem soll keine weitere Lösung hinzugefügt werden, es geht in diesem Projekt '''nicht''' um die minutengenaue Überwachung von Serverparametern. Hier geht es um einen '''täglichen''' Status aller Server im Hausnetz. Dabei ist der Fokus gelegt auf minimale Belastung der zu überwachenden Server und des Netzes.<br />
<br />
==Begriffsbestimmung==<br />
In diesem Artikel ist "Server" das Gerät, auf dem FHEM läuft. Client/Clients sind Maschinen, die linuxbasiert (Debian, Ubuntu, Raspian) sind, beispielsweise kleine, leistungsschwache Raspberry Pi Zero. Obwohl auf diesen Clients ein Webserver erforderlich ist, installiert sein muss, werden sie der sprachlichen Klarheit wegen als "Client" benannt.<br />
<br />
==Installation==<br />
===Installation auf den Clients===<br />
...<br />
[[Webserver auf Raspberry]] <-- nein, das ist nicht die Lösung, das ist eine Vormerkung!<br />
...<br />
<br />
===Installation auf dem Server===<br />
...<br />
===fakultative Installation auf dem Server=== <br />
...<br />
<br />
==Danksagung==<br />
Bei der Umsetzung der Idee halfen -manchmal ohne es zu wissen- mehrere Teilnehmer des FHEM-Forums, denen der Primärautor des Beitrags für ihre uneigennützige, freundliche Hilfe zu Dank verpflichtet ist.</div>Curthttp://wiki.fhem.de/w/index.php?title=%C3%9Cberwachung_linuxbasierter_Server&diff=29890Überwachung linuxbasierter Server2019-03-14T01:35:17Z<p>Curt: /* Installation */</p>
<hr />
<div>[[Datei:2019-03-13-serverueberwachung-1.jpg]]<br />
<br />
{{Baustelle}} <br />
<br />
In diesem Artikel wird im Sinne eines '''proof of concept''' die Möglichkeit der Überwachung vieler linuxbasierter Server auf ausstehende Updates, Plattenplatz usw. beschrieben. <br />
<br />
==Vorbemerkung==<br />
Es gibt bereits mehrere, recht ausgefeilte Lösungen zur Überwachung von Servern: Angefangen von Nagios <br />
bis hin zum Modul [[SYSMON]]. Dem soll keine weitere Lösung hinzugefügt werden, es geht in diesem Projekt '''nicht''' um die minutengenaue Überwachung von Serverparametern. Hier geht es um einen '''täglichen''' Status aller Server im Hausnetz. Dabei ist der Fokus gelegt auf minimale Belastung der zu überwachenden Server und des Netzes.<br />
<br />
==Begriffsbestimmung==<br />
In diesem Artikel ist "Server" das Gerät, auf dem FHEM läuft. Client/Clients sind Maschinen, die linuxbasiert (Debian, Ubuntu, Raspian) sind, beispielsweise kleine, leistungsschwache Raspberry Pi Zero. Obwohl auf diesen Clients ein Webserver erforderlich ist, installiert sein muss, werden sie der sprachlichen Klarheit wegen als "Client" benannt.<br />
<br />
==Installation==<br />
===Installation auf den Clients==<br />
...<br />
[[Webserver auf Raspberry]] <-- nein, das ist nicht die Lösung, das ist eine Vormerkung!<br />
...<br />
<br />
===Installation auf dem Server===<br />
...<br />
===fakultative Installation auf dem Server=== <br />
...<br />
<br />
==Danksagung==<br />
Bei der Umsetzung der Idee halfen -manchmal ohne es zu wissen- mehrere Teilnehmer des FHEM-Forums, denen der Primärautor des Beitrags für ihre uneigennützige, freundliche Hilfe zu Dank verpflichtet ist.</div>Curt