Listings der Auflage 8
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 38
Listing 38.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 40
Listing 40.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 40.2: Die Konfiguration für eigehende Anrufe
secret=<SIP-Passwort>
type=user
context=from-trunk
Kapitel 41
Listing 41.1: Authentifizierungsinformationen des Postfix.
smtp_sasl_auth_enable = yes
smtp_sasl_security_options = noanonymous
smtp_sasl_password_maps = hash:/etc/postfix/smtp_auth
Listing 41.2: Die Fetchmail-Konfiguration für einen Benutzer.
set daemon 600
poll mail.hosteurope.de proto pop3 user "test" pass "geheim" is klaus fetchall
Kapitel 46
Listing 46.1: Standardattribute von FHEM.
attr global userattr devStateIcon devStateStyle icon setList sortby webCmd widgetOverride
Listing 46.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 46.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 46.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 46.5: Steuerung nach Astrozeit.
define markise1_sonnenuntergang at *{sunset(0,"19:30","21:00")} set markise1 einfahren
Listing 46.6: Steuerung nach Sonnenwinkel.
define markise1_sonnenuntergang at *{sunset("HORIZON=15")} set markise1 einfahren
Listing 46.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 46.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 46.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 46.10: Filtern von Events mit Regular Expressions.
define d1_m1_dim notify dimmer1:dim.* set markise1 einfahren
Listing 46.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
Listing 46.12: Definition von eines HMLAN für HomeMatic in FHEM.
define HM_CFG_USB_2 HMLAN :
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 46.13: Definition des Modules HMInfo in FHEM.
define hm HMinfo
Listing 46.14: 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 46.15: 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 46.16: Ein Dummy für den Status des Feuermelders
define Brand dummy
attr Brand webCmd ja:nein
Listing 46.17: 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 46.18: 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. )
Listing 46.19: Wetterdaten in FHEM
# Wetterdaten Bonn erfassen
define MeinWetter Weather 640161 3600 de
attr MeinWetter room Wettervorhersage
# Logfile alle Wetter Daten
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 hinzufuegen
define weblink_meinwetter weblink htmlCode {WeatherAsHtml("MeinWetter")}
attr weblink_meinwetter room Wettervorhersage
Nach der Drucklegung des Buches wurde die Yahoo-Wetter-Schnittstelle verändert. Infos zu einer möglichen Ersatzlösung finden Sie hier.
Listing 46.20: Steuerung abhängig vom Wetter.
define markise1_sonnenschein at *11:00:00 { if (( ReadingsVal('MeinWetter','temperature',0) > 15 ) && (( ReadingsVal('MeinWetter','condition',0) eq "sonnig" )) || ReadingsVal('MeinWetter','condition',0) eq "teilweise wolkig") { fhem('set markise1 ausfahren') }}
Listing 46.21: Logische Verknüpfung von Bedingungen.
define markise1_sonnenschein at *{sunrise("HORIZON=25")} { if (( ReadingsVal('MeinWetter','fc1_high_c',0) > 20 ) && { if ( ReadingsVal('MeinWetter','fc1_condition',0) =~ /sonnig|heiter|teilweise wolkig/ ) { fhem('set markise1 ausfahren') }}
Listing 46.22: Definition einer Fritz!Box in FHEM.
define fritz.box.aha FBAHA fritz.box:2002
Listing 46.23: Das neue FHEMWEB lauscht auf Port 8086
define WEBapi FHEMWEB 8086 global
attr WEBapi csrfToken
define allowed_WEBapi allowed
attr allowed_WEBapi allowedCommands set,get
attr allowed_WEBapi validFor WEBapi
Listing 46.24: Let's Encrypt erzeugt ein Zertifikat für den Reverse Proxy.
$ sudo apt-get install git
$ cd /opt
$ sudo git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrypt
$ ./letsencrypt-auto certonly -d <Domäne>
Listing 46.25: 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 46.26: Jede Woche werden abgelaufene Zertifikate erneuert.
#!/bin/sh
/opt/letsencrypt/letsencrypt-auto renew
service apache2 restart
Kapitel 47
Listing 47.1: Herkömmliche IP-Konfiguration von Raspbian
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 47.2: Aktuelle IP-Konfiguration von Raspbian
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 47.3: WLAN-Konfiguration von Raspbian
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
}
Listing 47.4: Übertaktung eines Raspberry Pi B+ auf 800 MHz
##############################################
# Overclocking settings
arm_freq=800
core_freq=333
sdram_freq=450
gpu_freq=300
Listing 47.5: MPEG-2 und VC-1 Lizenzschlüssel
##############################################
# License keys to enable GPU hardware decoding
decode_MPG2=0x61b4f3d9
decode_WVC1=0x3caeb48b
Listing 47.6: Definition einer Bridge auf dem Raspberry Pi.
auto lo
auto br0
iface lo inet loopback
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 47.7: 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 47.8: UMTSkeeper mit Optionen.
/usr/local/umtskeeper/umtskeeper --sakisoperators "USBINTERFACE='0' OTHER='USBMODEM' USBMODEM='12d1:1001' SIM_PIN='1234' APN='CUSTOM_APN' CUSTOM_APN='internet.eplus.de' APN_USER='eplus' APN_PASS='internet'" --sakisswitches "--sudo --console" --devicename 'Huawei' --log --silent --nat 'no' --httpserver &>> /var/log/umtskeeper_error.log &
Listing 47.9: 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 47.10: Die DHCP-Konfiguration.
interface=br0
dhcp-range=192.168.1.100,192.168.1.199,255.255.255.0,24h
Listing 47.11: Definition des CUL in FHEM.
define CUL_0 CUL /dev/ttyACM0@9600 1234
Listing 47.12: Definition eines HMUARTLGW für HomeMatic in FHEM
define myHmUART HMUARTLGW /dev/ttyAMA0
attr myHmUART hmId
Listing 47.13: Das Ausgabegerät des MPD.
audio_output {
type "alsa"
name "My ALSA Device"
device "hw:0,0" # optional
}
Listing 47.14: 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 47.15: Die Anbindung eines Calenders 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
attr Ferien_NRW room Kalender
Listing 47.16: 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 47.17: Überblick über die nächsten Schaltzeiten in FHEM.
define SchaltzeitenWeblink weblink htmlCode { CalendarAsHtml("Schaltzeiten","next 3") }
attr SchaltzeitenWeblink room Kalender
Listing 47.18: Ein Kalender steuert Aktoren in FHEM.
define dummy_an notify Schaltzeiten:start:.* {my $reading = "$EVTPART0" ;; my $uid = "$EVTPART1" ;; my $actor = fhem("get Schaltzeiten summary $uid 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 summary $uid 1") ;; if(defined $actor) { fhem("set $actor off") } }
Listing 47.19: 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 47.20: 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 47.21: Ein Script 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>:/<Verzeichnis> /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 47.22: FHEM startet das Backup morgens um 4 Uhr.
define backup at *04:00:00 { system('/home/pi/rsync_nas.sh &') }