Benutzer-Werkzeuge

Webseiten-Werkzeuge


linux:fhem:allgemeines

FHEM - Allgemeines

FHEMWEB

Synataxhighlighting

attr <FHEMWEB> JavaScripts codemirror/fhem_codemirror.js

Update

Alle installierten Module auf den neuesten Stand bringen:

update

Anzeigen aller zu aktualisierenden Dateien

update check

Update erzwingen (bei Problemen)

update force

Nur einzelne Datei updaten

update <datei>

Auf Entwicklerstand updaten

update development

Anschließend muss fhem mit

shutdown restart

neu gestartet werden.

Backup & restore

Backup

:!: Muss evtl. überarbeitet werden: http://www.fhemwiki.de/w/index.php?title=Backup&diff=14881&oldid=9794

1. Zum manuelles Ausführen eines Backups genügt es in der Eingabezeile

backup

zu setzen.Im Auslieferungszustand ist das Backup dann unter

.backup

zu finden.

2. Automatisiert

!Ausstehend!

Restore

Zum Restore wird das Backup einfach im Ordner /opt/fhem entpackt. Vorher fhem beenden:

service fhem stop

Mindestens bei einem Systemumzug müssen die Rechte neu gesetzt werden:

chmod -R a+w fhem
usermod -a -G tty pi
usermod -a -G tty fhem

Fundstück:

chown -R fhem:dialout fhem

Und am Ende wieder fhem starten:

service fhem start.

fhem.cfg im Webfrontend bearbeiten

attr WEB editConfig 1

Devices mit Zentrale pairen

In fhem

set <CUL> hmPairForSec 600

<CUL> ist bei mir „hmusb“

Anschließend das Device „Anlernen“

Pair löschen:

set <Name HM-Gerät> unpair

Gerät löschen

delete <Name>

Gerät umbennen

rename <alter Name> <neuer Name>

Dabei werden jedoch keine Kanäle umbenannt und behalten daher den alten Namen. Abhilfe schafft deviceRename.

set <alter Name> deviceRename <neuer Name>

Nur sendende Sensoren müssen hierfür ggfs. anschließend in den Anlern-Modus gebracht werden.

alias

Mit alias ist es möglich, Geräten sprechende Namen zu geben. Bspw. kann dadurch die Lesbarkeit im Frontend verbessert werden:

attr <Gerät> alias <sprechender Name>

group

Mit group lassen sich thematisch zusammengehörige Elemente auch im Frontend zusammenfassen. Standardmäßig sortiert FHEM alle Geräte etc. alphabetisch unter speziellen Namen, z.B. „three state sensor“. Mit Group könnte man eine Gruppe „Türen & Fenster“ einführen, unter der alle zugehörigen Geräte eines Raumes zu finden sind:

attr <Gerät> Group <Group-Name>

Räume

Anlegen

attr <gerätename> room <Raumname>

Sortieren

attr WEB sortRooms EG OG DG Garten

Mit Icons versehen

attr WEB roomIcons EG:control_building_modern_s_oks_eg \
                 OG:control_building_modern_s_oks_og \
                 DG:control_building_modern_s_oks_dg \
                 Garten:control_building_outside

Kanal peeren

Allgemeines Kapitel, Pairen von HM-CC-RT-DN unter s.u. im Kapitel des Devices.

Die Syntax des Befehls zum Peering ist

set <sensChan> peerChan 0 <actChan> [single|dual] [set|unset]

wobei „<sensChan>“ der Name des Sensorkanals und „<actChan>“ der Name des Aktorkanals ist.

Mit dem Schlüsselwort „single“ wird dafür gesorgt, dass genau dieser Sensorkanal gepeert wird. Mit dem Schlüsselwort „dual“ wird dafür gesorgt, dass zwei zusammengehörende Sensorkanäle mit dem Aktorkanal verknüpft werden, wo sie dann unterschiedliche Aktionen auslösen (z.B. on/off). Das Schlüsselwort „set“ setzt das Peering, das Schlüsselwort „unset“ hebt es wieder auf. Das Kommando unterliegt den allgemeinen Regeln. Es wirkt auf zwei Geräte gleichzeitig, beide sollten deshalb beobachtet werden, bei beiden muss ggf. die Anlerntaste gedrückt werden.

Für das Peering von IO-Devices lautet die Syntax

set <actChan> peerIODev <IO> <chan> [set|unset]

wobei <IO> der Namen des IO-Device ist und <chan> die Nummer des virtuellen Kanals. Kanäle von 1 bis 50 sind zulässig.

Watchdog

Für FHEM selbst

# modprobe bcm2708_wdog
# echo "bcm2708_wdog" | tee -a /etc/modules

Das device kontrollieren:

# ls -al /dev/watchdog

Das watchdog device funktioniert so, dass es nach dem erstmaligen Öffnen und Beschreiben alle 60 Sekunden beschrieben werden möchte. Bleibt dieses Beschreiben für 60 Sekunden aus, wird ein Reboot ausgelöst.

Zum Test das device öffnen und mit Enter erstmalig beschreiben:

# cat > /dev/watchdog

Nach 60 Sekunden sollte der Neustart erfolgen.

Nun muss der Daemon installiert werden

# apt-get install watchdog.conf

In /etc/watchdog müssen folgende zwei Zeilen aktiviert werden:

watchdog-device        = /dev/watchdog
max-load-1             = 24

Nun muss fhem noch gezwungen werden, „Lebenszeichen“ zu senden (fhem.cfg):

# save current state every 15 minutes
define at_FHEM.save at +*00:15:00 {WriteStatefile}

Diese Datei wird in der watchdog.conf hinterlegt und alle 30 Minuten überprüft

file = /opt/fhem/log/FHEM.save

change = 1800

Abschließend muss der watchdog noch gestartet werden, ggfs. muss er auch dem passenden Run-Level hinzugefügt gwerden.

# /etc/init.d/watchdog start
# update-rc.d watchdog defaults

Innerhalb FHEM

Mit dieser Funktion können Vorfälle überprüft und ggf. Aktionen eingeleitet werden, wenn z.B. ein Fenster länger als einen bestimmten Zeitraum offen steht oder sich ein Gerät seit über einen definierten Zeitraum nicht meldet. Watchdog ist also immer dann relevant, wenn nach Eintreten eines bestimmten Ereignisses nach einer bestimmten Zeitspanne geprüft werden soll, ob dasselbe oder ein anderes event (nicht) erneut eingetreten ist.

Siehe http://fhem.de/commandref.html#watchdog

Plots aus log-Datei erzeugen

Log-Dateien werden entweder bei autocreate erzeugt oder manuell angelegt. Diese werden im Navigationsbaum unter dem CUL angezeigt.

Möglichkeit 1:

Um bei einer automatisch erzeugten Logdatei neben text auch z.B. einen Temperatur-Plot anzeigen zu lassen, muss

attr logtype temp4:Plot,text

gesetzt werden. Dann wird das template „temp4“ unter www/gplot verwendet. Es können auch eigene Templates verwendet werden.

In der FileLog-Details kann auf „Create SVG Plot“ geklickt werden, es wird ein neues weblink erstellt mit eigener .gplot Datei, und man landet in der passenden Detail-Ansicht.

Möglichkeit 2:

Plot-„Device“ erstellen:

define <NamePlot> SVG <Logdatei>:<template>:CURRENT
define plotThermostatVZ SVG FileLog_HK_VZ_tr:thermostat:CURRENT

Das Template kann bspw. temp4 sein oder ein eigen erstelltes.

Dabei ist „thermostat“ das zu verwendende Template, „FileLog_HK_VZ_tr“ die zu plottende Logdatei. plotThermostatVZ bezeichnet den Namen des Plots.

Anmerkungen:

  • nicht alle .gplot Features sind in dem Editor setzbar, insb. werden Linien ohne Label nicht angelegt bzw. geloescht.
  • bei Fragen kann einem http://fhem.de/commandref.html#gnuplot-syntax weiterhelfen.
  • man kann keine Linien anlegen, wenn die passenden Daten dazu nicht in der letzten 64k der Logdatei (etwa 1000 Zeilen) vorkommen.
  • die .gplot Regexps werden direkt aus der Logdatei extrahiert, um diese per Dropdown anbieten zu koennen. Beim modifizieren existierender weblinks muss man vermutlich alle regexps neu aussuchen und setzen.
  • Außerhalb des Editors lassen sich z.B. auch mehr als 2 y-Achsen definieren!

24 h anstatt Tag

attr WEB endPlotNow 1
attr WEBphone endPlotNow 1
attr WEBtablet endPlotNow 1
...

Löschen bzw. zurücksetzen mit „0“.

Batterieüberwachung

define ZE.Batterie readingsGroup .*:[Bb]attery\
.*:[Bb]atteryLevel
# keine Zeitstempel anzeigen
attr ZE.Batterie notime 1
attr ZE.Batterie room Zentrale
attr ZE.Batterie valueFormat {return "0" if( $VALUE eq "low" );; return "100" if( $VALUE eq "ok" );; return "25" if( $VALUE < 2.1 );; return "50" if( $VALUE < 2.3 );; return "75" if( $VALUE < 2.5 );; return "100"}
attr ZE.Batterie valueIcon {'battery.0' => 'measure_battery_0@red','battery.100' => 'measure_battery_100@green','Battery.0' => 'measure_battery_0@red','Battery.100' => 'measure_battery_100@green','batteryLevel.0' => 'measure_battery_0@red','batteryLevel.25' => 'measure_battery_25@red','batteryLevel.50' => 'measure_battery_50@orange','batteryLevel.75' => 'measure_battery_75@green','batteryLevel.100' => 'measure_battery_100@green'}
define ZE.Batterie readingsGroup .*:[Bb]attery
attr ZE.Batterie notime 1
attr ZE.Batterie room Zentrale
attr ZE.Batterie valueFormat {return "0" if( $VALUE eq "low" );; return "100" if( $VALUE eq "ok" );; return "25" if( $VALUE < 2.1 );; return "50" if( $VALUE < 2.3 );; return "75" if( $VALUE < 2.5 );; return "100"}
attr ZE.Batterie valueIcon {'battery.0' => 'measure_battery_0@red','battery.100' => 'measure_battery_100@green','Battery.0' => 'measure_battery_0@red','Battery.100' => 'measure_battery_100@green'}

Bei HM-CC-RT-DN muss evtl. http://www.fhemwiki.de/wiki/Batterie%C3%BCberwachung beachtet werden.

Eigene Menü-Einträge hinzufügen

attr WEB menuEntries restart,cmd=shutdown+restart,update,cmd=update,updatecheck,cmd=update+check

E-Mail

Zunächst muss ein „E-Mail-Programm“ installiert werden:

# apt-get install sendEmail

in der 99_myUtils.pm (ggfs. das Template als diese zunächst abspeichern) muss anschließend folgende Unterroutine eingefügt werden:

######## DebianMail  Mail auf dem RPi versenden ############ 
sub 
DebianMail 
{ 
 my $rcpt = shift;
 my $subject = shift; 
 my $text = shift;
 my $attach = shift; 
 my $ret = "";
 my $sender = "absender\@account.de"; 
 my $konto = "kontoname\@account.de";
 my $passwrd = "passwrd";
 my $provider = "smtp.googlemail.com:587";
 Log 1, "sendEmail RCP: $rcpt";
 Log 1, "sendEmail Subject: $subject";
 Log 1, "sendEmail Text: $text";
 Log 1, "sendEmail Anhang: $attach";
 
 $ret .= qx(sendEmail -f '$sender' -t '$rcpt' -u '$subject' -m '$text' -a '$attach' -s '$provider' -xu '$konto' -xp '$passwrd' -o tls=auto -o message-charset=utf-8);
 $ret =~ s,[\r\n]*,,g;    # remove CR from return-string 
 Log 1, "sendEmail returned: $ret"; 
}

Um die TLS Verschlüsselung (ehem. SSL) zu nutzen, muss in der 4. letzten Zeile tls=auto anstatt tls=noverwendet werden.

Für direkten Mail-Versand, z.B.

sendEmail -f 'absender@account.de' -t 'Ziel@Adresse.de' -u 'Betreffzeile' -m 'Test-Nachricht' -s 'E-Mail-Anbieter' -xu 'kontoname@account.de' -xp 'passwort' -o tls=no

Für Google muss evtl. der Zugriff von weniger sicheren Apps gestattet werden: https://www.google.com/settings/security/lesssecureapps

siehe auch http://forum.fhem.de/index.php?topic=16470.0

IPV6

Normalerweise wird das Frontend folgendermaßen definiert:

define <name> FHEMWEB <tcp-portnr> [global] 
define WEB FHEMWEB 8083 global

Für IPV6 ist neben dem Modul IO::Socket:INET6 auch „IPV6:<number>“ notwendig:

# apt-get install libio-socket-inet6-perl
define WEB FHEMWEB IPV6:8083 global

Webzugriff absichern

Zuerst wird ein Benutzername mit Passwort in base64 codiert:

echo -n benutzername:passwort | base64

Das <Ergebnis> wird anschließend zur Sicherung des Zugriffs verwendet:

attr WEB basicAuth <Ergebnis>
attr WEBphone basicAuth <Ergebnis>
attr WEBtablet basicAuth <Ergebnis>

Geo-Location

attr global latitude 53.27619
attr global longitude 8.61315

(2 Beispielwerte!)

Sonnenauf- und untergang

Dafür stehen die Funktionen sunrise() und sunset() zur Verfügung.

Parameter: [„CIVIL“], offset[s], min[„hh:mm“], max[„hh:mm“]

  • Der Parameter „CIVIL“ bedeutet, dass bis bzw. ab hier Lesen ohne zusätzliche Beleuchtung möglich ist (ca. -6°).
  • Die Alternative „NAUTIC“ bedeutet, dass auf See der Horizont noch zu erkennen ist (ca. -12°)
  • „ASTRONOMIC“ bedeutet, dass es dunkel genug für die meisten Beobachtungen ist
  • Alternativ lässt sich auch direkt ein Winkel angeben, z.B. HORIZON=-6.0 oder „HORIZON -6.0“

Die Einstellungen können mittels

list <device>

überprüft werden

Beispiele

define AussenlampeAn1 at *{sunset(-1800,"17:00","22:00")} set EG.Diele.Aussenlampe on
define AussenlampeAus1 at *{sunrise(0,"05:00","07:30")} set EG.Diele.Aussenlampe off
  • abends zum Sonnenuntergang eingeschaltet, aber nicht vor 17:00 Uhr und nicht nach 22:00 Uhr.
  • morgens zum Sonnenaufgang, aber nicht vor 05:00 und nicht nach 07:30 Uhr ausgeschaltet

Externes Programm aus fhem heraus starten

{system ("<dein aufruf>")}

RegExp für diverse Zustände

  • EG.Fl.SD.AlarmDisarm:trigger
  • EG.Fl.AD.Haustuer:open

Dummy Aktoren

Z.B. sinnvoll, wenn ein realer bidirektionaler Taster auf keinen Aktor gepeert wird, sondern eine fhem-interne Aktion auslöst. In solchen Fällen würde der Taster keine Antwort erhalten, dass sein Befehl umgesetzt wurde.

define virtueller_Aktor CUL_HM 123456
set virtueller_Aktor virtual 2

Der virtuelle Aktor kann dann gepeert werden:

set LichtFlur1 peerChan 0 virtueller_Aktor_Btn1 single set

… und am Taster die „Anlernen“-Taste drücken.

Dummy devices

define Taster dummy
attr Taster setList state:trigger
attr Taster webCmd trigger
define Schalter dummy
attr Schalter setList state:on,off
attr Schalter webCmd on:off

notify

Definition

define <name> notify <Suchmuster> <command> 

Das Suchmuster (auch Regexp = regulärer Ausdruck) ist sehr wichtig. Es ist entweder der Name des auslösenden („triggernden“) Gerätes oder die Kombination aus Gerät und auslösendem Ereignis (Event) Gerätename:Event. Die Events kann man dem Event-Monitor entnehmen. Wenn da z.B. Rollo1 steht, dann reagiert notify auf Rollo1 on und off und was es sonst noch alles gibt.

Einfachste Vorgehen:

define BeispielNotify notify a b

Im öffnenden notify in der oberen Zeile das RegExp für das Suchmuster „a“ definieren, bspw. Ein Actiondetector oder Schalter on, open,… Anschließend „a“ aus Liste RegExp löschen.

Zur Definition von „b“ auf DEF klicken und Befehl eintragen.

Disable

Ein Notify lässt sich auch vorübergehend deaktivieren:

attr n_Notify disable 1

Mit „0“ ist es wieder aktiviert.

Beispiele

  • Mit Dummy-Schalter Aktionen auslösen

Mehrere Befehle

define ntfy1 notify Fernbedienung:.* sleep 7.5;; set Lampe $EVENT 

Oder

Wenn Licht1 oder Licht2 den Wert „on“ haben, dann hat auch die Steckdose den Wert „on“

define SteckdoseWZein notify (Licht1|Licht2) set Steckdose $EVENT 
define SteckdoseWZein notify (Licht.) set Steckdose $EVENT

Und

define nt.allerolloszu notify (R1ZU|R2ZU|R6ZU) {
my $r1 = Value("R1ZU");;
my $r2 = Value("R2ZU");;
my $r3 = Value("R6ZU");;
if ($r1 eq "on" && $r2 eq "on" && $r3 eq "on") {
  fhem "set LEDalleRolloZu on"
  } else {
    fhem "set LEDalleRolloZu off"
    }
}

Fenster-Offen-Anzeige

fhem.cfg
define n_FensterGeschlossen notify (UG.WK.AD|UG.VK.AD|EG.Fl.AD.Haustuer|EG.Wo.AD.TerrasseRechts|EG.Ku.AD.Rechts|EG.Ku.AD.Links|OG.Sc.AD.Auffahrt|DG.Ba.AD) {\
my $f1 = Value("UG.WK.AD");;\
my $f2 = Value("UG.VK.AD");;\
my $f3 = Value("EG.Fl.AD.Haustuer");;\
my $f4 = Value("EG.WC.AD");;\
my $f5 = Value("EG.Wo.AD.Terrasse.Rechts");;\
my $f6 = Value("EG.Wo.AD.Auffahrt.Rechts");;\
my $f7 = Value("EG.Ku.AD.Rechts");;\
my $f8 = Value("EG.Ku.AD.Links");;\
my $f9 = Value("OG.Sc.AD.Auffahrt");;\
my $f10 = Value("OG.Ba.AD");;\
my $f11 = Value("DG.Ba.AD");;\
if ($f1 eq "closed" && $f2 eq "closed" && $f3 eq "closed" && $f4 eq "closed" && $f5 eq "closed" && $f6 eq "closed" && $f7 eq "closed" && $f8 eq "closed" && $f9 eq "closed" && $f10 eq "closed" && $f11 eq "closed") {\
 fhem "set FensterOffen off";;\
 } else {\
  fhem "set FensterOffen on";;\
  }\
 }

fheminfo

Einmalig senden:

fheminfo send

Bei jedem Update senden:

attr global sendStatistics onUpdate

Alternativ <manually> oder <never>.

at

Definition

define <name> at <timespec|datespec> <command>

Beispiele

define MeineAktion at 02:02:00 set lamp on → das nächste Mal um zwei Minuten nach 2 Uhr "lamp" einschalten
define MeineAktion at *02:02:00 set lamp on → jeden Tag um zwei Minuten nach 2 Uhr "lamp" einschalten
define MeineAktion at 2016-01-25T02:02:00 set lamp on → das nächste Mal am 25.01.2016 um 2:02 Uhr "lamp" einschalten
define MeineAktion at +02:02:00 set lamp on → in zwei Stunden und 2 Minuten "lamp" einschalten
define MeineAktion at +*02:02:00 set lamp on → alle zwei Stunden und 2 Minuten "lamp" einschalten
define <name> at <timespec|datespec> <command1>;; <command2>

Wochentage

Bei Perl ist der Sonntag Tag 0 der Woche.

{ if ($wday == [0-6])

Beispiel

Für Mittwoch, 21 Uhr:

define Licht4An at *21:00:00 { if ($wday == 3) { fhem ("set Signallampe on ;; define Licht4Aus at +00:05:00 set Signallampe off ") } }

Weekday-Timer

Als Alternative zu at an bestimmten Wochentagen. Siehe hierzu: http://fhem.de/commandref.html#WeekdayTimer

cmdalias

linux/fhem/allgemeines.txt · Zuletzt geändert: 30.03.2016 08:19 von marc