Listings der Auflage 9
Wenn Sie die Beispiele im Buch selber nachvollziehen möchten, kann es hilfreich sein, die Listings nicht abtippen zu müsen. Deshalb möchte ich Ihnen den Service bieten, ausgewählte Listings von dieser Seite einfach in Ihre Zwischenablage kopieren zu können.
Kapitel 27
Listing 27.1: Welcher Netzwerkmanager ist aktiv?
sudo systemctl status NetworkManager.service
sudo systemctl status wicd.service
Listing 27.2: Beispiele für das Deaktivieren eines Netzwerkmanagers
sudo systemctl disable NetworkManager.service
sudo systemctl disable wicd.service
Listing 27.3: Beispiele für das Stoppen eines Netzwerkmanagers
sudo systemctl stop NetworkManager.service
sudo systemctl stop wicd.service
Listing 27.4: Statische IPv4-Konfiguration mit systemd.networkd
[Match]
Name=eth0
[Network]
DNS=192.168.1.1
[Address]
Address=192.168.1.2/24
[Route]
Gateway=192.168.1.1
Listing 27.5: Die Datei resolv.conf des systemd-resolved
sudo rm /etc/resolv.conf
sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
Listing 27.6: Der interne Netzwerkmanager des systemd wird aktiviert.
sudo systemctl enable systemd-networkd.service
sudo systemctl enable systemd-resolved.service
sudo systemctl start systemd-networkd.service
sudo systemctl start systemd-resolved.service
Listing 27.7: Der Status des neuen Netzwerkmanagers
sudo systemctl status systemd-networkd.service
sudo systemctl status systemd-resolved.service
Kapitel 40
Listing 40.1: Mit Hilfe einer Schleife durchsuchen Sie Ihr Subnetz.
for /L %i in (1,1,254) do @(ping -n 1 -w 20 192.168.1.%i|find ".%i: B")
Kapitel 42
Listing 42.1: Die Anbindung von Asterisk an Sipgate
type=peer
host=sipgate.de
outboundproxy=sipgate.de
nat=yes
port=5060
username=<Sipgate-ID>
fromuser=<Sipgate-ID>
secret=<SIP-Passwort>
fromdomain=sipgate.de
dtmfmode=rfc2833
insecure=port,invite
canreinvite=no
registertimeout=600
disallow=all
allow=alaw
allow=ulaw
Listing 42.2: Die Konfiguration für eingehende Anrufe
secret=<SIP-Passwort>
type=user
context=from-trunk
Kapitel 43
Listing 43.1: Authentifizierungsinformationen von Postfix
smtp_sasl_auth_enable = yes
smtp_sasl_security_options = noanonymous
smtp_sasl_password_maps = hash:/etc/postfix/smtp_auth
Listing 43.2: Die Fetchmail-Konfiguration für einen Benutzer.
set daemon 600
poll mail.hosteurope.de proto pop3 user "test" pass "geheim" is klaus fetchall
Listing 43.3: Eine Beispielkonfiguration in der Datei /etc/systemd/timesyncd.conf
[Time]
NTP=0.de.pool.ntp.org 1.de.pool.ntp.org 2.de.pool.ntp.org 3.de.pool.ntp.org
FallbackNTP=time1.google.com time2.google.com time3.google.com time4.google.com
Listing 43.4: Abschluss der Migration zum systemd-timesyncd
sudo systemctl stop {ntp.service,ntpd.service,chronyd.service}
sudo systemctl disable {ntp.service,ntpd.service,chronyd.service}
sudo systemctl enable systemd-timesyncd.service
sudo systemctl start systemd-timesyncd.service
Kapitel 44
Listing 44.1: Ein Webserver ist mit diesem Dockerfile schnell aufgesetzt.
FROM ubuntu:latest as base
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends lsb-core lsb-release apache2 && rm -rf /var/lib/apt/lists/*
RUN lsb_release -a
COPY content.html /var/www/html/
EXPOSE 80/tcp
CMD ["apachectl", "-D", "FOREGROUND"]
Listing 44.2: Ihr Image liegt im Docker Hub.
docker tag apache2 /apache2
docker push /apache2
Kapitel 50
Listing 50.1: Definition des CUL in FHEM
define CUL_0 CUL /dev/ttyACM0@9600 1234
Listing 50.2: Definition eines HMUARTLGW für HomeMatic in FHEM
define myHmUART HMUARTLGW /dev/ttyAMA0
attr myHmUART hmId <hmId>
Listing 50.3: Wetterdaten in FHEM
# Wetterdaten Bonn erfassen
define MeinWetter Weather API=OpenWeatherMapAPI,cachemaxage:600 apikey=<key> location=<Breitengengrad>,<Längengrad> interval=3600 lang=de
attr MeinWetter room Wettervorhersage
# Logfile aller Wetterdaten
define FileLog_MeinWetter FileLog ./log/meinwetter-%Y-%m.log MeinWetter
attr FileLog_MeinWetter logtype text
attr FileLog_MeinWetter room Wettervorhersage
# Wetter-Icons zur Weboberfläche hinzufügen
define weblink_meinwetter weblink htmlCode {WeatherAsHtml("MeinWetter")}
attr weblink_meinwetter room Wettervorhersage
Listing 50.4: Steuerung abhängig vom Wetter
define markise1_sonnenschein at *11:00:00 { if (( ReadingsVal('MeinWetter','temperature',0) > 15 ) && ( ReadingsVal('MeinWetter','cloudCover',0) < 50 )) { fhem('set markise1 ausfahren') }}
Listing 50.5: Logische Verknüpfung von Bedingungen
define markise1_sonnenschein at *{sunrise("HORIZON=25")} { if (( ReadingsVal('MeinWetter','fc1_high_c',0) > 20 ) && { if ( ReadingsVal('MeinWetter','fc1_cloudCover',0) < 50 )) { fhem('set markise1 ausfahren') }}
Listing 50.6: Es empfehlt sich, die Menge der Events zu begrenzen.
attr MeinWetter event-on-change-reading .*
Listing 50.7: Definition einer FRITZ!Box in FHEM
define fritz.box.ahahttp FBAHAHTTP fritz.box
attr fritz.box.ahahttp fritzbox-user <Benutzer>
Listing 50.8: Die Integration von KODI in FHEM per JSON-RPC
define libreelec KODI <IP-Adresse>
attr libreelec devStateIcon opened:rc_GREEN:on disconnected:rc_RED:off Initialized:message_socket_disabled
Listing 50.9: FHEM schickt Ihnen eine Nachricht über Ihr Media Center.
set libreelec msg 'FHEM' 'Es klingelt an der Haustür!' 8500 info
Listing 50.10: Das neue FHEMWEB lauscht auf Port 8086.
define WEBapi FHEMWEB 8086 global
attr WEBapi csrfToken <geheim>
define allowed_WEBapi allowed
attr allowed_WEBapi allowedCommands set,get
attr allowed_WEBapi validFor WEBapi
Listing 50.11: Let's Encrypt erzeugt ein Zertifikat für den Reverse Proxy.
$ sudo apt-get install git
$ cd /opt
$ sudo git clone https://github.com/certbot/certbot.git
$ cd certbot
$ ./letsencrypt-auto certonly -d <Domäne>
Listing 50.12: Die Reverse-Proxy-Konfiguration
<IfModule mod_ssl.c>
<VirtualHost *:443>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
ServerName <Domäne>
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/<Domäne>/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/<Domäne>/privkey.pem
ProxyRequests Off
ProxyVia Off
ProxyPreserveHost On
<Location /api>
ProxyPass http://localhost:8086/fhem
ProxyPassReverse http://localhost:8086/fhem
AuthUserFile /etc/htpasswd.fhemapi
</Location>
<Proxy *>
Order deny,allow
Allow from all
AuthType Basic
AuthName "Bitte Passwort eingeben"
Require valid-user
</Proxy>
</VirtualHost>
</IfModule>
Listing 50.13: Jede Woche werden abgelaufene Zertifikate erneuert.
#!/bin/sh
/opt/certbot/letsencrypt-auto renew
systemctl restart apache2
Kapitel 51
Listing 51.1: Standardattribute von FHEM
attr global userattr devStateIcon devStateStyle icon setList sortby webCmd widgetOverride
Listing 51.2: Eine FS20-Funktionsgruppe für Dimmer
define fg_dimmer FS20 12341234 4412
attr fg_dimmer IODev CUL_0
attr fg_dimmer eventMap on:ein off:aus
attr fg_dimmer webCmd aus:ein
Listing 51.3: Ein globaler und ein lokaler FS20-Master
# globaler Master für das ganze Haus
define gm_haus FS20 12341234 4444
attr gm_haus IODev CUL_0
attr gm_haus eventMap on:ein off:aus
attr gm_haus webCmd ein:aus
# lokaler Master für die Terrasse
define lm_terrasse FS20 12341234 1144
attr lm_terrasse IODev CUL_0
attr lm_terrasse eventMap on:ein off:aus
attr lm_terrasse webCmd ein:aus
attr lm_terrasse room terrasse
Listing 51.4: Die Definition eines FS20-RSU
define markise1 FS20 12341234 1111 lm 1144 gm 4444
attr markise1 IODev CUL_0
attr markise1 devStateIcon einfahren:awning.off ausfahren:awning
attr markise1 eventMap on:ausfahren off:einfahren
attr markise1 icon icoMarkise.png
attr markise1 model fs20rsu
attr markise1 room Terrasse
Listing 51.5: Steuerung nach Astrozeit
define markise1_sonnenuntergang at *{sunset(0,"19:30","21:00")} set markise1 einfahren
Listing 51.6: Steuerung nach Sonnenwinkel
define markise1_sonnenuntergang at *{sunset("HORIZON=15")} set markise1 einfahren
Listing 51.7: Die Definition eines FS20-Dimmers
define ddimmer1 FS20 12341234 1112 fg 4412 lm 1144 gm 4444
attr ddimmer1 IODev CUL_0
attr ddimmer1 eventMap on:ein off:aus
attr ddimmer1 model fs20di
Listing 51.8: Die Definition eines Dummys
define dimmer1 dummy
attr dimmer1 eventMap on:ein off:aus
attr dimmer1 group Licht
attr dimmer1 icon icoDimmer.png
attr dimmer1 room Terrasse
attr dimmer1 setList dim:slider,25,6.25,100
attr dimmer1 webCmd ein:aus:dim
define dd1_d1_dim notify dimmer1 set ddimmer1 $EVENT
Listing 51.9: Ein Event löst ein anderes Event aus.
define d1_m1_ein notify dimmer1:ein set markise1 einfahren
define m1_d1 notify markise1:ausfahren set dimmer1 aus
Listing 51.10: Filtern von Events mit Regular Expressions
define d1_m1_dim notify dimmer1:dim.* set markise1 einfahren
Listing 51.11: Definition eines FS20-Schalters
define sender_kanal1 FS20 43214321 1311
attr sender_kanal1 IODev CUL_0
attr sender_kanal1 room FS20
define sender_kanal2 FS20 43214321 1312
attr sender_kanal2 IODev CUL_0
attr sender_kanal2 room FS20
define sk1_m1 notify sender_kanal1 set markise1 $EVENT
define sk1_d1 notify sender_kanal2 set dimmer1 $EVENT
Kapitel 52
Listing 52.1: Definition eines HMLAN für HomeMatic in FHEM
define HM_CFG_USB_2 HMLAN <IP-Adresse>:<Port>
attr HM_CFG_USB_2 hmId
attr HM_CFG_USB_2 hmLanQlen 1_min
attr HM_CFG_USB_2 loadLevel 0:low,40:batchLevel,90:high,99:suspended
Listing 52.2: Definition des Moduls HMInfo in FHEM
define hm HMinfo
Listing 52.3: Definition einer VCCU für HomeMatic in FHEM
define VCCU CUL_HM
attr VCCU IOList HM_CFG_USB_2,myHmUART
attr VCCU model CCU-FHEM
attr VCCU subType virtual
attr VCCU webCmd virtual:update
Listing 52.4: Das Modul Twilight steuert den Garagentorantrieb.
define garage_zu at *{twilight("myTL","ss_civil","19:00","22:00")} set sgaragentor on-for-timer 1
Listing 52.5: Ein Dummy für den Status des Feuermelders
define Brand dummy
attr Brand webCmd ja:nein
Listing 52.6: Der Dummy kennt nur "Brand ja" und "Brand nein".
define fire_c notify Ei413_Sw_02_Relais:.*contact:.closed.* set Brand ja
define fire_o notify Ei413_Sw_02_Relais:.*contact:.open.* set Brand nein
Listing 52.7: FHEM schreibt alle Mitglieder der Telegram-Gruppe "Haus" an.
define fire DOIF ([Brand] eq "ja") ( set telegram message @#Haus Ei413 meldet Brand. ) DOELSEIF ([Brand] eq "nein") ( set telegram message @#Haus Ei413 meldet keinen Brand mehr. )
Kapitel 53
Listing 53.1: WLAN-Konfiguration auf der Konsole von Tasmota
backlog ssid1 <WLAN-SSID>; password1 <WLAN-Key>
Listing 53.2: IP-Konfiguration auf der Konsole von Tasmota
savedata 1
ipaddress1 <IP des ESP8266>
ipaddress2 <Standardgateway>
ipaddress3 <Subnetzmaske>
ipaddress4 <DNS-Server>
savedata 0
restart 1
Listing 53.3: Das Modul MQTT2_SERVER macht FHEM zum Broker.
define MQTT2_FHEM_Server MQTT2_SERVER 1883 global
attr MQTT2_FHEM_Server autocreate simple
Listing 53.4: Der Modus steuert das Verhalten des Switches.
savedata 1
switchmode1 2
savedata 0
Listing 53.5: Die Statusanzeige der Geräte wird definiert.
set attrTemplate tasmota_set_lowercase_texts_and_state1
Listing 53.6: Die Statusanzeige der Geräte wird definiert.
attr tasmota001 stateFormat T: AM2301_Temperature°C, H: AM2301_Humidity%rH
attr tasmota002 stateFormat POWER1
Listing 53.7: FHEM steuert Tasmota über MQTT.
attr tasmota001 webCmd on:off
attr tasmota001 setList on cmnd/tasmota001/POWER on
off cmnd/tasmota001/POWER off
Listing 53.8: Die Telegram-Gruppe "FHEM" wird informiert.
define df_LWT_tasmota002 DOIF ([tasmota002:LWT] eq "Offline") (set telegram message @#FHEM DEAD device: tasmota_002) DOELSEIF ([tasmota002:LWT] eq "Online") (set telegram message @#FHEM ALIVE device: tasmota_002)
Listing 53.9: Der DHT22-Sensor wird überwacht.
define df_dht22_tasmota001 DOIF (([+00:15:00]) and (([tasmota001:AM2301_Temperature:sec] > 1800) or ([tasmota001:AM2301_Humidity:sec] > 1800))) ({Log 1, "tasmota001: DHT22: Offline ... Restart"}, set tasmota001 off, sleep 1, set tasmota001 on)
Listing 53.10: Die Taupunktberechnung mit FHEM
define Taupunkt dewpoint .*
attr Taupunkt absoluteHumidity absoluteHumidity
Listing 53.11: Readings können gespiegelt werden.
attr Taupunkt userReadings temperature { ReadingsVal("tasmota001","AM2301_Temperature",0) }, humidity { ReadingsVal("tasmota001","AM2301_Humidity",0) }
Listing 53.12: Nur die Messwerte und LWT sind von Interesse.
set FileLog_tasmota001 addRegexpPart tasmota001 AM2301_Temperature:.*
set FileLog_tasmota001 addRegexpPart tasmota001 AM2301_Humidity:.*
set FileLog_tasmota001 addRegexpPart tasmota001 AM2301_dewpoint:.*
set FileLog_tasmota001 addRegexpPart tasmota001 AM2301_absoluteHumidity:.*
set FileLog_tasmota001 addRegexpPart tasmota001 LWT:.*
Listing 53.13: Die Überschrift kann u.\gphs a. Höchst- und Tiefstwerte enthalten.
attr SVG_FileLog_tasmota001 label "Temperatur Min $data{min1}, Max $data{max1}, Last $data{currval1} und Taupunkt Min $data{min2}, Max $data{max2}, Last $data{currval2}"
Kapitel 54
Listing 54.1: Herkömmliche IP-Konfiguration von Raspberry Pi OS
iface eth0 inet static
address 192.168.1.100 # Ihre IP-Adresse
netmask 255.255.255.0 # Ihre Netzwerkmaske
gateway 192.168.1.1 # Ihr Router
Listing 54.2: Aktuelle IP-Konfiguration von Raspberry Pi OS
interface enxb827eb77834d
static ip_address=192.168.1.100/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1
Listing 54.3: WLAN-Konfiguration von Raspberry Pi OS
country=DE
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="<WLAN-SSID>"
psk="<WLAN-PASSWORT>"
key_mgmt=WPA-PSK
}
Kapitel 55
Listing 55.1: MPEG-2- und VC-1-Lizenzschlüssel
##############################################
# License keys to enable GPU hardware decoding
decode_MPG2=0x61b4f3d9
decode_WVC1=0x3caeb48b
Listing 55.2: Definition einer Bridge auf dem Raspberry Pi
auto br0
iface br0 inet static
address 192.168.1.1
netmask 255.255.255.0
bridge_fd 1
bridge_hello 3
bridge_Maxage 10
bridge_stp off
bridge_ports eth0 wlan0
allow hotplug eth0
iface eth0 inet manual
allow-hotplug wlan0
iface wlan0 inet manual
Listing 55.3: Der hostapd baut einen 2,4-GHz-WLAN-Access-Point auf.
interface=wlan0
bridge=br0
driver=nl80211
macaddr_acl=0
ssid=mitohnekabel
hw_mode=g
ieee80211n=1
channel=1
country_code=DE
wpa=2
wpa_passphrase=ganz_geheim
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
rsn_pairwise=CCMP
beacon_int=100
auth_algs=1
wmm_enabled=1
ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]
Listing 55.4: Der Stick wird von usb_modeswitch in den Modemmodus versetzt.
# Huawei e3372s (Fallback-Modus)
TargetVendor= 0x12d1
TargetProduct= 0x155f
MessageContent="55534243123456780000000000000011063000000100010000000000000000"
Listing 55.5: UMTSkeeper mit Optionen
/usr/local/umtskeeper/umtskeeper --sakisoperators "USBINTERFACE='0' OTHER='USBMODEM' USBMODEM='12d1:155e' SIM_PIN='1234' APN='CUSTOM_APN' CUSTOM_APN='internet.t-mobile' APN_USER='t-mobile' APN_PASS='tm'" --sakisswitches "--sudo --console" --devicename 'Huawei' --log --silent --nat 'no' --httpserver &>> /var/log/umtskeeper_error.log &
Listing 55.6: Die Konfiguration der NAT-Firewall
IPT=/sbin/iptables
LOCAL_IFACE=br0
INET_IFACE=ppp0
# aufräumen
$IPT -F INPUT
$IPT -F OUTPUT
$IPT -F FORWARD
$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
$IPT -t nat -P OUTPUT ACCEPT
# forwarding
$IPT -A FORWARD -p ALL -i $LOCAL_IFACE -j ACCEPT
$IPT -A FORWARD -i $INET_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
# masquerading
$IPT -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE
Listing 55.7: Die DHCP-Konfiguration
interface=br0
dhcp-range=192.168.1.100,192.168.1.199,255.255.255.0,24h
Listing 55.8: Das Ausgabegerät des MPD
audio_output {
type "alsa"
name "My ALSA Device"
device "hw:1,0" # optional
}
Listing 55.9: Die Konfiguration der Fernbedienung mit lirc
## irexec
begin
prog = irexec
button = KEY_PREVIOUS
config = /usr/bin/mpc volume -2
repeat = 0
end
begin
prog = irexec
button = KEY_FORWARD
config = /usr/bin/mpc volume +2
repeat = 0
end
begin
prog = irexec
button = KEY_CHANNELUP
config = /usr/bin/mpc stop
repeat = 0
end
begin
prog = irexec
button = KEY_CHANNELDOWN
config = /usr/bin/mpc play
repeat = 0
end
begin
prog = irexec
button = KEY_NUMERIC_1
config = /usr/bin/mpc play 1
repeat = 0
end
begin
prog = irexec
button = KEY_NUMERIC_2
config = /usr/bin/mpc play 2
repeat = 0
end
begin
prog = irexec
button = KEY_NUMERIC_3
config = /usr/bin/mpc play 3
repeat = 0
end
Listing 55.10: Die Anbindung eines Kalenders aus dem Internet an FHEM
define Ferien_NRW Calendar ical url https://calendar.google.com/calendar/ical /u5pdgv2fih5utqhlnps9ag96jqemk3ru%40import.calendar.google.com /public/basic.ics 86400
attr Ferien_NRW room Kalender
Listing 55.11: Definition eines Dummys für die Schulferien
define Schulferien dummy
attr Schulferien room Kalender
attr Schulferien webCmd ja:nein
define Ferienanfang notify Ferien_NRW:start:.* set Schulferien ja
define Ferienende notify Ferien_NRW:end:.* set Schulferien nein
Listing 55.12: Überblick über die nächsten Schaltzeiten in FHEM
define SchaltzeitenWeblink weblink htmlCode { CalendarAsHtml("Schaltzeiten","next 3") }
attr SchaltzeitenWeblink room Kalender
Listing 55.13: Ein Kalender steuert Aktoren in FHEM.
define dummy_an notify Schaltzeiten:start:.* {my $reading = "$EVTPART0" ;; my $uid = "$EVTPART1" ;; my $actor = fhem('get Schaltzeiten events filter:uid=="'.$uid.'" format:custom="$S" limit:count=1') ;; if(defined $actor) { fhem("set $actor on") } }
define dummy_aus notify Schaltzeiten:end:.* {my $reading = "$EVTPART0" ;; my $uid = "$EVTPART1" ;; my $actor = fhem('get Schaltzeiten events filter:uid=="'.$uid.'" format:custom="$S" limit:count=1') ;; if(defined $actor) { fhem("set $actor off") } }
Listing 55.14: Die Definition eines Dummys für den Wecker
define Wecken dummy
attr Wecken eventMap on:ja off:nein
attr Wecken room Julia
attr Wecken webCmd ja:nein
Listing 55.15: Das Kommando DOIF hält den jeweiligen Status fest.
define Klingeln DOIF ([Wecken] eq "ja") and ([Schulferien] eq "nein") ( set Radio play ) DOELSEIF ([Wecken] eq "nein") ( set Radio stop )
Listing 55.16: Ein Skript führt das inkrementelle Backup aus.
HEUTE=$(date -I)
perl /opt/fhem/fhem.pl 7072 "set FBDECT_nas on"
sleep 600
ssh pi@ <IP-Raspberry NAS< EOF
rsync -xahP --delete --link-dest=/mnt/raid1/backupdir/latest -e '/usr/bin/ssh -i /home/pi/.ssh/id_rsa' <Benutzer>@<NAS>:/ /mnt/raid1/backupdir/${HEUTE}
if [ -d /mnt/raid1/backupdir/latest ]
then
rm -r /mnt/raid1/backupdir/latest
fi
ln -s /mnt/raid1/backupdir/${HEUTE} /mnt/raid1/backupdir/latest
sudo /sbin/shutdown -h 0
EOF
sleep 300
perl /opt/fhem/fhem.pl 7072 "set FBDECT_nas off"
Listing 55.17: FHEM startet das Backup morgens um 4 Uhr.
define backup at *04:00:00 { system('/home/pi/rsync_nas.sh &') }