FHEM wird hauptsächlich zur Heimautomatisierung benutzt, ist aber ebenso für andere Aufgaben einsetzbar wo Benachrichtigungen, Zeitschaltungen und Datensammlungen eine wichtige Rolle spielen.
FHEM unterstützt verschiedene Hardwaregeräte die eine Verbindung mittels unterschiedlicher Protokolle (z.B. FHZ1000 mit Interfaces vom Typ FS20 und HMS, CM11 um mit X10 zu arbeiten) sowie logischer Geräte wie FS20 oder FHT die einen Nachrichtenaustausch mit verschiedensten Geräten die diese Protokolle verwenden ermöglichen.
FHEM ist modular. Abhängig von den unterschiedlichen Geräten werden in den Modulen verschiedene Funktionen (z.B. define, get, set) realisiert. FHEM enthält weitere Funktionen wie Trigger (notify), Zeitabhängige Funktionen (at) die die Funktionalität erweitern.
FHEM wird entweder über einfache ASCII-Kommandozeilen gesteuert die in Dateien
wie z.B. der Konfigurationsdatei fhem.cfg gespeichert sind oder über eine TCP/IP
Verbindung, entweder direkt in einer "telnet"-Sitzung, oder per fhem.pl im
Client-Modus oder über eines der Webfrontends.
Wenn Sie den FHEM-Server starten, müssen Sie eine Konfigurationsdatei auswählen:
perl fhem.pl fhem.cfg
Nachstehend eine Minimal-Konfiguration Datei:
attr global logfile log/fhem.log attr global modpath . attr global statefile log/fhem.save attr global verbose 3 define telnetPort telnet 7072 global define WEB FHEMWEB 8083 globalDie letzten zwei Zeilen definieren einen telnet und einen WEB Zugang, beide können aber bei Bedarf auch abgeschaltet werden.
telnet <fhemhost> 7072
<NL>
(Die Betätigung der "Enter"-Taste schaltet in den "prompt"
Modus)
<command>...
quit
fhem.pl <fhemhost>:7072 "<command>..."
Es gibt drei Arten von Befehlen: "FHEM" Befehle (werden in diesem Dokument beschrieben), Shell-Befehle (diese müssen von doppelten Anführungszeichen "" eingeschlossen werden) und perl-Ausdrücken (von geschwungenen Klammern {} eingeschlossen). Shell-Befehle oder perl-Ausdrücke werden für komplexe at oder notify Ausdrücke benötigt, können aber auch als "normale" Befehle angewendet werden.
Die folgenden drei Befehle bewirken z.B. dasselbe Ergebnis, wenn sie am telnet-Prompt eingegeben werden:
Shell-Kommandos werden im Hintergrund ausgeführt, perl-Ausdrücke und FHEM-Kommandos werden im Haupt-"thread" ausgeführt. Um perl-Ausdrücke leichter eingeben zu können, sind einige Spezialfunktionen und Variablen verfügbar. Lesen Sie sich bitte die Abschnitte Perl special zum besseren Verständnis durch.
Um FHEM-Befehle in einen Shell-Script zu triggern (dies ist eine "andere" Möglichkeit), benutzen Sie bitte die oben beschriebene Client-Form der fhem.pl.
Mehrere FHEM-Kommandos hintereinander werden mittels Semikolon (;) getrennt. Weil Semikola auch in perl-Code oder Shell-Programmen benutzt werden, müssen sie mittels doppelten Semikola geschützt werden. Lesen Sie sich bitte die Bemerkungen des notify-Abschnittes zu Kommandoparametern und Regeln durch.
Z.B. schaltet die erste der folgenden Befehlszeilen die Lampe 1 nur/erst zur Uhrzeit 07:00 Uhr aus, die Lampe 2 aber sofort und die zweite Befehlszeile schaltet Lampe 1 und 2 um 7:00 Uhr gleichzeitig aus.
Für jede weitere Indirektion muss man die Strichpunkte verdoppeln. Um also die beiden Lampen um 7:00 für 10 Minuten einzuschalten schreibt man:
Keine Angst, das Vorherige kann in FHEM auch deutlich einfacher formuliert werden als:
Befehle können entweder direkt eingegeben oder aus einer Datei (z.B. am Start von FHEM aus der Konfugurationsdatei) eingelesen werden. Die Befehle werden entweder direkt ausgeführt oder später wenn sie als Argumente eines at oder notify-Befehles verwendet werden.
Eine mit einem \ abgeschlossene Zeile wird mit der nachfolgenden Zeile verbunden. Somit können lange Befehlszeilen (die z.B. aus mehreren perl-Befehlen bestehen) auf mehrere Zeilen aufgteilt werden. Einige Web-Frontends (z.B. webpgm2) erleichtern die Eingabe von sich über mehrere Zeilen erstreckende Befehle, indem man keine \ am Zeilenende eingeben muss.
Achtung: unterschiedlicher Befehlsarten (FHEM/Shell/perl) in einer Kommandozeile sind nicht unterstützt, auch wenn es in manchen Fällen funktioniert.
set lamp1 on
set lamp1,lamp2,lamp3 on
set lamp.* on
set room=kitchen off
set room=kitchen:FILTER=STATE=on off
set room=kitchen:FILTER=STATE!=off off
list disabled=
list room~office
list TYPE=FS20 STATE
list i:TYPE=FS20 STATE
Es gibt globale Attribute, die von allen Geräten genutzt werden, und lokale Attribute, die nur auf individuelle Geräteklassen zutreffen.
Manche Geräte (wie FHEMWEB) definieren automatisch neue globale Attribute bei der ersten Definition eines Gerätes dieses Typs.
Sie können den Befehl
attr global userattr
<attributelist>
für das Gerät global verwenden, um neue globale Attribute zu deklarieren, und
attr <devicespec> userattr
<attributelist>
,
um neue lokale Attribute für bestimmte
individuelle Geräte gemäß devspec zu
deklarieren.
<attributelist>
ist eine durch Leerzeichen getrennte Liste,
die die Namen der zusätzlichen Attribute enthält. In der
Dokumentation zum Befehl attr sind Beispiele.
Seien Sie vorsichtig und überschreiben Sie keine zusätzlichen
globale Attribute, die bereits zuvor durch Sie selbst oder ein Gerät
definiert wurden. attr global userattr <attributelist>
sollte so früh wie möglich in der Konfiguration erscheinen.
attr store eventMap on:open off:closed
attr store eventMap /on-for-timer 10:open/off:closed/
set store open
attr store eventMap { dev=>{'on'=>'open'}, usr=>{'open'=>'on'} }
attr store eventMap { dev=>{'^on(-for-timer)?(.*)'=>'open$2'},
usr=>{'^open(.*)'=>'on$1'},
fw=>{'^open(.*)'=>'open'} }
This attribute takes a comma-separated list of reading:interval:method:function:holdTime
quintuples. You may use regular expressions for reading
. If set, updates for the
listed readings are ignored and associated events are suppressed for a black-out period of at
least interval
seconds (downsampling). After the black-out period has expired, the reading is
updated with a value that is calculated from the values and timestamps of the previously ignored
updates within the black-out period as follows:
function | description |
---|---|
v | the last value encountered |
v0 | the first value encountered |
min | the smallest value encountered |
max | the largest value encountered |
mean | the arithmetic mean of all values |
sd | the standard deviation from the mean |
median | the median of all values (requires holdTime and function none) |
integral | the arithmetic sum (if not time-weighted) or integral area (if time-weighted) of all values |
n | number of samples |
t | timestamp of the last value |
t0 | timestamp of the first value |
If method
is none
, then that's all there is. If method
is const
or linear
, the time-weighted series of values is taken into
account instead. The weight is the timespan between two subsequent updates.
With the const
method, the value is the value of the reading at the beginning of
the timespan; with the linear
method, the value is the arithmetic average of
the values at the beginning and the end of the timespan.
Rollovers of black-out periods are handled as one would expect it.
One would typically use the linear
method with the mean
function for
quantities continuously varying over time like electric power consumption, temperature or speed.
For cumulative quantities like energy consumed, rain fallen or distance covered,
the none
method with the v
function is used. The constant
method is for discrete quantities that stay constant until the corresponding reading is updated,
e.g. counters, switches and the like.
If the holdTime
in seconds is defined, the samples will be kept in memory allowing
the calculation of floating statistics instead of blocked statistics. With holdTime
defined the interval
can be kept undefined so that the readings update rate is unchanged
or it can be set to a value less then holdTime
for downsampling as described above
with a full history of the readings in memory. Note that the historic samples are not persistent
and will be lost when restarting FHEM.
The event aggregator only takes into consideration those updates that remain after preprocessing
according to the event-on-update-reading
and event-on-change-reading
directives. Besides which, any update of a reading that occurs within a timespan from the preceding
update that is smaller than the resolution of FHEM's time granularity is ditched.
When more than one function should be calculated for the same reading, the original reading must be multiplied (e.g. by using a notify) before applying the event-aggregator to the derived readings.
Examples:
attr myPowerMeter event-aggregator EP_POWER_METER:300:linear:mean,EP_ENERGY_METER:300:none:v
attr myBadSensor event-aggregator TEMP::none:median:300
attr mySunMeter event-aggregator SUN_INTENSITY_24H::const:integral:86400
<reading>[:<trigger>] [<modifier>] { <perl code> }
{ <perl code> }
ausgeführt wird, und
dessen Wert dem Reading zugewiesen wird.
Falls <trigger> spezifiziert ist, dann findet diese Ausführung
nur dann statt, falls einer der aktualisierten Readings dem regexp
<trigger> entspricht (matched).
attr myEnergyMeter userReadings energy
{ ReadingsVal("myEnergyMeter","counters.A",0)/1250.0;; }
attr myMultiMeter userReadings
energy1:counters.A.* {ReadingsVal("myMultiMeter","counters.A",0)/1250.0},
energy2:counters.B.* {ReadingsVal("myMultiMeter","counters.B",0)/1250.0}
<modifier>
kann die folgenden Werte haben:
attr myPowerMeter userReadings power differential
{ ReadingsVal("myPowerMeter","counters.A",0)/1250.0}
attr <device> disable toggle
attr [-a|-r|-silent] <devspec> <attrname> [<value>]
attr global verbose 3
attr lamp room kitchen
attr lamp group lights
attr lamp loglevel 6
attr weatherstation event-on-update-reading wind,temperature,humidity
attr weatherstation event-on-change-reading israining
attr weatherstation event-on-change-reading israining,state
attr heating stateFormat Temp:measured-temp, Valve:actuator
attr -a TYPE=SVG room ,SvgRoom
attr -r TYPE=SVG room ,SvgRoom
cancel [<id> [quiet]]
define [option] <name> <type> <type-specific>
defmod [option] <name> <type> <type-specific>
define mdNtfy notify motionDetector defmod mdOff at +00:10 set lamp off
delete <devspec>
delete lamp
deleteattr [-silent] <devspec> [<attrname>]
deleteattr lamp follow-on-for-timer
deleteattr lamp
deletereading <devspec> <readingname>
[<older-than-seconds>]
deletereading mySensor temp1
deletereading mySensor temp\d+
displayattr <devspec> [<attrname>]
fhem> di WEB
menuEntries AlarmOn,/fhem?cmd=set%20alarm%20on
room Misc.
fhem> di WEB room
Misc.
get <devspec> <type-specific>
get <device> ?
getstate <devspec>
getstate lamp
state:1
getstate fl
ack:0 actuator:2 day-temp:21.5 desired-temp:22.5 [...] measured-temp:22.9 [...]
include <filename>
inform {on|off|timer|raw} [regexp]
list [devspec] [value ...]
list {-r|-R} devspec
fhem> list
Type list for detailed info.
Internal:
global (Internal)
FHZ:
FHZ (fhtbuf: 23)
FS20:
Btn4 (on-old-for-timer)
Roll1 (on)
Stehlampe (off)
FHT:
fl (measured-temp: 21.1 (Celsius))
KS300:
out1 (T: 2.9 H: 74 W: 2.2 R: 8.2 IR: no)
at:
at_rollup (Next: 07:00:00)
notify:
ntfy_btn4 (active)
FileLog:
avglog (active)
Wenn Sie für name
einen Gerätenamen eingeben, dann
erhalten Sie einen genauen Status für das in name
angegebene Gerät angezeigt, z.B.:
fhem> list fl
Internals:
CODE 5102
DEF 5102
NAME fl
NR 15
STATE measured-temp: 21.1 (Celsius)
TYPE FHT
IODev FHZ
Attributes:
room Heizung
Readings:
2006-11-02 09:45:56 actuator 19%
[...]
Mit der -r (raw) Option werden die Daten in einem für fhem.cfg bzw.
fhem.state passenden Format generiert. -R liefert diese Daten auch für
alle von diesem Gerät vermutlich benögten Geräte.
Achtung: die Bestimmung dieser Liste ist ungenau.
modify [-silent] <name> <type-dependent-options>
define lampon at 19:00 set lamp on
modify lampon *19:00
modify lampon 19:00 set lamp on-for-timer 16
quit
quit
reload <module>
reload 99_PRIV
rename <oldname> <newname>
rename FHT_1234 fht.kitchen
rereadcfg [fhem-config-file]
rereadcfg
save [<configfile>]
set <devspec> <type-specific>
set <name> ?
define morningLight at *06:00 set Lamp on-till {sunrise()}
define nightLight at *{sunset()} set Lamp on-till-overnight 01:00
set switch on-for-timer 12.5
set switch on-till {sunset()}
set switch blink 3 1
set switch intervals 08:00-12:00 13:00-18:00
setdefaultattr [<attrname> [<value>]]
setdefaultattr room kitchen
setdefaultattr loglevel 4
define lamp1 FS20 1234 11
define lamp2 FS20 1234 12
define lamp3 FS20 1234 13
setdefaultattr
setreading <devspec> [YYYY-MM-DD HH:MM:SS] <reading>
<value>
setstate <devspec> <value>
setuuid <device> <uuid>
show <devspec>
show TYPE=CUL_HM
shutdown [restart] [exitValue]
Der Befehl fährt FHEM herunter (nach dem Sichern aller Gerätestatus). Er triggert den global:SHUTDOWN
-Event.
Mit dem optionalen Parameter restart startet FHEM danach neu.
Der exitValue ist möglicherweise bei bestimmten Start-Skripten zur korrekten Funktion
vonnöten bzw. wichtig.
shutdown
shutdown restart
shutdown 1
sleep <sec|timespec|suchmuster> [<id>] [quiet]
sleep 0.5
define n3 notify btn3.* set lamp toggle;;sleep 0.5;;set lamp
toggle
define a3 at +*00:05 set Windsensor 1w_measure;; sleep 2 quiet;; get
Windsensor 1w_temp
trigger <devspec> <event>
trigger btn3 on
"/etc/fhem.cfg /var/log/fhem/fhem.save /usr/share/fhem/contrib
/usr/share/fhem/FHEM /usr/share/fhem/foo /usr/share/fhem/foobar
/usr/share/fhem/www"
archivecmd / archivedir / nrarchive
zum
global
Gerät hinzu wie Sie es auch bei einem FileLog
device tun könnten.{ $currlogfile }festlegen
.
FHEM
Module an. Der Pfad enthält nicht das Verzeichnis FHEM.
Durch das setzen der Attribute, wird das Verzeichnis nach Dateinamen in
der Form NN_<NAME>.pm durchsucht, und sie werden für die
Definition von Geräten unter dem Namen <NAME> verfügbar
gemacht. Wenn das erste Gerät des Typs <NAME> definiert
wird, werden die entsprechenden Module geladen und in dem Modul die
entsprechende Funktion mit dem Namen <NAME>_Initialize wird
aufgerufen. Eine Ausnahme bilden Module die mit der Nummer 99 im
Dateinamen beginnen. Diese enthalten PERL-Hilfsfunktionen und
werden zur Startzeit geladen.
define <name> AMADCommBridge
define AMADBridge AMADCommBridge
define <name> AMADDevice <IP-ADRESSE> <AMAD_ID> <REMOTESERVER>
define WandTabletWohnzimmer AMADDevice 192.168.0.23 123456 Automagic
define <name> AptToDate <HOST>
define fhemServer AptToDate localhost
Arlo Sicherheitskameras werden über eine Basisstation an die Arlo Cloud angebunden. Diese kann über eine REST-API angesprochen werden und liefert Ereignisse (wie z.B. erkannte Bewegungen oder sonstige Statusänderungen) über Server-Sent Events (SSE) zurück.
define Arlo_Cloud Arlo ACCOUNT <hans.mustermann@xyz.de> <meinArloPasswort> <meinEmailPasswort> <meinEmailBenutzername>
hans.mustermann@xyz.de durch die E-Mail-Adresse ersetzen, mit der man bei Arlo registriert ist, meinArloPasswort durch das Passwort bei Arlo. Für die 2-Faktor-Authentifizierung wird zusätzlich das Passwort des E-Mail-Accounts benötigt. Der E-Mail-Server, von dem die Arlo-Mails abgerufen werden sollen, muss mit attr Arlo_Cloud mailServer imap.gmx.net angegeben werden, wobei imap.gmx.net durch den IMAP-Mailserver des Providers ersetzt werden muss, bei dem das E-Mail-Konto liegt. Es wird ausschließlich IMAP mit Verschlüsselung unterstützt. Der Parameter meinEmailBenutzername muss nur angegeben werden, falls der Benutzernamen, mit dem man sich am Mailserver anmeldet, von der E-Mail-Adresse abweicht.
Nach der erfolgreichen Definition des Account kann auf dem neu erzeugten Device set Arlo_Cloud autocreate
aufgerufen werden.
Dies legt die Basistation(en) und Kameras an, die zu dem Arlo Account zugeordnet sind. Die neuen Devices befinden sich initial im Raum Arlo.
Aufgrund der SSE-Schnittstelle ist es notwendig, dass dauerhaft im Hintergrund eine Verbindung zum Arlo-Server gehalten wird. Falls dies nicht gewünscht ist, da Arlo z.B. vorübergehend nicht genutzt wird, kann der Hintergrund-Job verhindert werden, indem das Attribut "disable" des Arlo_Cloud-Device auf 1 gesetzt wird.
Subtype ACCOUNT: Deaktiviert die Verbindung zur Arlo-Cloud.
Subtype BASESTATION: Deaktiviert die regelmäßige Abfrage der Readings aus der Arlo Cloud.
Subtype ACCOUNT: Wenn alle Basisstation auf "disarmed" stehen, wird die Verbindung zur Cloud nach der hier angegebenen Zeit beendet. Bei einer Aktion mit einem Arlo-Gerät wird eine neue Verbindung aufgebaut. Angabe in Sekunden, Standard ist 600 (10 Minuten). Durch Angabe von 0 kann die Verbindung dauerhaft bestehen bleiben.
Subtype ACCOUNT: Name des IMAP Mailservers, an den Arlo den Code für die 2-Faktor-Authentifizierung sendet. Das Passwort muss beim define des Arlo_Cloud-Devices angegeben werden.
Subtype ACCOUNT: Dieser Wert muss auf 1 gesetzt werden, falls Videos nach der Aufnahme nicht automatisch heruntergeladen werden. Normalerweise werden Events vom Server gesendet, sobald eine neue Aufnahme vorhanden ist, aber manchmal funktioniert das nicht. Standard ist 0 (ausgeschaltet).
Subtype ACCOUNT: Setzt das Intervall in Sekunden, wie häfuig ein Heartbeat-Ping gesendet wird. Ohne den Heartbeat-Ping würde die Session ablaufen und es könnten keine Events mehr empfangen werden. Standard ist 90.
Subtype ACCOUNT: Setzt das Intervall in Sekunden, wie häufig die Readings der Basisstationen und Kameras abgefragt werden. Standard ist 3600 = 1 Stunde.
Subtype ACCOUNT: Setzt das Intervall in Sekunden, wie häufig die SSE Events abgefragt werden sollen. Standard ist 2 Sekunden.
AutoShuttersControl (ASC) ermöglicht eine vollständige Automatisierung der vorhandenen Rollläden. Das Modul bietet umfangreiche Konfigurationsmöglichkeiten, um Rollläden bspw. nach Sonnenauf- und untergangszeiten, nach Helligkeitswerten oder rein zeitgesteuert zu steuern.
Damit ASC auf Basis der astronomischen Zeiten die Rollos fahren kann, ist es ganz wichtig im Device "global" die Location (Latitude,Longitude) korrekt zu setzen.
Man kann festlegen, welche Rollläden von ASC in die Automatisierung mit aufgenommen werden sollen. Daraufhin stehen diverse Attribute zur Feinkonfiguration zur Verfügung. So sind unter anderem komplexe Lösungen wie Fahrten in Abhängigkeit des Bewohnerstatus einfach umsetzbar. Beispiel: Hochfahren von Rollläden, wenn der Bewohner erwacht ist und draußen bereits die Sonne aufgegangen ist. Weiterhin ist es möglich, dass der geschlossene Rollladen z.B. nach dem Ankippen eines Fensters in eine Lüftungsposition fährt. Und vieles mehr.
Definedefine <name> AutoShuttersControl
define myASControl AutoShuttersControl
{ ascAPIget('GETTER','ROLLODEVICENAME') }
Getter | Erläuterung |
---|---|
FreezeStatus | 1=soft, 2=Daytime, 3=hard |
AntiFreezePos | konfigurierte Position beim AntiFreeze Status |
AntiFreezePosAssignment | konfigurierte Lamellen Position bei der AntiFreeze Position |
AntiFreeze | aktuelle Konfiguration für AntiFreeze |
ShuttersPlace | aktuelle Konfiguration an welchem Platz sich das Rollo befindet, Fenster oder Terrasse |
SlatPosCmd | welcher PosCmd ist aktuell für den Lamellen Befehl konfiguriert |
SlatDevice | welches Device aktuell für die Lamellen Steuerung konfiguriert ist |
PrivacyUpTime | Privacy Zeit in Sekunden zum fahren in die Privacy Pos vor dem vollen öffnen |
PrivacyUpBrightnessVal | Privacy Brightness Wert zum fahren in die Privacy Pos |
PrivacyUpPos | Position für die Privacy Up Fahrt |
PrivacyUpPositionAssignment | Position für die Lamellenfahrt von Privacy Up |
PrivacyDownTime | Privacy Zeit in Sekunden zum fahren in die Privacy Pos vor dem vollen schließ |
PrivacyDownBrightnessVal | Privacy Brightness Wert zum fahren in die Privacy Pos |
PrivacyDownPos | Position für die Privacy Down Fahrt |
PrivacyDownPositionAssignment | Position für die Lamellenfahrt von Privacy Down |
SelfDefenseMode | Modus für den SelfDefense |
SelfDefenseAbsentDelay | Verzögerungszeit der SelfDefense Fahrt bei absent |
WiggleValue | um welchen Wert soll das Rollo bei einer wiggle Fahrt fahren |
Adv | Ist es in der definierten Weihnachtszeit |
ShadingPos | konfigurierte Position für die Beschattungsfahrt |
ShadingPositionAssignment | Position für die Lamellenfahrt für die Beschattungsfahrt |
ShadingMode | welcher aktuelle Modus für das Beschatten ist konfiguriert |
IdleDetectionValue | welcher Wert im IdleDetectionRading zeigt an dass das Rollo aktuell nicht in Bewegung ist |
ShadingAzimuthLeft | ab welchem Azimut beginnt die Beschattung |
ShadingAzimuthRight | ab welchem Azimut endet die Beschattung |
ShadingMinOutsideTemperature | über welchem Temperaturwert beginnt die Beschattung |
ShadingMinElevation | über welchem Elevationwert beginnt die Beschattung |
ShadingMaxElevation | über welchem Elevationwert endet die Beschattung |
ShadingStateChangeSunny | über welchem Brightnesswert beginnt die Beschattung |
ShadingStateChangeCloudy | unter welchem Brightnesswert endet die Beschattung |
ShadingWaitingPeriod | nach welcher Wartezeit werden Beschattungsrelevante Sensorwerte wieder beachtet und die Beschattungsroutine abgearbeitet |
ExternalTriggerDevice | konfiguriertes Triggerdevice |
ExternalTriggerReading | kofiguriertes Triggerdevice Reading |
ExternalTriggerValueActive | Wert mit welchen der externe Trigger Prozess ausgel&uoml;st werden soll. |
ExternalTriggerValueActive2 | weiterer Wert mit welchen der externe zweite Trigger Prozess ausgel&uoml;st werden soll. |
ExternalTriggerValueInactive | Wert mit welchen der externe Trigger Prozess beendet werden soll |
ExternalTriggerPosActive | Rolloposition welche angefahren werden soll wenn der erste externe Trigger aktiv wird. |
ExternalTriggerPosActive2 | Rolloposition welche angefahren werden soll wenn der zweite externe Trigger aktiv wird. |
ExternalTriggerPosInactive | Rolloposition welche angefahren werden soll wenn der externe Trigger inaktiv wird. |
ExternalTriggerStatus | aktueller Status des externen Triggers, 0 oder 1 |
Delay | konfigurierte Verzögerungswert welcher für die Zufallsberechnung werwendet werden soll |
DelayStart | konfigurierter fester Verzögerungswert |
BlockingTimeAfterManual | konfigurierte Blockzeit nach einer manuellen Fahrt |
BlockingTimeBeforNightClose | konfigurierte Blockzeit vor dem nächtlichen schließen |
BlockingTimeBeforDayOpen | konfigurierte Blockzeit vor dem morgendlichen öffnen |
PosCmd | welches Kommando wird zum fahren der Rollos verwendet (pct, position?) |
OpenPos | Position für Rollo ganz auf |
OpenPositionAssignment | Slat-Position für Rollo ganz auf |
VentilatePos | Lüften Position |
VentilatePositionAssignment | Lüften Slat-Position |
VentilatePosAfterDayClosed | Position des Rollos beim schließen des Fensters am Tag |
ClosedPos | Position für Rollo ganz geschlossen |
ClosedPositionAssignment | Slat-Position für Rollo ganz geschlossen |
SleepPos | Position für schlafen |
SleepPositionAssignment | Slat-Position für schlafen |
VentilateOpen | Lüften aktiv? |
ComfortOpenPos | Comfort Position |
ComfortOpenPositionAssignment | Slat-Comfort Position |
PartyMode | Abfrage Party Mode |
Roommates | Abfrage Roommates / Antwort als String |
RoommatesReading | Roommates Reading |
RoommatesStatus | Roommates Status unter Berücksichtigung aller Roommates und dessen Status |
RoommatesLastStatus | Roommates letzter Status unter Berücksichtigung aller Roommates und dessen letzten Status |
WindPos | Rollo Position bei Windtrigger |
WindMax | Wert über dem die Windprotection aktiviert werden soll |
WindMin | Wert unter dem die Windprotection aufgehoben werden soll |
WindProtection | Windprotection soll aktiv sein oder nicht |
WindProtectionStatus | aktueller Status der Wind Protection „protected“ oder „unprotected“ |
RainProtection | Rain Protection soll aktiv sein oder nicht |
RainProtectionStatus | aktueller Status der Regen Protection „unprotected“ oder „unprotected“ |
ModeUp | aktuelle Einstellung für den Modus des Morgens hoch fahren |
ModeDown | aktuelle Einstellung für den Modus des Abends runter fahren |
LockOut | aktuelle Einstellung für den Aussperrschutz |
LockOutCmd | Aussperrschutz Kommando am Aktor |
AutoAstroModeMorning | aktuell engestellter Wert für Astro Morgens |
AutoAstroModeEvening | aktuell engestellter Wert für Astro Abends |
AutoAstroModeMorningHorizon | HORIZON Wert Morgens |
AutoAstroModeEveningHorizon | HORIZON Wert Abends |
Up | aktueller Wert für Morgenfahrten |
Down | aktueller Wert für Abendfahrten |
TimeUpEarly | aktueller Wert für frühste Morgenfahrt |
TimeUpLate | aktueller Wert für späteste Morgenfahrt |
TimeDownEarly | aktueller Wert für frühste Abendfahrt |
TimeDownLate | aktueller Wert für späteste Abendfahrt |
TimeUpWeHoliday | aktueller Wert für Wochenende und Feiertags Morgenfahrten |
BrightnessMinVal | |
BrightnessMaxVal | |
DriveUpMaxDuration | |
Homemode | |
PrivacyDownStatus | |
PrivacyUpStatus | |
IsDay | |
SelfDefenseState | |
LastDrive | |
LastPos | |
Sunset | |
Sunrise | |
OutTemp | |
IdleDetection | |
BrightnessAverage | Nur für die Beschattung relevant |
ShadingStatus | |
ShadingLastStatus | |
ShadingManualDriveStatus | |
IfInShading | |
WindProtectionStatus | |
RainProtectionStatus | |
Brightness | |
WindStatus | |
Status | aktuelle Position des Rollos |
DelayCmd | Status der Query von ausgesetzten Fahrten wegen PartyMod oder offnen Fenster |
ASCenable | Status der ASC Steuerung vom Rollo |
SubTyp | Subtype vom Rollo |
WinDevReading | |
WinDev | |
WinStatus | |
NoDelay | Wurde die Behandlung von Offset deaktiviert (Beispiel bei Fahrten über Fensterevents) |
LastDrive | Grund des letzten Fahrens |
LastPos | die letzte Position des Rollladens |
LastPosTimestamp | Timestamp der letzten festgestellten Position |
LastManPos | Position der letzten manuellen Fahrt |
LastManPosTimestamp | Timestamp der letzten manuellen Position |
SunsetUnixTime | berechnete Unixzeit für Abends (Sonnenuntergang) |
Sunset | 1=Abendfahrt wurde durchgeführt, 0=noch keine Abendfahrt durchgeführt |
SunriseUnixTime | berechnete Unixzeit für Morgens (Sonnenaufgang) |
Sunrise | 1=Morgenfahrt wurde durchgeführt, 0=noch keine Morgenfahrt durchgeführt |
RoommatesStatus | aktueller Status der/des Roommate/s für den Rollladen |
RoommatesLastStatus | letzter Status der/des Roommate/s für den Rollladen |
ShadingStatus | Ausgabe des aktuellen Shading Status, ���in“, �����out“, „in reserved“, „out reserved“ |
ShadingStatusTimestamp | Timestamp des letzten Beschattungsstatus |
IfInShading | Befindet sich der Rollladen, in Abhängigkeit des Shading Mode, in der Beschattung |
DelayCmd | letzter Fahrbefehl welcher in die Warteschlange kam. Grund z.B. Partymodus. |
Status | Position des Rollladens |
ASCenable | Abfrage ob für den Rollladen die ASC Steuerung aktiv ist. |
IsDay | Abfrage ob das Rollo im Tag oder Nachtmodus ist. Also nach Sunset oder nach Sunrise |
PrivacyDownStatus | Abfrage ob das Rollo aktuell im PrivacyDown Status steht |
OutTemp | aktuelle Außentemperatur sofern ein Sensor definiert ist, wenn nicht kommt -100 als Wert zurück |
ShadingBetweenTheTime | Konfiguration für die Zeit der Beschattung |
{ ascAPIget('GETTER','ROLLODEVICENAME',VALUE) }
Getter | Erläuterung |
---|---|
QueryShuttersPos | Rückgabewert 1 bedeutet das die aktuelle Position des Rollos unterhalb der Valueposition ist. 0 oder nichts bedeutet oberhalb der Valueposition. |
{ ascAPIset('SETTER','ROLLODEVICENAME','VALUE') }
Setter | Erläuterung |
---|---|
AntiFreezePos | setzt die Position für Antifreeze |
AntiFreeze | setzt den Wert für Antifreeze - off/soft/hard/am/pm |
ShuttersPlace | setzt den Standort des Rollos - window/terrace |
SlatPosCmd | setzt Command für das fahren der Lamellen |
PrivacyUpTime | setzt die Zeit für die morgendliche privacy Fahrt |
PrivacyDownTime | etzt die Zeit für die abendliche privacy Fahrt |
PrivacyDownPos | setzt die Position für eine abendliche privacy Fahrt |
PrivacyUpPos | setzt die Position für eine morgendliche privacy Fahrt |
SelfDefenseMode | setzt den Modus für SelfDefense |
SelfDefenseAbsentDelay | setzt den Verzögerungswert für SelfDefense |
WiggleValue | setzen der Werte für Wiggle |
Adv | setzt die Unterstützung für Weihnachten - on/off |
ShadingPos | setzt den Wert der Beschattungsposition |
ShadingMode | setzt den Modus der Beschattung - absent/always/off/home |
ShadingMinOutsideTemperature | setzt den mininmal Temperaturwert zur Beschattung |
ShadingWaitingPeriod | setzt den Wert der Beschattungswartezeit |
Delay | setzt den Zufallswert zur verzögerten Fahrt |
DelayStart | setzen den festen Wert zur verzögerten Fahrt |
BlockingTimeAfterManual | setzt den Wert in Sekunden zur Blockade nach einer manuellen Fahrt |
BlockingTimeBeforNightClose | setzt den Wert in Sekunden zur Blockade vor der Nachtfahrt |
BlockingTimeBeforDayOpen | setzt den Wert in Sekunden zur Blockade vor der Tagfahrt |
PosCmd | setzt den Readingnamen zur Positionserkennung des Rollos |
OpenPos | setzt den Wert für die offen Position |
VentilatePos | setzt den Wert für die ventilate Position |
VentilatePosAfterDayClosed | was soll passieren wenn am Tag das Fenster geschlossen wird - open/lastManual |
ClosedPos | setzt den Wert für die geschlossen Position |
SleepPos | setzt den Wert für die schlafen Position |
VentilateOpen | setzt den Wert für VentilateOpen Position |
ComfortOpenPos | setzt den Wert für ComfortOpen Position |
PartyMode | Wert für den PartyMode - on/off |
Roommates | setzt den Wert für Roommates als String, mehrere Roommates durch Komma getrennt |
RoommatesReading | setzt das Reading für die Roommates |
WindProtection | setzt/überschreibt die WindProtection - protected/unprotected |
RainProtection | setzt/überschreibt die RainProtection - protected/unprotected |
ModeUp | setzt den Modus für die morgendliche Fahrt - absent/always/off/home |
ModeDown | setzt den Modus für die abendliche Fahrt - absent/always/off/home |
LockOut | setzt den zu berücksichtigen LockOut Modus - off/soft/hard |
LockOutCmd | setzt das Kommando für den LockOut des Rollos |
AutoAstroModeMorning | |
AutoAstroModeEvening | |
AutoAstroModeMorningHorizon | |
AutoAstroModeEveningHorizon | |
Up | |
Down | |
TimeUpEarly | |
TimeUpLate | |
TimeDownEarly | |
TimeDownLate | |
TimeUpWeHoliday | |
DriveUpMaxDuration | |
SubTyp | |
WinDev | |
ShadingBetweenTheTime | Konfiguration für die Zeit der Beschattung, Beispiel: 09:00-13:00 WICHTIG!!!! Immer bei einstelligen Stunden die 0 davor setzen |
{ ascAPIget('GETTER') }
Getter | Erläuterung |
---|---|
OutTemp | aktuelle Außentemperatur sofern ein Sensor definiert ist, wenn nicht kommt -100 als Wert zurück |
ResidentsStatus | aktueller Status des Residents Devices |
ResidentsLastStatus | letzter Status des Residents Devices |
Azimuth | Azimut Wert |
Elevation | Elevation Wert |
ASCenable | ist die ASC Steuerung global aktiv? |
PartyMode | Party Mode Reading |
HardLockOut | Hard Lock Out Reading |
SunriseTimeWeHoliday | Feiertags und Wochenend Sunrise Zeiten beachten |
AutoShuttersControlShading | globale Beschattung on/off |
SelfDefense | global Self Defense on/off |
ShuttersOffset | globales Drive Delay |
BrightnessMinVal | Brightness Wert für Sonnenuntergang |
BrightnessMaxVal | Brightness Wert für Sonnenaufgang |
AutoAstroModeEvening | |
AutoAstroModeEveningHorizon | |
AutoAstroModeMorning | |
AutoAstroModeMorningHorizon | |
AutoShuttersControlMorning | |
AutoShuttersControlEvening | |
AutoShuttersControlComfort | |
FreezeTemp | |
RainTriggerMax | |
RainTriggerMin | |
RainSensorShuttersClosedPos | |
RainWaitingTime | |
BlockAscDrivesAfterManual |
{Dumper $defs{<device name>}}
in der Befehlezeile können die Daten angezeigt werden und daraus userReadings erstellt werden.define <device name> AutomowerConnect <application key> [<mower number>]
define myMower AutomowerConnect 123456789012345678901234567890123456
Erstes Gerät: die Defaultmähernummer ist 0.set myMower <client secret>
set <name> Park <number of minutes>
set <name> ParkUntilFurtherNotice
set <name> ParkUntilNextSchedule
set <name> Pause
set <name> ResumeSchedule
set <name> Start <number of minutes>
set <name> StartInWorkArea <workAreaId|zone name> [<number of minutes>]
set <name> chargingStationPositionToAttribute
set <name> client_secret <application secret>
set <name> cuttingHeight <1..9>
set <name> stayOutZone_enable <Id|zone name>
set <name> stayOutZone_disable <Id|zone name>
set <name> getNewAccessToken
set <name> getUpdate
set <name> headlight <ALWAYS_OFF|ALWAYS_ON|EVENIG_ONLY|EVENING_AND_NIGHT>
set <name> mowerScheduleToAttribute
moverSchedule
.set <name> sendScheduleFromAttributeToMower
set <name> mapZonesTemplateToAttribute
set <name> defaultDesignAttributesToAttribute
get <name> html
get <name> errorCodes
get <name> InternalData
get <name> MowerData
serialnumber
mit dem Hashpfad $hash->{helper}{mower}{attributes}{system}{serialNumber}
attr <name> userReadings serialnumber:connected {$defs{$name}->{helper}{mower}{attributes}{system}{serialNumber}}
get <name> StatisticsData
get <name> errorStack
attr <name> mapImagePath <path to image>
/(\d+)x(\d+)/
passt,mapImageWidthHeight = '$1 $2'
map740x1300.webp
attr <name> mapImageWidthHeight <width in pixel><separator><height in pixel>
attr <name> mapImageZoom <zoom factor>
attr <name> mapBackgroundColor <color value>
attr <name> mapDesignAttributes <complete list of design-attributes>
set <name> defaultDesignAttributesToAttribute
um die Werte zu ändern. Einige Vorgabewerte:
attr <name> mapImageCoordinatesToRegister <upper left longitude><space><upper left latitude><line feed><lower right longitude><space><lower right latitude>
/\s|\R$/
).attr <name> mapImageCoordinatesUTM <upper left longitude><space><upper left latitude><line feed><lower right longitude><space><lower right latitude>
/\s|\R$/
).attr <name> showMap <1,0>
attr <name> chargingStationCoordinates <longitude><separator><latitude>
attr <name> chargingStationImagePosition <right, bottom, left, top, center>
attr <name> mowerCuttingWidth <cutting width>
attr <name> mowerSchedule <schedule array>
set <name> mowerScheduleToAttrbute
ins Attribut geschrieben werden. set <name> sendScheduleFromAttributeToMower
sendet den Mähplan an den Mäher. Das Maximum der Arrayelemente beträgt 14, 2 für jeden Tag, so daß jeden Tag zwei Intervalle geplant werden können. Jedes Arrayelement besteht aus 7 unsortierten Tageswerten (monday
bis sunday
) die auf true
oder false
gesetzt werden können, einen start
Wert und einen duration
Wert in Minuten. Die Startzeit start
wird von Mitternacht an gezählt. HINWEIS: Nicht für 550 EPOS und Ceora geeignet.attr <name> mowingAreaLimits <positions list>
/\s|\R$/
).attr <name> propertyLimits <positions list>
/\s|\R$/
).attr <name> numberOfWayPointsToDisplay <number of way points>
attr <name> weekdaysToResetWayPoints <any combination of weekday numbers, space or minus [0123456 -]>
attr <name> scaleToMeterXY <scale factor longitude><seperator><scale factor latitude>
(LongitudeMeter_1 - LongitudeMeter_2) / (LongitudeDegree_1 - LongitudeDegree _2)
(LatitudeMeter_1 - LatitudeMeter_2) / (LatitudeDegree_1 - LatitudeDegree _2)
attr <name> mapZones <JSON string with zone names in alpabetical order and valid perl condition to seperate the zones>
'{
"<name_1>" : {
"condition" : "<condition to separate name_1 from other zones>",
"cuttingHeight" : "<cutting height for the first zone>"
},
"<name_2>" : {
"condition" : "<condition to separate name_2 from other zones, except name_1>",
"cuttingHeight" : "<cutting height for the second zone>"
},
"<name_3>" : {
"condition" : "<condition to separate name_3 from other zones, except name_1 and name_2>",
"cuttingHeight" : "<cutting height for the third zone>"
},
"<name_n-1>" : {
"condition" : "<condition to separate name_n-1 from other zones ,except the zones already seperated>",
"cuttingHeight" : "<cutting height for the nth-1 zone>"
},
"<name n>" : {
"condition" : "Use 'undef' because the last zone remains.",
"cuttingHeight" : "<cutting height for the nth zone>"
}
}'
'{
"01_oben" : {
"condition" : "$latitude > 52.6484600648553 || $longitude > 9.54799477359984 && $latitude > 52.64839739580418",
"cuttingHeight" : "7"
},
"02_unten" : {
"condition" : "undef",
"cuttingHeight" : "3"
}
}'
attr <name> addPollingMinInterval <interval in seconds>
attr <name> addPositionPolling <[1|0]>
attr <name> loglevelDevIo <[012345]>
attr <name> timeoutGetMower <[6 to 60]>
attr <name> timeoutApiAuth <[6 to 60]>
attr <name> timeoutCMD <[6 to 60]>
attr <name> testing 1
sudo apt-get install libcrypt-cbc-perl
sudo apt-get install libcrypt-rijndael-perl
sudo apt-get install libssl-dev
sudo cpan Crypt/OpenSSL/AES.pm
define <name> BEOK <ip> [mac]
define WT BEOK 192.178.1.100
define WT BEOK 192.178.1.100 01:02:03:04:05:06
lock <on off>
power-on-memory <on off>
fre <open close>
room-temp-adj <-5 - +5>
osv <5 - 99>
svh <5 - 99>
svl <5 - 99>
dif <1 - 9>
day-profil[1-6]-temp <5 - 99>
day-profil[1-6]-time <00:00 - 23:59>
we-profile[7-8]-temp <5 - 99>
we-profile[7-8]-time <00:00 - 23:59>
weekprofile
timeout
define <name> BOSEST
define bosesystem BOSEST
set <name> <command> [<parameter>]
on
- Lautsprecher einschaltenoff
- Lautsprecher ausschaltenpower
- Wechselt zw. on und offvolume [0...100] [+x|-x]
- Lautstärke setzen (direkt oder als ±x Differenz zur aktuellen Lautstärke) channel 0...20
- Present auswählensaveChannel 07...20
- Aktuelle Wiedergabe als Present 07 bis 20 speichernplay
- Startet die Wiedergabe pause
- Pausiert die Wiedergabeplaypause
- Wechselt zw. play und pausestop
- Stoppt die WiedergabenextTrack
- Nächsten Titel spielenprevTrack
- Vorherigen Titel spielenplayTrack name|location|source[|sourceAccount]
- Sucht per DNLA nach dem Titel und spielt ihn ab mute on|off|toggle
- Stummschaltungshuffle on|off
- Zufallswiedergaberepeat all|one|off
- Wiederholungbass 0...10
- Basseinstellungrecent 0...15
- Anzahl der Namen, die in der recent list in readings aufgeführt werdensource bluetooth,bt-discover,aux mode, airplay
- lokale Quelle auswählenaddDLNAServer Name1 [Name2] [Namex]
- DLNA server Name1 (und Name2 bis Namex) zur BOSE Bibliothek hinzufügenremoveDLNAServer Name1 [Name2] [Namex]
- DLNA server Name1 (und Name2 bis Namex) aus der BOSE Bibliothek entfernenset BOSE_1234567890AB volume 25
Setzt die Lautstärke des Lautsprechers BOSE_1234567890AB auf 25.on-for-timer 1...x
- Schaltet den Lautsprecher für x Sekunden einoff-for-timer 1...x
- Schaltet den Lautsprecher für x Sekunden auson-till hh:mm:ss
- Schaltet den Lautsprecher bis zur angegebenen Zeit einoff-till hh:mm:ss
- Schaltet den Lautsprecher bis und zur angegebenen Zeit auson-till-overneight hh:mm:ss
- Schaltet den Lautsprecher bis zur angegebenen Zeit am nächsten Tag einoff-till-overneight hh:mm:ss
- Schaltet den Lautsprecher bis zur angegebenen Zeit am nächsten Tag ausset BOSE_1234567890AB on-till 23:00:00
Schaltet den Lautsprecher BOSE_1234567890AB ein und um 23:00:00 Uhr aus.createZone deviceID[,deviceID]
- Legt eine Wiedergabe-Zone an und fügt einen oder mehrere Lautsprecher der Wiedergabezone hinzu addToZone deviceID
- Fügt einen Lautsprecher einer bestehenden Wiedergabe-Zone zu removeFromZone deviceID
- Entfernt einen Lautsprecher aus einer Wiedergabe-ZoneplayEverywhere
- Startet "Überall wiedergeben"stopPlayEverywhere
- Beendet "Überall wiedergeben"set BOSE_1234567890AB playEverywhere
Startet die Überall-Wiedergabe (Mit dem Lautsprecher BOSE_1234567890AB als Master-Lautsprecher). set BOSE_1234567890AB createZone AB1234567890,12AB34567890
Definiert BOSE_1234567890AB als Master-Lautsprecher und fügt BOSE_AB1234567890 und BOSE_12AB34567890 der Wiedergabe-Zone hinzuclock enable/disable
- Schaltet die Uhrenanzeige im Standby umset BOSE_1234567890AB clock enable
Zeigt die Uhr im Standby auf dem Display des ST20/30 an.speak "message" [0...100] [+x|-x] [en|de|xx]
- Text den der Lautsprecher sagen soll, ggf. mit Lautstärkeangabe, die für diese Ansage verwendet werden soll. Nach der Ansage setzt der Lautsprecher die Wiedergabe fort.speakOff "message" [0...100] [+x|-x] [en|de|xx]
- Text den der Lautsprecher sagen soll, ggf. mit Lautstärkeangabe, die für diese Ansage verwendet werden soll. Nach der Ansage schaltet der Lautsprecher ab.set BOSE_1234567890AB speakOff "Ab isn Bett." 30 en
Spricht die Meldung mit Lautstärke 30 und schaltet den Lautsprecher dann aus.autoAddDLNAServers 0|1
- 1=automatisch alle DLNA servers zur BOSE Bibliothek hinzufügen. Dieser Parameter ist nur für das Hauptmodul BOSEST, nicht für die Lautsprecher!n/a
staticIPs IP-Address [,IP-Address]
- Manuelle Angabe der IP Adresse(n). Sollte nur verwendet werden, wenn die automatiche Erkennung nicht funktioniert. (z.B. bei mehreren Sub-Netzwerken oder wenn Teile des Netzwerks manuell verbunden werden, ...) attr bosesystem staticIPs 192.168.1.52,192.168.1.53
speakChannel channel(s)
- Ansage des aktuellen Present vor der Wiedergabe, sinnvoll für SoundTouch Lautsprecher ohne Display (Angabe komma-separiert oder als Bereich: z.B. 2,3,5,6
oder 1-6
). TTS muss eingerichtet sein.auto-zone on|off
- "Überall Wiedergabe" automatisch starten, wenn Lautsprecher das gleiche wiedergeben ("contentItemLocation" ist identisch); (Standardwert: off)ttsDirectory "directory"
- Angabe des DLNA TTS Verzeichnisses. Der FHEM user muss Schreibrechte in diesem Verzeichnis haben.ttsLanguage en|de|xx
- Standardsprache für TTS setzen (default: en)ttsSpeakOnError 0|1
- 0= Ansage "not available" unterdrückenttsVolume [0...100] [+x|-x]
- Lautstärke setzen (direkt oder als ±x Differnez zur aktuellen Lautstärke)Channel_07 to Channel_20 name|location|source|[sourceAccount]
- Festlegen der Present 07 bis 20 define <name> BRAVIA <ip-or-hostname> [<poll-interval>]
set register
).
s_* | : Status |
ci_* | : Inhaltsinfo |
set <name> <option> <value>
ppm install Crypt-CBC
ppm install Crypt-OpenSSL-AES
sudo apt-get install libcrypt-cbc-perl
sudo apt-get install libcrypt-rijndael-perl
sudo cpan Crypt/OpenSSL/AES.pm
define <name> Broadlink <ip/host> <mac> <type=rmpro or rmmini or sp3 or sp3s>
define broadlinkWZ Broadlink 10.23.11.85 34:EA:34:F4:77:7B rmpro
set <name> <commandSend> <command name>
set <name> recordNewCommand <command name>
set <name> remove <command name>
set <name> rename <old command name> <new command name>
set <name> getTemperature
set <name> <commandSend> <command name>
set <name> recordNewCommand <command name>
set <name> remove <command name>
set <name> rename <old command name> <new command name>
set <name> on
set <name> off
set <name> toggle
set <name> getStatus
set <name> on
set <name> off
set <name> toggle
set <name> getStatus
set <name> getEnergy
socket_timeout
define <Name> CALVIEW <Kalendername(n) getrennt durch ','> <next> <updateintervall in sek (default 43200)>
define myView CALVIEW Googlekalender next
define myView CALVIEW Googlekalender,holiday next 900
set <Name> update
set myView update
define <name> CDCOpenData [<name>:]latitude,longitude>
define DWDRegen CDCOpenData ...
set <name> update
set <name> htmlBarAsStateFormat <on|off>
defmod <barName> weblink htmlCode {CDCOpenData_radar2html('<nameCDCDevice>', '<readingName_rain_radar>')}
get <name> rainbyLatLongDate [latitude,longitude] [date]
get <name> rainSinceMidnight [latitude,longitude]
get <name> rainRadar [latitude,longitude]
INTERVAL <seconds>
attr <name> verbose <0 .. 5>
attr <name> FhemLog3Std <0 | 1>
attr <name> clearRadarFileLog <name of FileLog device>
attr <name> RainRadarFileLog <name of FileLog device>
attr <name> ownRadarFileLog <0 | 1>
attr <name> cronTime <* * * * *>
attr <name> enableDWDdata <rainByDay, rainSinceMidnight, rainRadarbyLocation>
attr <name> locations <[name:]latitude,longitude> [[name:]<latitude,longitude>] ...
attr <name> nonblockingTimeOut <50|75|100|125>
attr <name> numberOfDays <0..9>
attr <name> updateOnStart <0 | 1>
define <name> COE_Node <CAN-Node ID>
define COE_Node_coe_2 COE_Node 2
1=Durchfluss_Solar 2=T.Solar_Rücklauf
1=Solarpumpe_Status 2=Wasserpumpe_Status
Der CUL/CUN(O) ist eine Familie von Funkempfängern, die von der Firma
Busware verkauft wird.
Mit der OpenSource Firmware
culfw können sie verschiedene
868 MHz Funkprotokolle empfangen bzw. senden (FS20/FHT/S300/EM/HMS/MAX!).
Man kann diese Geräte auch zur Reichweitenverlängerung, siehe
CUL_RFR einsetzen.
Einige Protokolle (FS20, FHT und KS300) werden von diesem Modul in das FHZ Format konvertiert, daher kann dasselbe logische Gerät verwendet werden, egal ob das Funktelegramm von einem CUL oder einem FHZ Gerät empfangen wird. Andere Protokolle (S300/EM) benötigen ihre eigenen Module. S300 Geräte werden vom Modul CUL_WS verarbeitet, wenn das Signal von einem CUL empfangen wurde, ähnliches gilt für EMWZ/EMGZ/EMEM: diese werden vom CUL_EM Modul verarbeitet. Es ist möglich mehr als ein Gerät zu verwenden, um einen besseren Empfang zu erhalten, FHEM filtert doppelte Funktelegramme aus. Bemerkung: Dieses Modul benötigt unter Umständen das Device::SerialPort bzw. Win32::SerialPort Modul,
wenn Sie das Gerät über USB anschließen und das
Betriebssystem unübliche Parameter für serielle Schnittstellen
setzt. |
![]() |
define <name> CUL <device> <FHTID>
modprobe usbserial vendor=0x03eb product=0x204b
Device::SerialPort
nicht benötigt und FHEM öffnet
die Schnittstelle mit einfachem Dateizugriff. Dies sollte dann
funktionieren, wenn das Betriebssystem vernünftige Standardwerte
für die serielle Schnittstelle verwendet, wie z.B. einige Linux
Distributionen oder OSX.fhtbuf
gibt den freien Speicher dieses Puffers (in hex)
zurück, ein leerer Puffer im CUL V2 hat 74 Byte, im CUL V3/CUN(O)
hat 200 Byte. Eine Telegramm benötigt 3 + 2x(Anzahl der FHT
Befehle) Byte, dies ist ein Grund, warum man mehrere FHT Befehle mit
einem set senden sollte. Ein weiterer Grund ist,
dass diese FHT Befehle in einem "Paket" zum FHT Gerät gesendet werden.
inform timer
in einer telnet Sitzung bzw. im
Event Monitor
Fenster im FHEMWEB Frontend.
2012-05-17 09:44:22.515 CUL CULHM RCV L:0B N:81 CMD:A258 SRC:......
DST:...... 0000 (TYPE=88,WAKEMEUP,BIDI,RPTEN)
# Keine langen IDs verwenden (Default Einstellung):
attr cul longids 0
# Immer lange IDs verwenden:
attr cul longids 1
# Verwende lange IDs für SD_WS07 Devices.
# Device Namen sehen z.B. so aus: SD_WS07_TH_3 for channel 3.
attr cul longids SD_WS07
attr CUN1 sendpool CUN1,CUN2,CUN3
attr CUN2 sendpool CUN1,CUN2,CUN3
attr CUN3 sendpool CUN1,CUN2,CUN3
define <name> CUL_EM <code> [corr1 corr2
CostPerUnit BasicFeePerMonth]
define emwz CUL_EM 1 75 900 0.15 12.50
CUM_DAY: 6.849 CUM: 60123.4 COST: 1.02
CUM_MONTH: 212.319 CUM: 60123.4 COST: 44.34
attr Gaszaehler CounterOffset 15427.434
define <name> CUL_FHTTK <devicecode>
<devicecode>
Ist eine sechstellige Hexadezimalzahl, welche zum Zeitpunkt der Produktion
des FHT80 TF gegeben wurde. Somit ist diese auch nicht mehr änderbar und bleibt auch nach einem Batteriewechsel
erhalten.define TK_TEST CUL_FHTTK 965AB0
set <name> <value>
value
folgendes sein kann:Closed
Open
Pair
ReSync
define <name> CUL_HM <6-digit-hex-code|8-digit-hex-code>
define livingRoomSwitch CUL_HM 123456
define LivingroomMainLight CUL_HM 12345601
define LivingroomBackLight CUL_HM 12345602
set mydimmer getRegRaw List1
set mydimmer getRegRaw List3 all
# Ausführung blockieren
set keymatic inhibit on
set myChannel peerBulk 12345601,
set myChannel peerBulk self01,self02,FB_Btn_04,FB_Btn_03,
set myChannel peerBulk 12345601 unset # entferne Peer 123456 Kanal 01
set myChannel regBulk RegL_00. 02:01 0A:17 0B:43 0C:BF 15:FF 00:00
RegL_03.FB_Btn_07
01:00 02:00 03:00 04:32 05:64 06:00 07:FF 08:00 09:FF 0A:01 0B:44 0C:54 0D:93 0E:00 0F:00 11:C8 12:00 13:00 14:00 15:00 16:00 17:00 18:00 19:00 1A:00 1B:00 1C:00 1D:FF 1E:93 1F:00 81:00 82:00 83:00 84:32 85:64 86:00 87:FF 88:00 89:FF 8A:21 8B:44 8C:54 8D:93 8E:00 8F:00 91:C8 92:00 93:00 94:00 95:00 96:00 97:00 98:00 99:00 9A:00 9B:00 9C:00 9D:05 9E:93 9F:00 00:00
set myblind regBulk 01 0B:10
set myblind regBulk 01 0C:00
set regSet ? 0 0
set regSet <regname> ? 0
define vRemote CUL_HM 100000 # die gewählte HMid darf nicht in Benutzung sein
set vRemote virtual 20 # definiere eine Fernbedienung mit 20 Knöpfen
set vRemote_Btn4 peerChan 0 <actorchannel> # verknüpft Knopf 4 und 5 mit dem gewählten Kanal
set vRemote_Btn4 press
set vRemote_Btn5 press long
set <name> on-till 20:32:10
set actor pressL FB_Btn01 # trigger long peer FB button 01
set actor pressL FB_chn-8 # trigger long peer FB button 08
set actor pressL self01 # trigger short des internen peers 01
set actor pressL fhem02 # trigger short des FHEM channel 2
set actor eventL md 30 # trigger vom Bewegungsmelder mit Wert 30
set myRemote peerChan 2 mySwActChn single set #Peer zweiten Knopf mit Aktorkanal
set myRmtBtn peerChan 0 mySwActChn single set #myRmtBtn ist ein Knopf der Fernbedienung. '0' wird hier nicht verarbeitet
set myRemote peerChan 2 mySwActChn dual set #Verknüpfe Knöpfe 3 und 4
set myRemote peerChan 3 mySwActChn dual unset #Entferne Peering für Knöpfe 5 und 6
set myRemote peerChan 3 mySwActChn dual unset aktor #Entferne Peering für Knöpfe 5 und 6 nur im Aktor
set myRemote peerChan 3 mySwActChn dual set remote #Verknüpfe Knöpfe 5 und 6 nur mit Fernbedienung. Linkeinstellungen mySwActChn werden beibehalten.
set 4Dis text 1 on On Lamp
set 4Dis text 1 off Kitchen Off
set 4Dis_chn4 text Kitchen Off
set th tempListSat 06:00 19 23:00 22.5 24:00 19
set controlParty 15 03-8-13 20:30 5-8-13 11:30
set th tempListSat 06:00 19 23:00 22.5 24:00 19
set th tempListSat prep 06:00 19 23:00 22.5 24:00 19
set th tempListSun prep 06:00 19 23:00 22.5 24:00 19
set th tempListMon prep 06:00 19 23:00 22.5 24:00 19
set th tempListTue exec 06:00 19 23:00 22.5 24:00 19
entities:room1
tempListSat>08:00 16.0 15:00 18.0 21:30 19.0 24:00 14.0
tempListSun>08:00 16.0 15:00 18.0 21:30 19.0 24:00 14.0
tempListMon>07:00 16.0 16:00 18.0 21:00 19.0 24:00 14.0
tempListTue>07:00 16.0 13:00 16.0 16:00 18.0 21:00 19.0 24:00 15.0
tempListWed>07:00 16.0 16:00 18.0 21:00 19.0 24:00 14.0
tempListThu>07:00 16.0 16:00 18.0 21:00 19.0 24:00 14.0
tempListFri>07:00 16.0 13:00 16.0 16:00 18.0 21:00 19.0 24:00 14.0
entities:room2
tempListSat>08:00 14.0 15:00 18.0 21:30 19.0 24:00 14.0
tempListSun>08:00 14.0 15:00 18.0 21:30 19.0 24:00 14.0
tempListMon>07:00 14.0 16:00 18.0 21:00 19.0 24:00 14.0
tempListTue>07:00 14.0 13:00 16.0 16:00 18.0 21:00 19.0 24:00 15.0
tempListWed>07:00 14.0 16:00 18.0 21:00 19.0 24:00 14.0
tempListThu>07:00 14.0 16:00 18.0 21:00 19.0 24:00 14.0
tempListFri>07:00 14.0 13:00 16.0 16:00 18.0 21:00 19.0 24:00 14.0
Specials:
set cfm_Mp3 playTone 3 # MP3 Titel 3 einmal
set cfm_Mp3 playTone 3 3 # MP3 Titel 3 dreimal
set cfm_Mp3 playTone 3 1 5 # MP3 Titel 3 mit halber Lautstärke
set cfm_Mp3 playTone 3,6,8,3,4 # MP3 Titelfolge 3,6,8,3,4 einmal
set cfm_Mp3 playTone 3,6,8,3,4 255# MP3 Titelfolge 3,6,8,3,4 255 mal
set cfm_Mp3 playTone replay # Wiederhole letzte Sequenz
set cfm_Led led redL 4 # rote LED dreimal lang blinken
set cfm_Led led redS,redS,redS,redL,redL,redL,redS,redS,redS 255 # SOS 255 mal
# "Hello" auf dem Display, Symbol bulb an, Hintergrundbeleuchtung, Ton ausgeben
set FB1 display Hello no off 1 on bulb
# "1234,5" anzeigen mit Einheit 'W'. Symbole scene,phone,bell und
# clock sind aktiv. Hintergrundbeleuchtung blinikt schnell, Ausgabe von Ton 2
set FB1 display 12345 comma Watt 2 fast scene,phone,bell,clock
set disp01 displayWM short txt02_2 green noIcon txt10_1 red error txt05_2 yellow closed txt02_2 orange open
set disp01 displayWM long line3 txt02_2 green noIcon
set disp01 displayWM long line2 nc yellow noIcon
set disp01 displayWM long line6 txt02_2
set disp01 displayWM long line1 nc nc closed
setRepeat setAll 0 0 0
schreibt die gesamte Liste der Geräte neu. Daten kommen vom Attribut repPeers. set hm1 raw ++A001F100001234560105000000001
Empfohlene Arbeitsfolge für ein Gerät 'HMdev':
set HMdev clear msgEvents # alte Events löschen um Daten besser kontrollieren zu können
set HMdev getConfig # Geräte- und Kanalinformation auslesen
# warten bis Ausführung abgeschlossen ist
# "protState" sollte dann "CMDs_done" sein
# es sollten keine Warnungen zwischen "prot" und den Variablen auftauchen
get configSave myActorFile
attr myDevice readingOnDead noChange,state # kein dead marking - noChange hat Prioritaet
attr myDevice readingOnDead state,periodValues,channels # Empfohlen. Reading state des device und aller seiner Kanäle werden auf 'dead' gesetzt.
Periodische nummerische werden werden auf 0 gesetzt was Auswirkungen auf die Grafiken hat.
attr myDevice readingOnDead state,channels # Reading state des device und aller seiner Kanäle werden auf 'dead' gesetzt.
attr myDevice readingOnDead periodValues,channels # Numerische periodische Readings des Device und der Kanaele werden auf '0' gesetzt
attr myDevice readingOnDead state,deviceMsg,CommandAccepted # beim Eintreten in dead state,deviceMsg und CommandAccepted des Device werden, wenn verfuegbar, auf 'dead' gesetzt.
attr myDevice1 IOgrp vccu
attr myDevice2 IOgrp vccu:prefIO1,prefIO2,prefIO3
attr myDevice2 IOgrp vccu:prefIO1,prefIO2,none
attr myChannel levelRange 0,40
attr myChannel levelRange 10,80
attr CUL0 rfmode MAX
.define <name> CUL_MAX <addr>
define <name> CUL_WS <code> [corr1...corr4]
CULflash [fhem-device|none]; <TYPE>
CULflash CUL CUL_V3
CULflash none CUL_V3
define <name> Calendar ical url <URL> [<interval>]
define <name> Calendar ical file <FILENAME> [<interval>]
https://
, muss das Perl-Modul IO::Socket::SSL
installiert sein
(use cpan -i IO::Socket::SSL
).<URL>
kann %-wildcards der POSIX
strftime-Funktion des darunterliegenden OS enthalten (siehe auch strftime
Beschreibung).
Allgemein gebräuchliche Wildcards sind:
%d
Tag des Monats (01..31)%m
Monat (01..12)%Y
Jahr (1970...)%w
Wochentag (0..6); beginnend mit Sonntag (0)%j
Tag des Jahres (001..366)%U
Wochennummer des Jahres, wobei Wochenbeginn = Sonntag (00..53)%W
Wochennummer des Jahres, wobei Wochenbeginn = Montag (00..53)https://
beginnen und das Perl-Modul IO::Socket::SSL
ist nicht auf deinem System installiert,
kannst Du in der URL https://
durch http://
ersetzen, falls keine automatische Umleitung auf die https://
URL erfolgt.
Solltest Du unsicher sein, ob dies der Fall ist, überprüfe es bitte zuerst mit deinem Browser.https://admin:admin@demo.nextcloud.com/wid0ohgh/remote.php/dav/calendars/admin/personal/?export
.
Der optionale Parameter interval
bestimmt die Zeit in Sekunden zwischen den Updates. Default-Wert ist 3600 (1 Stunde).
Eine Intervallangabe von 0 ist nicht erlaubt. Diese wird automatisch durch den Standardwert 3600 ersetzt und im Log protokolliert.
Beispiele:
define MeinKalender Calendar ical url https://www.google.com/calendar/ical/john.doe%40example.com/private-foo4711/basic.ics define DeinKalender Calendar ical url http://www.google.com/calendar/ical/jane.doe%40example.com/private-bar0815/basic.ics 86400 define IrgendeinKalender Calendar ical file /home/johndoe/calendar.ics
cutoffOlderThan
und cutoffLaterThan
noch verkleinert werden.
Dies kann zur Folge haben, dass Termine jenseits dieses Horizonts niemals erstellt werden,
solange der Kalender nicht neu initialisiert wird (set ... reload
oder Neustart von FHEM)
oder der VEVENT-Datensatz nicht verändert wird.
Daher sollte ab und zu ein erzwungenes Neuladen eingeplant werden.
set <name> update
interval
Sekunden später.set <name> reload
update
, jedoch werden zuerst alle Termine entfernt.get <name> update
set <name> update
get <name> reload
set <name> reload
get <name> events [format:<formatSpec>] [timeFormat:<timeFormatSpec>] [filter:<filterSpecs>]
[series:next[=<max>]] [limit:<limitSpecs>]
[include:<names>]
[returnType:<returnTypeSpec>]
format
,
timeFormat
, filter
, series
und limit
können angegeben werden, weiterhin ist es sinnvoll, den Parameter filter
mehrere Male anzugeben.
format
legt den zurückgegeben Inhalt fest.<formatSpec> | Beschreibung |
---|---|
default | Standardformat (siehe unten) |
full | entspricht custom="$U $M $A $T1-$T2 $S $CA $L" |
text | entspricht custom="$T1 $S" |
custom="<formatString>" | ein spezifisches Format (siehe unten) |
custom="{ <perl-code> }" | ein spezifisches Format (siehe unten) |
'
) können anstelle von doppelten Anführungszeichen ("
) innerhalb
eines spezifischen Formats benutzt werden.
Folgende Variablen können in <formatString>
und in
<perl-code>
verwendet werden:
variable | Bedeutung |
---|---|
$t1 | Startzeit in Sekunden |
$T1 | Startzeit entsprechend Zeitformat |
$t2 | Endzeit in Sekunden |
$T2 | Endzeit entsprechend Zeitformat |
$a | Alarmzeit in Sekunden |
$A | Alarmzeit entsprechend Zeitformat |
$d | Dauer in Sekunden |
$D | Dauer in menschenlesbarer Form |
$S | Zusammenfassung |
$L | Ortsangabe |
$CA | Kategorien |
$CL | Klassifizierung |
$DS | Beschreibung |
$U | UID |
$M | Modus |
format
ausgelassen, dann wird die Formatierung
aus defaultFormat
benutzt. Ist dieses Attribut nicht gesetzt, wird "$T1 $D $S"
als Formatierung benutzt.
Das letzte Auftreten von format
gewinnt bei mehrfacher Angabe.
get MyCalendar events format:full
get MyCalendar events format:custom="$T1-$T2 $S \@ $L"
get MyCalendar events format:custom={ sprintf("%20s %8s", $S, $D) }
timeFormat
legt das Format für die Start-,
End- und Alarmzeiten fest.<timeFormatSpec>
kann die POSIX-Spezifikation verwendet werden.
Auf strftime.net gibt es ein Tool zum Erstellen von
<timeFormatSpec>
.timeFormat
ausgelassen, dann wird die Formatierung
aus defaultTimeFormat
benutzt. Ist dieses Attribut nicht gesetzt, dann
wird "%d.%m.%Y %H:%M"
als Formatierung benutzt.
Zum Umschließen der Formatangabe können einfache ('
) oder
doppelte ("
) Anführungszeichen verwendet werden.timeFormat
gewinnt bei mehrfacher Angabe.
get MyCalendar events timeFormat:"%e-%b-%Y" format:full
filter
schränkt die Anzeige der Termine ein.
<filterSpecs>
ist eine kommaseparierte Liste von
<filterSpec>
-Angaben.
Alle Filterangaben müssen zutreffen, damit ein Termin angezeigt wird.
Die Angabe ist kumulativ: jeder angegebene Filter wird zur Filterliste hinzugef&uum;gt
und ber&uum;cksichtigt.<filterSpec> | Beschreibung |
---|---|
uid=="<uid>" | UID ist <uid> entspricht field(uid)=="<uid>" |
uid=~"<regex>" | Der reguläre Ausdruck <regex> entspricht der UIDentspricht field(uid)=~"<regex>" |
mode=="<mode>" | Modus ist <mode> entspricht field(mode)=="<mode>" |
mode=~"<regex>" | Der reguläre Ausdruck <regex> entspricht mode entspricht field(mode)=~"<regex>" |
field(<field>)=="<value>" | Inhalt von <field> ist <value> <field> ist eines von uid , mode , summary , location ,
description , categories , classification
|
field(<field>)=~"<regex>" | Inhalt von <field> entspricht dem regulären Ausdruck <regex> <field> ist eines von uid , mode , summary , location ,
description , categories , classification |
<filterSpec>
sind nicht
Teil des regulären Ausdrucks. Es können stattdessen einfache Anführungszeichen verwendet werden.
get MyCalendar events filter:uid=="432dsafweq64yehdbwqhkd"
get MyCalendar events filter:uid=~"^7"
get MyCalendar events filter:mode=="alarm"
get MyCalendar events filter:mode=~"alarm|upcoming"
get MyCalendar events filter:field(summary)=~"Mama"
get MyCalendar events filter:field(classification)=="PUBLIC"
get MyCalendar events filter:field(summary)=~"Gelber Sack",mode=~"upcoming|start"
get MyCalendar events filter:field(summary)=~"Gelber Sack" filter:mode=~"upcoming|start"
series
bestimmt die Anzeige von wiederkehrenden
Terminen. series:next
begrenzt die Anzeige auf den nächsten Termin
der noch nicht beendeten Termine innerhalb der Serie. series:next=<max>
zeigt die nächsten <max>
Termine der Serie. Dies gilt pro Serie.
Zur Begrenzung der Anzeige siehe den limit
-Parameter.limit
begrenzt die Anzeige der Termine.
<limitSpecs>
ist eine kommaseparierte Liste von <limitSpec>
Angaben.
<limitSpec> | Beschreibung |
---|---|
count=<n> | zeigt <n> Termine, wobei <n> eine positive Ganzzahl (integer) ist |
from=[+|-]<timespec> | zeigt nur Termine die nach einer Zeitspanne <timespec> ab jetzt enden; Minuszeichen für Termine in der Vergangenheit benutzen; <timespec> wird weiter unten im Attribut-Abschnitt beschrieben. |
to=[+|-]<timespec> | zeigt nur Termine die vor einer Zeitspanne <timespec> ab jetzt starten; Minuszeichen für Termine in der Vergangenheit benutzen; <timespec> wird weiter unten im Attribut-Abschnitt beschrieben. |
when=today|tomorrow | zeigt anstehende Termin für heute oder morgen an |
when=<D1> | zeigt Termine für Tag <D1> von heute an, <D1>= 0 steht für heute, negative Werte sind erlaubt |
when=<D1>..<D2> | zeigt Termine für den Tagesbereich von Tag <D1> bis Tag <D2> von heute an |
get MyCalendar events limit:count=10
get MyCalendar events limit:from=-2d
get MyCalendar events limit:when=today
get MyCalendar events limit:count=10,from=0,to=+10d
include
Parameter schließt Termine aus anderen Kalendern ein. Das ist nützlich,
um Termine aus anderen Kalendern in einer kombimierten Ausgabe anzuzeigen.
<names>
ist eine mit Kommas getrennte Liste der Namen von Calendar-Geräten.
Der Name des Kalenders selbst sowie Duplikate werden stillschweigend ignoriert. Namen von Geräten, die
es nicht gibt oder keine Calendar-Geräte sind, werden ignoriert und es wird eine Fehlermeldung ins Log
geschrieben.get MyCalendar events include:Feiertage,Müllabfuhr
returnType
wird verwendet, um die Termine als ein bestimmter Typ
zurückzugeben. Das ist nützlich für Perl-Skripte.<returnTypeSpec> | Beschreibung |
---|---|
$text | ein mehrzeiliger String in menschenlesbarer Darstellung (Vorgabe) |
@texts | ein Array von Strings in menschenlesbarer Darstellung |
@events | ein Array von Calendar::Event-Hashs |
get <name> find <regexp>
get <name> vcalendar
get <name> vevents
defaultFormat <formatSpec>
get <name> events
.
Der Aufbau wird dort erklät. <formatSpec> muss in doppelte
Anführungszeichen (") gesetzt werden, wie z.B. attr myCalendar defaultFormat "$T1 $D $S"
.defaultTimeFormat <timeFormatSpec>
get <name> events
.
Der Aufbau wird dort erklät. <timeFormatSpec> nicht in Anführungszeichen setzten. synchronousUpdate 0|1
update none|onUrlChanged
none
gesetzt ist, wird der Kalender überhaupt nicht aktualisiert.onUrlChanged
gesetzt ist, wird der Kalender nur dann aktualisiert, wenn sich die
URL seit dem letzten Aufruf verändert hat, insbesondere nach der Auswertung von wildcards im define.
delay <time>
timeout <time>
removevcalendar 0|1
get <name> vcalendar
ist dann nicht mehr möglich.
hideOlderThan <timespec>
hideLaterThan <timespec>
Dieses Attribut grenzt die Liste der durch get <name> full|debug|text|summary|location|alarm|start|end ...
gezeigten Termine ein.
Die Zeit wird relativ zur aktuellen Zeit t angegeben.
Wenn <hideOlderThan> gesetzt ist, werden Termine, die vor <t-hideOlderThan> enden, ingnoriert.
Wenn <hideLaterThan> gesetzt ist, werden Termine, die nach <t+hideLaterThan> anfangen, ignoriert.
Bitte beachte, dass eine Aktion, die durch einen Wechsel in den Modus "end" ausgelöst wird, nicht auf den Termin
zugreifen kann, wenn hideOlderThan
0 ist, denn der Termin ist dann schon versteckt. Setze hideOlderThan
besser auf 10.
<timespec>
muss; einem der folgenden Formate entsprechen:
Format | Beschreibung | Beispiel |
---|---|---|
SSS | Sekunden | 3600 |
SSSs | Sekunden | 3600s |
HH:MM | Stunden:Minuten | 02:30 |
HH:MM:SS | Stunden:Minuten:Sekunden | 00:01:30 |
D:HH:MM:SS | Tage:Stunden:Minuten:Sekunden | 122:10:00:00 |
DDDd | Tage | 100d |
cutoffOlderThan <timespec>
cutoffLaterThan <timespec>
cutoffOlderThan
vor bzw. cutoffLaterThan
nach der letzten Aktualisierung des Kalenders enden.
Der Zweck dieses Attributs ist
es Speicher und Verarbeitungszeit zu
sparen. Auf solche Termine kann gar nicht mehr aus FHEM heraus zugegriffen
werden.
onCreateEvent <perl-code>
SSLVerify
ignoreCancelled
hasModeReadings
quirks <values>
<values>
ist
eine kommaseparierte Liste der folgenden Schlüsselwörter:
ignoreDtStamp
: wenn gesetzt, dann zeigt
ein verändertes DTSTAMP Attribut eines Termins nicht an, dass;
der Termin verändert wurde.noWildcards
: wenn gesetzt, werden Wildcards in der
URL des Kalenders nicht ersetzt.
Termine werden erzeugt, wenn FHEM gestartet wird oder der betreffende Eintrag im Quell-Kalender verändert
wurde oder der Kalender mit get <name> reload
neu geladen wird. Es werden nur Termine
innerhalb ±400 Tage um die Erzeugungs des Termins herum erzeugt. Ziehe in Betracht, den Kalender von Zeit zu Zeit
neu zu laden, um zu vermeiden, dass; FHEM die künftigen Termine ausgehen. Du kann so etwas wie define reloadCalendar at +*240:00:00 set MyCalendar reload
dafür verwenden.
Manche dumme Kalender benutzen LAST-MODIFIED nicht. Das kann dazu führen, dass Veränderungen im Quell-Kalender unbemerkt bleiben. Lade den Kalender neu, wenn Du dieses Problem hast.
Ein Termin wird durch seine UID identifiziert. Die UID wird vom Quellkalender bezogen. Um das Leben leichter zu machen, werden alle nicht-alphanumerischen Zeichen automatisch aus der UID entfernt.
Ein Termin kann sich in einem der folgenden Modi befinden:
upcoming | Weder die Alarmzeit noch die Startzeit des Kalendereintrags ist erreicht. |
alarm | Die Alarmzeit ist überschritten, aber die Startzeit des Kalender-Ereignisses ist noch nicht erreicht. |
start | Die Startzeit ist überschritten, aber die Ende-Zeit des Kalender-Ereignisses ist noch nicht erreicht. |
end | Die Endzeit des Kalender-Ereignisses wurde überschritten. |
Aus Gründen der Abwärtskompatibilität werden mode-Readings gefüllt, wenn das Attribut hasModeReadings
gesetzt ist.
Der Rest dieser Beschreibung bezieht sich auf diese veralteten mode-Readings.
Ein Kalender-Device hat verschiedene mode-Readings. Jedes mode-Reading stellt eine semikolonseparierte Liste aus UID von Kalender-Ereignisse dar, welche bestimmte Zustände haben:
calname | Name des Kalenders |
modeAlarm | Ereignisse im Alarm-Modus |
modeAlarmOrStart | Ereignisse im Alarm- oder Startmodus |
modeAlarmed | Ereignisse, welche gerade in den Alarmmodus gewechselt haben |
modeChanged | Ereignisse, welche gerade in irgendeiner Form ihren Modus gewechselt haben |
modeEnd | Ereignisse im Endmodus |
modeEnded | Ereignisse, welche gerade vom Start- in den Endmodus gewechselt haben |
modeStart | Ereignisse im Startmodus |
modeStarted | Ereignisse, welche gerade in den Startmodus gewechselt haben |
modeUpcoming | Ereignisse im zukünftigen Modus |
Für Serientermine werden mehrere Termine mit identischer UID erzeugt. In diesem Fall wird die UID nur im interessantesten gelesenen Modus-Reading angezeigt. Der interessanteste Modus ist der erste zutreffende Modus aus der Liste der Modi start, alarm, upcoming, end.
Die UID eines Serientermins wird nicht angezeigt, solange sich der Termin im Modus: modeEnd oder modeEnded befindet und die Serie nicht beendet ist. Die UID befindet sich in einem der anderen mode... Readings. Hieraus ergibts sich, das FHEM-Events nicht auf einem mode... Reading basieren sollten. Weiter unten im Text gibt es hierzu eine Empfehlung.
triggered
Man kann sich darauf verlassen, dass alle Readings des Kalenders in einem konsistenten und aktuellen
Zustand befinden, wenn dieses Event empfangen wird.
Wenn ein Termin geändert wurde, werden zwei FHEM-Events erzeugt:
changed: UID <mode>
<mode>: UID
<mode> ist der aktuelle Modus des Termins nach der änderung. Bitte beachten: Im FHEM-Event befindet sich ein Doppelpunkt gefolgt von einem Leerzeichen.
FHEM-Events sollten nur auf den vorgenannten Events basieren und nicht auf FHEM-Events, die durch ändern eines mode... Readings ausgelöst werden.
Ein Plug-In ist ein kleines Perl-Programm, das Termine nebenher verändern kann.
Das Perl-Programm arbeitet mit der Hash-Referenz $e
.
Die wichtigsten Elemente sind:
code | Beschreibung |
---|---|
$e->{start} | Startzeit des Termins, in Sekunden seit 1.1.1970 |
$e->{end} | Endezeit des Termins, in Sekunden seit 1.1.1970 |
$e->{alarm} | Alarmzeit des Termins, in Sekunden seit 1.1.1970 |
$e->{summary} | die Zusammenfassung (Betreff, Titel) des Termins |
$e->{location} | Der Ort des Termins |
attr MyCalendar onCreateEvent { $e->{alarm}= $e->{start}-86400 if($e->{summary} =~ /Tonne/);; }
attr MyCalendar onCreateEvent { $e->{end}= $e->{start}+86400 unless(defined($e->{end})) }
get MyCalendar events format:full
2767324dsfretfvds7dsfn3e4dsa234r234sdfds6bh874googlecom alarm 31.05.2012 17:00:00 07.06.2012 16:30:00-07.06.2012 18:00:00 Erna for coffee
992hydf4y44awer5466lhfdsrgl7tin6b6mckf8glmhui4googlecom upcoming 08.06.2012 00:00:00-09.06.2012 00:00:00 Vacation
text 20 60 { fhem("get MyCalendar events timeFormat:'%d.%m.%Y %H:%M' format:custom='$T1 $S' filter:mode=~'alarm|start') }
07.06.12 16:30 Erna zum Kaffee
08.06.12 00:00 Urlaub
get MyCalendar find .*Erna.*
2767324dsfretfvds7dsfn3e4dsa234r234sdfds6bh874googlecom
define ErnaComes notify MyCalendar:start:.2767324dsfretfvds7dsfn3e4dsa234r234sdfds6bh874googlecom.* set MyLight on
define LogErna notify MyCalendar:alarm:.2767324dsfretfvds7dsfn3e4dsa234r234sdfds6bh874googlecom.* { Log3 $NAME, 1, "ALARM name=$NAME event=$EVENT part1=$EVTPART0 part2=$EVTPART1" }
define SwitchActorOn notify MyCalendar:start:.* { \
my $reading="$EVTPART0";; \
my $uid= "$EVTPART1";; \
my $actor= fhem('get MyCalendar events filter:uid=="'.$uid.'" format:custom="$S"');; \
if(defined $actor) {
fhem("set $actor on")
} \
}
define SwitchActorOff notify MyCalendar:end:.* { \
my $reading="$EVTPART0";; \
my $uid= "$EVTPART1";; \
my $actor= fhem('get MyCalendar events filter:uid=="'.$uid.'" format:custom="$S"');; \
if(defined $actor) {
fhem("set $actor off")
} \
}
define LogActors notify MyCalendar:(start|end):.*
{ my $reading= "$EVTPART0";; my $uid= "$EVTPART1";; \
my $actor= fhem('get MyCalendar events filter:uid=="'.$uid.'" format:custom="$S"');; \
Log3 $NAME, 1, "Actor: $actor, Reading $reading" }
GarbageCalendar
beinhaltet alle Termine der
Müllabholung mit der Art des Mülls innerhalb der Zusammenfassung (summary).
Das folgende notify kann zur Benachrichtigung über die Müllabholung
benutzt werden:
define GarbageCollectionNotifier notify GarbageCalendar:alarm:.* { \
my $uid= "$EVTPART1";; \
my $summary= fhem('get GarbageCalendar events filter:uid=="'.$uid.'" format:custom="$S"');; \
# e.g. mail $summary to someone \
}
attr GarbageCalendar onCreateEvent { $e->{alarm}= $e->{start}-86400 }
{ CalendarEventsAsHtml('GarbageCalendar','format:text filter:mode=~"alarm|start"') }
CalendarAsHtml(<name>,<parameter>)
liefert eine Liste von Kalendereinträgen als
HTML zurück. <name>
ist der Name des Kalender-Devices; <parameter>
würdest Du nach get <name> text ...
schreiben. Diese Funktion ist veraltert
und sollte nicht mehr genutzt werden!.
define MyCalendarWeblink weblink htmlCode { CalendarAsHtml("MyCalendar","next 3") }
CalendarEventsAsHtml(<name>,<parameter>)
liefert eine Liste von Kalender-Events
zurück; zu name
und parameters
siehe oben.
define MyCalendarWeblink weblink htmlCode
{ CalendarEventsAsHtml('F','format:custom="$T1 $D $S" timeFormat:"%d.%m" series:next=3') }
define <name> CanOverEthernet
define coe CanOverEthernet
set sendDataAnalog <Target-IP> <CAN-Channel> <Index>=<Value>;<Type>
set coe sendDataAnalog 192.168.1.1 3 1=22.7;1 2=18.0;1
set sendDataDigital <Target-IP> <CAN-Channel> <Index>=<Value>
set coe sendDataDigital 192.168.1.1 3 1=1 2=0
define <name> DENON_AVR <ip-address-or-hostname[:PORT]>
define <name> DENON_AVR <devicename[@baudrate]>
define avr DENON_AVR 192.168.0.10
# Unter Angabe eines bestimmten Ports
define avr DENON_AVR 192.168.0.10:23
# Mit serieller Schnittstelle
define avr DENON_AVR /dev/ttyUSB0@9600
set <name> <command> [<parameter>]
Rockantenne<>http://mp3channels.webradio.antenne.de/rockantenne
Bayern3<>http://streams.br.de/bayern3_2.m3u
JamFM<>http://www.jam.fm/streams/jam-nmr-mp3.m3u
get <name> <what>
define <name> DENON_AVR_ZONE <zonename[:PORT]>
define avr_zone2 DENON_AVR_ZONE 2
define avr_zone3 DENON_AVR_ZONE 3
set <name> <command> [<parameter>]
get <name> <what>
define <name> DFPlayerMini {none | devicename[\@baudrate] | devicename\@directio | hostname:port}
none
als Device angegeben werden.
In diesem Fall sollte das Attribute sendCmd
angegeben werden. Antworten vom DFPlayer sollten per set response
zurück an dieses Module übergeben werden.
attr <dfp> sendCmd set mys_dfp value11 $msg
set mys_dfp value11 <payload>
set response
für einen Weg um die Antwort des DFPlayers zurück an dieses Modul zu senden.
tts
Kommandos ohne eine passende Datei ein spezielles Reading. Siehe set tts
und set uploadTTScache
.
get | DFP cmd byte | Parameter | Kommentar |
---|---|---|---|
storage | 0x3F | ||
status | 0x42 | ||
volume | 0x43 | ||
equalizer | 0x44 | ||
noTracksRootUsb | 0x47 | ||
noTracksRootSd | 0x48 | ||
currentTrackUsb | 0x4B | ||
currentTrackSd | 0x4C | ||
noTracksInFolder | 0x4E | Verzeichnisnummer | 1-99 |
noFolders | 0x4F |
set | DFP cmd byte | Parameter | Kommentar |
---|---|---|---|
next | 0x01 | - | |
prev | 0x02 | - | |
trackNum | 0x03 | Nummer der Datei im Wurzelverzeichnis | zwischen 1 und 3000 (es wird die Reihenfolge verwendet in der die Dateien angelegt wurden!) |
volumeUp | 0x04 | - | |
volumeDown | 0x05 | - | |
volumeStraight | 0x06 | Lautstärke | 0-30 |
equalizer | 0x07 | Name des Equalizermodus | Normal, Pop, Rock, Jazz, Classic, Bass |
repeatSingle | 0x08 | - | |
storage | 0x09 | SD oder USB | |
sleep | 0x0A | - | vom DFP nicht unterstützt, danach muss er stromlos gemacht werden um wieder zu funktionieren |
wake | 0x0B | - | vom DFP nicht unterstützt, aber wahrscheinlich vom FN-M22P |
reset | 0x0C | - | |
play | 0x0D | - | spielt die aktuelle Datei |
play | 0x0F, 0x12, 0x13, 0x14 | Eine durch Leerzeichen getrennte Liste von Dateien die nacheinander abgespielt werden | Das korrekte DFP Kommando wird automatisch ermittelt. Dateien können über den Namen ihres Readings, den Readingwert oder Verzeichnisname/Dateinummer angegeben werden. Siehe set readFiles |
pause | 0x0E | - | |
amplification | 0x10 | Verstärkungsstufe | 0-31 |
repeatRoot | 0x11 | on, off | |
MP3TrackNum | 0x12 | Dateinummer | 1-3000, aus dem Verzeichnis MP3 |
intercutAdvert | 0x13 | Dateinummer | 1-3000, aus dem Verzeichnis ADVERT |
folderTrackNum | 0x0F | Verzeichnisnummer Dateinummer | Verzeichnis: 1-99, Datei: 1-255 |
folderTrackNum3000 | 0x14 | Verzeichnisnummer Dateinummer | Verzeichnis: 1-15, Datei: 1-3000 |
stopAdvert | 0x15 | - | |
stop | 0x16 | - | |
repeatFolder | 0x17 | Verzeichnisnummer | 1-99 |
shuffle | 0x18 | - | |
repeatCurrentTrack | 0x19 | on, off | |
DAC | 0x1A | on, off |
uploadPath
gemounted ist. Wenn diese Dateien durch den DFP addressiert werden
können (d.h. sie entprechen den Namenskonventionen) so wird ein Reading dafür angelegt.
Der Readingname ist File_<Verzeichnis>/<Dateinummer>.
Das Verzeichnis kann ., MP3, ADVERT oder 00 bis 99 sein.
Der Readingwert ist der Dateiname ohne die Dateinummer und das Suffix.set <dfp> play
Kommando kann diese Readings verwenden, d.h. es ist möglich entweder set <dfp> play File_MP3/0003
,
set <dfp> play MP3/3
oder set <dfp> play SongTitle
zu verwenden, um die selbe Datei abzuspielen.
TTSDev
angegebene wurde.
Die MP3 Datei wird dann in das angegebene Zielverzeichnis unterhalb von uploadPath kopiert.
set <dfp> 01/0001Test Dies ist ein Test
set <dfp> ADVERT/0099Hinweis Achtung
TTSDev
in uploadPath
. Es wird zuerst in das Verzeichnis 01 kopiert.
Nach 3000 Dateien wird das nächste Verzeichnis verwendet. Der MD5 Hash wird als Dateiname verwendet. Zum Schluss wird set readFiles
ausgeführt.
Das Kommando set tts
verwendet die dadurch angelegten Readings.
TTSDev
wird verwendet um den MD5 Hash von <Text der in Sprache übersetzt werden soll> zu berechnen. Anschließend wird versucht die Datei mit diesem Hash abzuspielen.
Wenn kein Reading für diesen Hash existiert und das wenn das Attribute rememberMissingTTS
gesetzt ist dann wird ein neues Reading Missing_MD5<md5>
mit dem Wert <Text der in Sprache übersetzt werden soll> angelegt.
set uploadTTScache
kopiert werden
set <dfp> uploadNumbers 99
sayNumber -34.7
play minus vier und dreissig komma sieben
define <name> DOIF (<Bedingung>) (<Befehle>) DOELSEIF (<Bedingung>) (<Befehle>) DOELSEIF ... DOELSE (<Befehle>)
define di_rc_tv DOIF ([remotecontol:"on"]) (set tv on) DOELSE (set tv off)
define di_clock_radio DOIF ([06:30|Mo Di Mi] or [08:30|Do Fr Sa So]) (set radio on) DOELSEIF ([08:00|Mo Di Mi] or [09:30|Do Fr Sa So]) (set radio off)
define di_lamp DOIF ([06:00-09:00] and [sensor:brightness] < 40) (set lamp on) DOELSE (set lamp off)
state
initialize
define di_Modul DOIF ([Switch1] eq "on" and [Switch2] eq "on") | ## wenn Schalter 1 und Schalter 2 on ist |
(set lamp on) | ## wird Lampe eingeschaltet |
DOELSE | ## im sonst-Fall, also wenn einer der Schalter off ist |
(set lamp off) | ## wird die Lampe ausgeschaltet |
{ if ([Switch1] eq "on" and [Switch2] eq "on") { | ## wenn Schalter 1 und Schalter 2 on ist |
fhem_set "lamp on" | ## wird Lampe eingeschaltet |
} else { | ## im sonst-Fall, also wenn einer der Schalter off ist |
fhem_set "lamp off" | ## wird die Lampe ausgeschaltet |
} | |
} |
==, !=, <, <=, >, >=
bei Zahlen und mit eq, ne, lt, le, gt, ge, =~, !~
bei Zeichenketten angegeben.
Logische Verknüpfungen sollten zwecks Übersichtlichkeit mit and
bzw. or
vorgenommen werden.
Die Reihenfolge der Auswertung wird, wie in höheren Sprachen üblich, durch runde Klammern beeinflusst.
Status werden mit [<devicename>]
, Readings mit [<devicename>:<readingname>]
,
Internals mit [<devicename>:&<internal>]
angegeben.define di_garage DOIF ([remotecontrol] eq "on") (set garage on) DOELSEIF ([remotecontrol] eq "off") (set garage off)
attr di_garage do always
define di_heating DOIF ([sens:temperature] < 20) (set heating on)
do always
nicht sinnvoll, da das entsprechende Kommando hier: "set heating on" jedes mal ausgeführt wird,
wenn der Temperatursensor in regelmäßigen Abständen eine Temperatur unter 20 Grad sendet.
Ohne do always
wird hier dagegen erst wieder "set heating on" ausgeführt, wenn der Zustand des Moduls auf "cmd_2" gewechselt hat, also die Temperatur zwischendurch größer oder gleich 20 Grad war.define di_heating DOIF {if ([sens:temperature] < 20) {if (Value("heating") ne "on") {fhem_set"heating on"}}}
=~
vorgenommen werden.define di_garage DOIF ([remotecontrol] =~ "Long") (set garage on)
attr di_garage do always
define di_garage DOIF {if ([remotecontrol] =~ "Long") {fhem_set"garage on"}}
=~
, insbesondere in Verbindung mit regulären Ausdrücken, können in der Perl-Dokumentation nachgeschlagen werden.[<devicename>:"<regex>"]
define di_garage DOIF ([remotecontrol:"on"]) (set garage on) DOELSEIF ([remotecontrol:"off"]) (set garage off)
define di_garage DOIF {if ([remotecontrol:"on"]) {fhem_set"garage on"} elsif ([remotecontrol:"off"]) {fhem_set"garage off"}}
[<devicename>:?<regex>]
wird aus Kompatibilitätsgründen noch unterstützt, sollte aber nicht mehr benutzt werden.["<device regex>:<event regex>"]
define di_window_open DOIF (["^window_:open"]) (set Pushover msg 'alarm' 'open windows $DEVICE' '' 2 'persistent' 30 3600)
attr di_window_open do always
define di_window_open DOIF {if (["^window_:open"]) {fhem_set"Pushover msg 'alarm' 'open windows $DEVICE' '' 2 'persistent' 30 3600"}}
["regex for trigger",<default value>]
define di_warning DOIF ([":^temperature",0] < 0) (set pushmsg danger of frost $DEVICE)
attr di_warning do always
define di_warning DOIF {if ([":^temperature",0] < 0) {fhem_set"pushmsg danger of frost $DEVICE}}
["regex for trigger":"<regex filter>":<output>,<default value>]
[<device>:<reading>|<internal>:d<number>|"<regex>":<output>]
define di_heating DOIF ([adjusting:actuator:d] < 10) (set heating off) DOELSE (set heating on)
[mydevice:myreading:d]
[mydevice:myreading:"(-?\d+(\.\d+)?)"]
[mydevice:myreading:"(-?\d+(\.\d+)?)":$1]
[mydevice:myreading:"(-?\d+(\.\d+)?)":"$1"]
[mydevice:myreading:"(-?\d+(\.\d+)?)":sprintf("%s":$1)]
[mydevice:myreading:d3]
... (set mydummy [mydevice:myreading:d2:"$1 °C"])
[mydevice:myreading:"(\d\d):(\d\d):(\d\d)":"hours: $1, minutes $2, seconds: $3"]
[alarm:state:"(.*)":"state of alarm is $1"]
[<device>:<reading>:<function><number of last values>]
define di_cold DOIF ([outdoor:temperature:avg5] < 10)(set cold on)
define di_frost DOIF ([$SELF:outTempMed] < 0) (set warning frost)
attr di_frost event_Readings outTempMed:[outdoor:temperature:med]
define temp_abfall DOIF ([outdoor:temperature:diff5] < -3) (set temp fall in temperature)
define di_pv DOIF ([pv:total_feed:diffpsec]*3600 > 1) (set heating on) DOELSE (set heating off)
define humidity_warning DOIF ([bathroom:humidiy:inc] > 0.1) (set bath speak open window)
...(set lamp on)
... (set lamp1 on, set lamp2 off)
...((set lamp1,lamp2 on),set switch on)
... {system ("wmail Peter is at home")}
. In diesem Fall können die runden Klammern des Ausführungsteils weggelassen werden....{my $name="Peter"; system ("wmail $name is at home");}
... ({system ("wmail Peter is at home")}, set lamp on)
[<function>:<format>:"<regex device>:<regex event>":<reading>|"<regex reading>":<condition>,<default>]
d<number>
zum Runden des Wertes mit Nachkommastellen, a
für Aliasnamen bei Devicelisten, s(<splittoken>)
<splittoken> sind Trennzeichen in der Device-Liste[#"^window"]
[@:a"^window"]
[@"^window":myreading]
[@"^window":state:"open"]
[@"^window":state:$_ =~ "open"]
siehe Aggregationsbedingung.[#min:"^abfall$":"Gruenschnitt.*_days$"]
[#average:"^T_":"temp"]
[#median:"^T_":"temp"]
[@"rooms$":temperature:$_ > 20]
[@"rooms$":temperature:$_ > 20 and $room eq "livingroom"]
[@"rooms$"::$STATE eq "on" and $group eq "windows"]
[@"":state:$_ eq "on" and AttrVal($name,"disable","") ne "1"]
[#"^window:open"]
define di_window DOIF
attr di_window state Offene Fenster: [@"^window:open":state:"open","keine"]
define di_battery DOIF
attr di_battery state [@":battery":battery:$_ ne "ok","alle OK"]
define di_average_temp DOIF
attr di_average_temp state [#average:d2:":temperature":temperature:$group eq "rooms"]
define di_Fenster DOIF (["^Window:open"])
(push "Fenster $DEVICE wurde geöffnet. Es sind folgende Fenster offen: [@"^Window":state:"open"]")
DOELSEIF ([#"^Window:closed":state:"open"] == 0)
(push "alle Fenster geschlossen")
attr di_Fenster do always
attr di_Fenster cmdState [$SELF:Device] zuletzt geöffnet|alle geschlossen
define di_temp DOIF (([08:00] or [20:00]) and [?#"^Rooms":temperature: $_ < 20] != 0)
(push "In folgenden Zimmern ist zu kalt [@"^Rooms":temperature:$_ < 20,"keine"]")
DOELSE
(push "alle Zimmmer sind warm")
attr di_temp do always
attr di_Raumtemp state In folgenden Zimmern ist zu kalt: [@"^Rooms":temperature:$_ < 20,"keine"])
define di_Fenster DOIF (["^Window:open"]) (push "Folgende Fenster: [@"^Window:state:"open"] sind geöffnet")
define di_lamp DOIF (["^lamp_livingroom: off"]) (set [@"^lamp_livingroom":state:"on","defaultdummy"] off)
attr di_lamp DOIF do always
AggrDoIf(<function>,<regex Device>,<reading>,<condition>,<default>)
diese liefert bei der Angabe @ ein Array statt einer Stringliste, dadurch lässt sie sich gut bei foreach-Schleifen verwenden.define di_Fenster DOIF {if (["^Window:open"]) {foreach (AggrDoIf('@','^windows','state','"open"')) {Log3 "di_Fenster",3,"Das Fenster $_ ist noch offen"}}}
define di_Temperature DOIF {if (["^room:temperature"]) {foreach (AggrDoIf('@','^room','temperature','$_ < 15')) {Log3 "di_Temperatur",3,"im Zimmer $_ ist zu kalt"}}
[HH:MM:SS]
oder [HH:MM]
oder [Zahl]
define di_light DOIF ([08:00]) (set switch on) DOELSEIF ([10:00]) (set switch off)
define di_light DOIF
{[08:00];fhem_set"switch on"}
{[10:00];fhem_set"switch on"}
define di_light DOIF ([08:00] or [10:00] or [20:00]) (set switch on) DOELSEIF ([09:00] or [11:00] or [00:00]) (set switch off)
define di_light DOIF
{if ([08:00] or [10:00] or [20:00]) {fhem_set"switch on"}}
{if ([09:00] or [11:00] or [00:00]) {fhem_set"switch off"}}
define di_save DOIF ([+01:00]) (save)
attr di_save do always
define di_save DOIF {[+01:00];fhem"save"}
define di_gong DOIF
{[:00];system"mplayer /opt/fhem/Sound/BigBen_00.mp3 -volume 90 −really−quiet &"}
{[:15];system"mplayer /opt/fhem/Sound/BigBen_15.mp3 -volume 90 −really−quiet &"}
{[:30];system"mplayer /opt/fhem/Sound/BigBen_30.mp3 -volume 90 −really−quiet &"}
{[:45];system"mplayer /opt/fhem/Sound/BigBen_45.mp3 -volume 90 −really−quiet &"}
define di_gong DOIF ([+:15]) (set Gong_mp3 playTone 1)
attr di_gong do always
define di_gong DOIF {[+:15];fhem_set"Gong_mp3 playTone 1"}
define di_gong DOIF ([+[2]:05]) (set pump on-for-timer 300)
attr di_gong do always
define di_gong DOIF {[+[2]:05];fhem_set"pump on-for-timer 300"}
[<time>|0123456789X]
mit 0 Sonntag, 1 Montag, ... bis 6 Samstag, 7 Wochenende und Feiertage (entspricht $we), 8 Arbeitstag (entspricht !$we),9 Wochenende oder Feiertag morgen (entspricht intern $twe), X Arbeitstag morgen (entspricht intern !$twe)[<time>|So Mo Di Mi Do Fr Sa WE AT MWE MAT]
WE entspricht der Ziffer 7, AT der Ziffer 8, MWE der Ziffer 9, MAT dem Buchstaben X[<time>|Su Mo Tu We Th Fr Sa WE WD TWE TWD]
weekdays
können beliebige Wochentagbezeichnungen definiert werden.weekdays <Bezeichnung für Sonntag>,<Bezeichnung für Montag>,...,<Bezeichnung für Wochenende oder Feiertag>,<Bezeichnung für Arbeitstag>,<Bezeichnung für Wochenende oder Feiertag morgen>,<Bezeichnung für Arbeitstag morgen>
di_mydoif attr weekdays Son,Mon,Die,Mit,Don,Fre,Sam,Wochenende,Arbeitstag,WochenendeMorgen,ArbeitstagMorgen
define di_radio DOIF ([06:30|Mon Wochenende] or [08:30|Wochenende]) (set radio on) DOELSEIF ([07:30|Mon Wochenende] or [09:30|Wochenende]) (set radio off)
attr di_radio weekdays Son,Mon,Die,Mit,Don,Fre,Sam,Wochenende,Arbeitstag,WochenendeMorgen
define di_radio DOIF
{if ([06:30|Mo We] or [08:30|WE]) {fhem_set"radio on"}}
{if ([07:30|Mo We] or [09:30|WE]) {fhem_set"radio off"}}
define dummy myweekday
set myweekday monday wednesday thursday weekend
define di_radio DOIF ([06:30|[myweekday]]) (set radio on) DOELSEIF ([07:30|[myweekday]]) (set radio off)
attr di_radio weekdays sunday,monday,thuesday,wednesday,thursday,friday,saturday,weekend,workdays,weekendtomorrow
define di_radio DOIF
{[06:30|[myweekday]];fhem_set"radio on"}
{[07:30|[myweekday]];fhem_set"radio off"}
attr di_radio weekdays sunday,monday,thuesday,wednesday,thursday,friday,saturday,weekend,workdays,weekendtomorrow
[<begin>-<end>]
,
für <begin>
bzw. <end>
wird das gleiche Zeitformat verwendet,
wie bei einzelnen Zeitangaben. Getriggert wird das Modul zum Zeitpunkt <begin>
und zum Zeitpunkt <end>
.
Soll ein Zeitintervall ohne Zeittrigger lediglich zur Abfrage dienen, so muss hinter der eckigen Klammer ein Fragezeichen angegeben werden (siehe Beispiele weiter unten).
Das Zeitintervall ist als logischer Ausdruck ab dem Zeitpunkt <begin>
wahr und ab dem Zeitpunkt <end>
nicht mehr wahr.define di_radio DOIF ([08:00-10:00]) (set radio on) DOELSE (set radio off)
define di_radio DOIF {if ([08:00-10:00]) {fhem_set"radio on"} else {fhem_set"radio off"}}
define di_radio DOIF ([08:00-10:00] or [20:00-22:00]) (set radio on) DOELSE (set radio off)
define di_radio DOIF {if ([08:00-10:00] or [20:00-22:00]) {fhem_set"radio on"} else {fhem_set"radio off"}}
define di_radio DOIF ([08:00-10:00|135]) (set radio on) DOELSE (set radio off)
define di_radio DOIF ([08:00-10:00|7]) (set radio on) DOELSE (set radio off)
define di_light DOIF ([22:00-07:00]) (set light on) DOELSE (set light off)
define di_light DOIF ([22:00|5]) (set light on) DOELSEIF ([10:00|1]) (set light off)
define di_light DOIF
{[22:00|5];fhem_set"light on"}
{[10:00|1];fhem_set"light off"}
define di_light DOIF ([{sunrise(900,"06:00","08:00")}]) (set outdoorlight off) DOELSEIF ([{sunset(900,"17:00","21:00")}]) (set outdoorlight on)
define di_light DOIF
{[{sunrise(900,"06:00","08:00")}];fhem_set"outdoorlight off"}
{[{sunset(900,"17:00","21:00")}];fhem_set"outdoorlight on"}
[[<Device>:<Reading>]]
bzw. bei Statusangabe [[<Device>]]
[+[<Device>:<Reading>]]
bzw. bei Statusangabe [+[<Device>]]
time
einstellbar sein:define time dummy
set time 08:00
define di_time DOIF ([[time]])(set lamp on)
attr di_time do always
define di_time DOIF {[[time]];fhem_set"lamp on"}
set time {sunset()}
define time dummy
set time 300
define di_time DOIF ([+[time]])(save)
attr di_time do always
define di_time DOIF {[+[time]];fhem"save"}
define begin dummy
set begin 08:00
define end dummy
set end 10:00
define di_time DOIF ([[begin]-[end]]) (set radio on) DOELSE (set radio off)
define di_time DOIF {if([[begin]-[end]]) {fhem_set"radio on"} else {fhem_set"radio off"}}
define di_time DOIF ([{sunrise(0,"[begin]","09:00")}-{sunset(0,"18:00","[end]")}]) (set lamp off) DOELSE (set lamp on)
define di_time DOIF ([[myTwilight:ss_weather]])(set lamp on)
attr di_timer do always
define di_time DOIF {[[myTwilight:ss_weather]];fhem_set"lamp on"}
define di_time DOIF ([[begin]-[end]|7]) (set radio on) DOELSE (set radio off)
define di_time DOIF {if ([[begin]-[end]|7]) {fhem_set"radio on"} else {fhem_set"radio off"}}
define di_light DOIF ([({sunset()}+900+int(rand(600)))])
(set lamp on)
DOELSEIF ([([23:00]+int(rand(600)))])
(set lamp off)
define di_light DOIF
{[({sunset()}+900+int(rand(600)))];fhem_set"lamp on"}
{[([23:00]+int(rand(600)))];;fhem_set"lamp off"}
define Fixtime dummy
set Fixtime 20:00
define di_light DOIF ([([Fixtime]-[01:00]) - ([Fixtime]+[01:00])])
(set lampe on)
DOELSE
(set lampe off)
define di_light DOIF ([([Fixtime]-[01:00]-int(rand(300))) - ([Fixtime]+[01:00]+int(rand(300)))]|7])
(set lampe on)
DOELSE
(set lampe off)
<begin>-<end>,<relative timer>]
define di_pump DOIF ([08:00-22:00,+:30])(set pump on-for-timer 300)
attr di_pump do always
define di_pump DOIF {[08:00-22:00,+:30];fhem_set"pump on-for-timer 300"}
define di_rand_lamp DOIF ([{sunset()}-[end:state],+(rand(600)+900)|Sa So])(set lamp on-for-timer 300)
attr di_rand_lamp do always
define di_rand_lamp DOIF {[{sunset()}-[end:state],+(rand(600)+900)|Sa So];fhem_set"lamp on-for-timer 300"}
define di_lamp DOIF ([06:00-09:00] and [sensor:brightness] < 40) (set lamp on) DOELSE (set lamp off)
define di_shutters DOIF ([sensor:brightness]>100 and [06:25-09:00|8] or [09:00|7]) (set shutters up) DOELSEIF ([sensor:brightness]<50) (set shutters down)
define di_motion DOIF ([?06:00-10:00] and [button] and [?Home] eq "present")(set lamp on-for-timer 600)
attr di_motion do always
define di_motion DOIF {if ([?06:00-10:00] and [button] and [?Home] eq "present"){fhem_set"lamp on-for-timer 600"}}
define di_button DOIF ([button]) (set lamp1 [lamp2])
attr di_button do always
define di_pushmsg DOIF ([window] eq "open" and [alarm] eq "armed") (set Pushover msg 'alarm' 'open windows [window:LastDevice]' '' 2 'persistent' 30 3600)
define di_average DOIF ([08:00]) (set TH_Modul desired {([default:temperature]+[outdoor:temperature])/2})
attr di_average do always
[<device>,<default value>]
[<device>:<reading>,<default value>]
[lamp,"off"]
[room:temperatur,20]
[brightness,3*[myvalue]+2]
[heating,AttrVal("mydevice","myattr","")]
[[mytime,"10:00"]]
notexist
bewerkstelligen. Ein angegebener Default-Wert beim Status oder beim Reading übersteuert das "notexist"-Attribut.attr <DOIF-module> notexist "<default value>"
attr <DOIF-module> wait <Sekunden für Befehlsfolge des ersten DO-Falls>:<Sekunden für Befehlsfolge des zweiten DO-Falls>:...
(set lamp1 on, set lamp2 on)
, soll vor dem Schalten von lamp2
eine Verzögerung von einer Sekunde stattfinden.
Die Befehlsfolge muss zunächst mit Hilfe von Klammerblöcke in eine Befehlssequenz aufgespalten werden: (set lamp1 on)(set lamp2 on)
.
Nun kann mit dem wait-Attribut nicht nur für den Beginn der Sequenz, sondern für jeden Klammerblock eine Verzögerung, getrennt mit Komma, definieren werden,
hier also: wait 0,1
. Damit wird lamp1
sofort, lamp2
eine Sekunde danach geschaltet. Die Verzögerungszeit bezieht sich immer auf den vorherigen Befehl.DOIF (Bedingung1)
(set ...) ## erster Befehl der ersten Sequenz soll um eine Sekunde verzögert werden
(set ...) ## zweiter Befehl der ersten Sequenz soll um 2 Sekunden nach dem ersten Befehl verzögert werden
DOELSEIF (Bedingung2)
(set ...) ## erster Befehl der zweiten Sequenz soll um 3 Sekunden verzögert werden
(set ...) ## zweiter Befehl der zweiten Sequenz soll um 0,5 Sekunden nach dem ersten Befehl verzögert werden
attr <DOIF-module> wait 1,2:3,0.5
attr my_doif wait 1:[mydummy:state]*3:rand(600)+100,Attr("mydevice","myattr","")
timerWithWait
auf Timer ausgeweitet werden.define di_rand_sunset DOIF ([{sunset()}])(set lamp on)
attr di_rand_sunset wait rand(1200)
attr di_rand_sunset timerWithWait 1
attr di_rand_sunset do always
define di_washer DOIF ([power:watt]<2) ({system("wmail washer finished")})
attr di_washer wait 300
define di_shutters DOIF ([Sun] eq "on") (set shutters down) DOELSE (set shutters up)
attr di_shutters wait 1200:1200
define di_shutters DOIF ([sensor:temperature] > 26 and [11:00-{sunset_abs()}] (set shutters down) DOELSE (set shutters up)
attr di_shutters wait 900:900
define di_fan DOIF ([light] eq "on")
(set fan on)
DOELSEIF ([sensor:humidity]>65)
(set fan on)
DOELSEIF ([light] eq "off" and [sensor:humidity]<60)
(set fan off)
attr di_fan wait 120:0:180
do always
wird ein Waittimer mit dem Attribut do resetwait
auch dann zurückgesetzt, wenn die gleiche Bedingung wiederholt wahr wird.do resetwait
impliziert eine beliebige Wiederholung wie do always
. Diese lässt sich allerdings mit dem Attribut repeatsame
einschränken s. u.define di_push DOIF ([Tempsensor])(set pushmsg "sensor failed again")
attr di_push wait 1800
attr di_push do resetwait
repeatcmd
definiert. Syntax:attr <DOIF-modul> repeatcmd <Sekunden für Befehlsfolge des ersten DO-Falls>:<Sekunden für Befehlsfolge des zweiten DO-Falls>:...
define di_push DOIF ([frost] eq "on")(set pushmsg "danger of frost")
attr di_push repeatcmd 3600
attr di_push repeatsame 3
define di_alarm_clock DOIF ([08:00])(set alarm_clock on)
attr di_alarm_clock repeatcmd 300
attr di_alarm_clock repeatsame 3
attr di_alarm_clock do always
define di_pump_circ DOIF ([05:00-22:00])(set pump on)(set pump off) DOELSE (set pump off)
attr di_pump_circ wait 0,300
attr di_pump_circ repeatcmd 3600
define di_presence_simulation DOIF ([19:00-00:00])(set lamp on-for-timer {(int(rand(1800)+300))}) DOELSE (set lamp off)
attr di_presence_simulation repeatcmd rand(3600)+2200
cmdpause <Sekunden für cmd_1>:<Sekunden für cmd_2>:...
wird die Zeitspanne in Sekunden angegeben für eine Zwangspause seit der letzten Zustandsänderung.
In der angegebenen Zeitspanne wird ein Kommando nicht ausgeführt, auch wenn die dazugehörige Bedingung wahr wird.define di_frost DOIF ([outdoor:temperature] < 0) (set pushmsg "danger of frost")
attr di_frost cmdpause 3600
attr di_frost do always
repeatsame <maximale Anzahl von cmd_1>:<maximale Anzahl von cmd_2>:...
wird die maximale Anzahl hintereinander folgenden Ausführungen festgelegt.define di_washer DOIF ([Watt]<2) (set pushmeldung "washer finished")
attr di_washer repeatsame 3
attr di_washer cmdpause 600
repeatsame
lässt sich mit do always
oder do resetwait
kombinieren.
Wenn die maximale Anzahl für ein Kommando ausgelassen oder auf Null gesetzt wird, so gilt für dieses Kommando der Defaultwert "einmalige Wiederholung";
in Kombination mit do always
bzw. do resetwait
gilt für dieses Kommando "beliebige Wiederholung".attr di_repeat repeatsame 0:2
attr di_repeat do always
waitsame <Zeitspanne in Sekunden für cmd_1>:<Zeitspanne in Sekunden für das cmd_2>:...
wird ein Kommando erst dann ausgeführt, wenn innerhalb einer definierten Zeitspanne die entsprechende Bedingung zweimal hintereinander wahr wird.waitsame
nicht gelten soll, werden die entsprechenden Sekundenangaben ausgelassen oder auf Null gesetzt.define di_shuttersup DOIF ([Button])(set shutters up)
attr di_shuttersup waitsame 2
attr di_shuttersup do always
repeatsame
-Attribut ist das Attribut waitdel
. Die Syntax mit Sekundenangaben pro Kommando entspricht der, des wait-Attributs. Im Gegensatz zum wait-Attribut, wird ein laufender Timer gelöscht, falls eine Bedingung wiederholt wahr wird.
Sekundenangaben können pro Kommando ausgelassen oder auf Null gesetzt werden.define di_shuttersdown DOIF ([Button])(set shutters down)
attr di_shuttersdown waitdel 2
attr di_shuttersdown do always
wait
und waitdel
lassen sich für verschiedene Kommandos kombinieren. Falls das Attribut für ein Kommando nicht gesetzt werden soll, kann die entsprechende Sekundenzahl ausgelassen oder eine Null angegeben werden.wait
gelten, für cmd_2 waitdel
attr di_cmd wait 2:0
attr di_cmd waitdel 0:2
[<Device>:<Reading>]
wird das Modul getriggert, wenn ein Ereignis zum angegebenen Device und Reading kommt. Soll das Modul, wie bei Statusangaben der Art [<Device>]
, auf alle Ereignisse des Devices reagieren, so muss das Attribut auf Null gesetzt werden.checkReadingEvent 0
die Voreinstellung des Moduls. Da die aktuelle Voreinstellung des Moduls checkReadingEvent 1
ist, hat das Setzen von
checkReadingEvent 1
keine weitere Funktion mehr.addStateEvent
bewerksteligen.
Bei Statusänderungen eines Devices wird bei der Angabe des Attributes addStateEvent
im Event "state: " vorangestellt, darauf kann man dann gezielt im DOIF-Modul triggern.define di_lamp ([FB:"^state: on$"]) (set lamp on)
attr di_lamp do always
attr di_lamp addStateEvent
selftrigger wait
gesetzt ist, kann das DOIF-Modul auf selbst ausgelöste Events reagieren. Dazu müssen die entsprchenden Kommandos mit wait verzögert werden.
Bei der Angabe selftrigger all
reagiert das Modul grundsätzlich alle selbst ausgelösten Trigger.selftrigger all
sollte beachtet werden, dass bereits in der zweiten Rekursion,
wenn ein Befehl nicht durch wait verzögert wird, FHEM eine weitere Triggerung unterbindet, um Endlosschleifen zu verhindern.timerevent
ungleich Null gesetzt ist, wird beim Setzen der Timer im DOIF-Modul ein Event erzeugt. Das kann z. B. bei FHEM2FHEM nützlich sein, um die Timer-Readings zeitnah zu aktualisieren.[<Device>:<Reading>:sec]
in Sekunden seit der letzten Änderung bestimmt werden.define di_monitor DOIF ([+01:00] and [?sensor:temperature:sec]>3600)(set pushbullet message sensor failed)
attr di_monitor do always
checkall event
Es werden alle Bedingungen geprüft, wenn ein Event-Trigger auslöst.checkall timer
Es werden alle Bedingungen geprüft, wenn ein Timer-Trigger auslöst.checkall all
Es werden grundsätzlich alle Bedingungen geprüft.
define time_switch DOIF (["$SELF:mybutton: on"] or [[$SELF:mybegin,"00:00"]])
(set lamp on)
DOELSEIF (["$SELF:mybutton: off"] or [[$SELF:myend,"00:00"]])
(set lamp off)
attr time_switch cmdState on|off
attr time_switch readingList mybutton mybegin myend
attr time_switch setList mybutton:on,off mybegin:time myend:time
attr time_switch webCmd mybutton:mybegin:myend
define di_web DOIF ([$SELF:"myInput first"]) (do something) DOELSEIF ([$SELF:"myInput second"]) (do something else)
attr di_web setList myInput:first,second
attr di_lamp cmdState on|off
attr di_mytwilight cmdState [mytwilight:ss_astro], {([mytwilight:twilight_weather]*2+10)}|My attribut is: {(Attr("mydevice","myattr",""))}
define di_hum DOIF ([outdoor:humidity]>70) DOELSEIF ([outdoor:humidity]>50) DOELSE
attr di_hum cmdState wet|normal|dry
state
backattr di_hum state The current humidity is [outdoor:humidity], it is [di_hum]
define di_average DOIF
attr di_average state Average of the two rooms is {([room1:temperature]+[room2:temperature])/2}
attr di_average state Average of the two rooms is {(sprintf("%.1f",([room1:temperature]+[room2:temperature])/2))}
attr <DOIF-Modul> DOIF_Readings <readingname1>:<definiton>, <readingname2>:<definition>,...
<definition>
: Beliebiger Perlausdruck ergänzt um DOIF-Syntax in eckigen Klammern. Angaben in eckigen Klammern wirken triggernd und aktualisieren das definierte Reading.define heating DOIF {if ([switch] eq "on" and [$SELF:frost]) {fhem_set"heating on"} else {fhem_set"heating off"}}
attr heating DOIF_Readings frost:([outdoor:temperature] < 0)
define di_temp DOIF ([$SELF:temperature]>20) (push "Die Durchschnittstemperatur ist höher als 20 Grad, sie beträgt [$SELF:temperature]")
attr di_temp DOIF_Readings temperature:[#average:d2:":temperature":temperature]
attr <DOIF-Modul> event_Readings <readingname1>:<definiton>, <readingname2>:<definition>,...
<definition>
: Beliebiger Perlausdruck ergänzt um DOIF-Syntax in eckigen Klammern. Angaben in eckigen Klammern wirken triggernd und aktualisieren das definierte Reading.define outdoor DOIF ##
attr outdoor event_Readings\
median:[outdoor:temperature:med],\
average:[outdoor:temperature:avg10],\
diff: [outdoor:temperature:diff],\
increase: [outdoor:temperature:inc]
initialize
Wird der Status vorbelegt, mit Initialisierung nach dem Neustart.di_lamp
mit "initialized" vorbelegt werden. Das Reading cmd_nr
wird auf 0 gesetzt, damit wird ein Zustandswechsel provoziert, das Modul wird initialisiert - der nächste Trigger führt zum Ausführen eines Kommandos.attr di_lamp initialize initialized
attr <DOIF-Modul> startup <FHEM-Befehl oder Perl-Befehl in geschweiften Klammern mit DOIF-Syntax>
attr di_test startup set $SELF cmd_1
attr di_test startup set $SELF checkall
attr di_test startup sleep 60;set lamp1 off;set lamp2 off
attr di_test startup {myfunction()},set lamp1 on,set lamp2 on
set <DOIF-modul> disable
geschehen.
checkall
werden wie beim gleichnamigen Attribut alle DOIF-Bedingung überprüft, sobald eine Bedingung als wahr geprüft ist, wird das dazugehörige Kommando ausgeführt.
Zu beachten ist, dass nur der erste wahre DOIF-Zweig ausgeführt wird und dass nur Zustandsabfragen sowie Zeitintervalle sinnvoll überprüft werden können.
Ereignisabfragen sowie Zeitpunkt-Definitionen, sind zum Zeitpunkt der checkall-Abfrage normalerweise nicht wahr.attr di_test startup set $SELF checkall
disable
wird ein DOIF-Modul inaktiviert. Hierbei bleiben alle Timer aktiv, sie werden aktualisiert - das Modul bleibt im Takt, allerdings werden keine Befehle ausgeführt.
Das Modul braucht mehr Rechenzeit, als wenn es komplett über das Attribut disable
deaktiviert wird. Ein inaktiver Zustand bleibt nach dem Neustart erhalten.
Ein inaktives Modul kann über set-Befehle enable
bzw. initialize
(im FHEM-Modus) wieder aktiviert werden.enable
wird ein inaktives DOIF-Modul wieder aktiviert. Im FHEM-Modus: Im Gegensatz zum set-Befehl initialize
wird der letzte Zustand vor der Inaktivierung des Moduls wieder hergestellt.initialize
wird ein DOIF-Modul initialisiert. Ein inaktives DOIF-Modul wieder aktiviert.
Im Gegensatz zum set-Befehl enable
wird der letzte Zustand des Moduls gelöscht, damit wird ein Zustandswechsel herbeigeführt, der nächste Trigger führt zur Ausführung eines wahren DOIF-Zweiges.
Diese Eigenschaft kann auch dazu genutzt werden, ein bereits aktives Modul zu initialisieren.set <DOIF-modul> cmd_<nr>
lässt sich ein Befehlszweig (cmd_1, cmd_2, usw.) bedingunglos ausführen.
define di_lamp DOIF ([FB:"on"]) (set lamp on) DOELSEIF ([FB:"off"]) (set lamp off)
attr di_lamp devStateIcon cmd_1:on:cmd_2 initialized|cmd_2:off:cmd_1
devStateIcon
führt das Anklicken des on/off-Lampensymbol zum Ausführen von set di_lamp cmd_1
bzw. set di_lamp cmd_2
und damit zum Schalten der Lampe.cmdState
eigene Zuständsbezeichnungen definiert werden, so können diese ebenfalls per set-Befehl angegeben werden.
define di_lamp DOIF ([FB:"on"]) (set lamp on) DOELSEIF ([FB:"off"]) (set lamp off)
attr di_lamp cmdState on|off
attr di_lamp setList on off
set di_lamp on
entspricht hier set di_lamp cmd_1
und set di_lamp off set di_lamp cmd_2
setList
zur Ausführung von set di_lamp on/off
durch das Anlicken des Lampensymbols wie im vorherigen Beispiel.define di_threshold DOIF ([sensor:temperature] < [$SELF:desired]-1)
(set heating on)
DOELSEIF ([sensor:temperature]>[$SELF:desired])
(set heating off)
attr di_threshold cmdState on|off
attr di_threshold readingList desired
attr di_threshold setList desired:17,18,19,20,21,22
attr di_threshold webCmd desired
define di_on_for_timer ([detector:"motion"])
(set light on)
(set light off)
attr di_on_for_timer do resetwait
attr di_on_for_timer wait 0,30
define di_light DOIF ([08:00] and [10:00]) (set switch on)
define di_light DOIF ([08:00]) (set switch on)
attr di_light do always
do always
definiert werden, damit sie nicht nur einmal, sondern jedes mal (hier jeden Tag) ausgeführt werden.define di_lamp DOIF ([HM_switch] eq "on") (set lamp on) DOELSE (set lamp off)
define di_lamp DOIF ([HM_switch] eq "on") (set lamp on) DOELSEIF ([HM_switch] eq "off") (set lamp off)
do always
, wird das Wiederholen desselben Kommmandos vom Modul unterbunden. Daher sollte nach Möglichkeit eine Problemlösung mit Hilfe eines und nicht mehrerer DOIF-Module realisiert werden, getreu dem Motto "wer die Lampe einschaltet, soll sie auch wieder ausschalten".
Dadurch wird erreicht, dass unnötiges (wiederholendes) Schalten vom Modul unterbunden werden kann, ohne dass sich der Anwender selbst darum kümmern muss.define di_lamp DOIF ([brightness] eq "off") (set lamp on) DOELSEIF ([19:00]) (set lamp on) DOELSE (set lamp off)
define di_lamp DOIF ([brightness] eq "off" or [19:00]) (set lamp on) DOELSE (set lamp off)
define <name> DOIF 〈(<Bedingung>) 〈〈(〈<Befehle>〉)〉 〈〈〈DOELSEIF (<Bedingung>) 〈(〈<Befehle>〉)〉〉 ... 〉〈DOELSE 〈(〈<Befehle>〉)〉〉〉〉〉
(<Befehl>, <Befehl>, ...)
(<Befehlssequenz A>) (<Befehlssequenz B>) ...
(<Befehlsteil a>, <Befehlsteil b> ... )
{<Perl-Befehl>}
sind in geschweifte Klammern einzuschliessen
{(<Berechnung>)〈<Berechnung>〉}
in einem Befehl ist in geschweifte Klammern einzuschliessen und muss mit einer geöffneten runden Klammer beginnen.
[<Device>〈,<Default>〉]
[<Device>:<Reading>〈,<Default>〉]
[<Device>:&<Internal>〈,<Default>〉]
[<Device>:<Reading>|<Internal>:"<Filter>"〈:<Output>〉〈,<Default>〉]
[<Device>:<Reading>:d〈,<Default>〉]
[<Device>:<Reading>:sec〈,<Default>〉]
[<Device>:"<Regex-Events>"]
oder ["<Regex-Devices>:<Regex-Events>"]
oder ["<Regex-Devices>"〈:"<Regex-Filter>"〉〈:<Output>〉,<Default>]
<Regex>
gilt: ^<ist eindeutig>$
, ^<beginnt mit>
, <endet mit>$
, ""
entspricht ".*"
, Regex-Filter ist mit [^\:]*: (.*)
vorbelegt siehe auch Reguläre Ausdrücke und Events des Gerätes global
[<time>]
[HH:MM]
, [HH:MM:SS]
oder [Zahl]
in Sekunden nach Mitternacht[<begin>-<end>]
[HH:MM]
, [HH:MM:SS]
oder [Zahl]
in Sekunden nach Mitternacht[[<indirekte Zeit>]]
[HH:MM]
, [HH:MM:SS]
oder [Zahl]
in Sekunden nach Mitternacht, <indirekte Zeit>
ist ein Status, Reading oder Internal[+<time>]
[HH:MM]
, [HH:MM:SS]
oder [Zahl]
in Sekunden[:MM]
[+:MM]
[+[h]:MM]
[<time>|0123456789]
, [<begin>-<end>]|0123456789]
[(<Berechnung, gibt Zeit in Sekunden zurück, im Sinne von time>)]
[<begin>-<end>,<relativ timer>]
[?<devicename>]
, [?<devicename>:<readingname>]
, [?<devicename>:&<internalname>]
, [?<time specification>]
set <name> checkall
set <name> disable
set <name> initialize
set <name> enable
set <name> cmd_<nr>
attr <name> wait <timer_1_1>,<timer_1_2>,...:<timer_2_1>,<timer_2_2>,...:...
attr <name> timerWithWait
wait
auf Zeitangabenattr <name> do <always|resetwait>
always
wiederholt den Ausführungsteil, wenn die selbe Bedingung wiederholt wahr wird.resetwait
setzt den Waittimer zurück, wenn die selbe Bedingung wiederholt wahr wird.attr <name> repeatcmd <timer Bedingungszweig 1>:<timer Bedingungszweig 2>:...
attr <name> cmdpause <Pause cmd_1>:<Pause cmd_2>:...
attr <name> repeatsame <maximale Anzahl von cmd_1>:<maximale Anzahl von cmd_2>:...
attr <name> waitsame <Wartezeit cmd_1>:<Wartezeit cmd_2>:...
attr <name> waitdel <timer_1_1>,<timer_1_2>,...:<timer_2_1>,<timer_2_2>,...:...
attr <name> checkReadingEvent <0|1>
attr <name> selftrigger <wait|all>
wait
zugelassen für verzögerte Befehle, all
zugelassen auch für nicht durch wait verzögerte Befehle; es ist nur eine Rekusion möglichattr <name> timerevent <0|ungleich Null>
attr <name> cmdState <Ersatz cmd_1_1>,...,<Ersatz cmd_1>|<Ersatz cmd_2_1>,...,<Ersatz cmd_2>|...
attr <name> startup <FHEM-Befehle>|{<Perl-Befehle mit DOIF-Syntax>}
attr <name> state <content>
attr <name> DOIF_Readings <readingname_1>:<content_1>,<readingname_2>:<content_2> ...
attr <name> notexist "<Ersatzwert>"
attr <name> initialize <Status nach Neustart>
attr <name> disable <0|1>
attr <name> checkall <event|timer|all>
event
Alle Bedingungen werden geprüft, wenn ein Event-Trigger (Ereignisauslöser) auslöst.timer
Alle Bedingungen werden geprüft, wenn ein Timer-Trigger (Zeitauslöser) auslöst.all
Alle Bedingungen werden geprüft.attr <name> addStateEvent <0|ungleich Null>
attr <name> readingList <Reading1> <Reading2> ...
attr <name> setList <Reading1>:〈<Modifier1>,〉<Value1>,<Value2>,<...> <Reading2>:〈<Modifier2>,〉<Value1>,<Value2>,<...> ...
attr <name> uiTable 〈{<perl code (format specification, template specification, function definition, control variable, ...)>}\n〉<template file import, method definition, table definition>
$TABLE = "<CSS-Attribute>"
ergänzt das table-Elemente um CSS-Attribute.$TD{<rows>}{<columns>} = "<HTML Attribute>"
ergänzt td-Elemente um HTML-Attribute.$TR{<rows>} = "<HTML Attribute>"
ergänzt tr-Elemente um HTML-Attribute.$TC{<columns>} = "<HTML Attribute>"
ergänzt zu columns gehörende td-Elemente um HTML-Attribute.$TPL{<name>} = "<Zeichenkette>"
speichert ein Template.sub FUNC_<name> {<function BLOCK>}
definiert eine Funktion.$ATTRIBUTESFIRST = 1;
organisiert die Detailansicht um.$SHOWNOSTATE = 1;
blendet den Status in der Gerätezeile aus.$SHOWNODEVICELINE = "<regex room>";
blendet die Gerätezeile aus, wenn <regex room> zum Raumnamen passt, gilt nicht für den Raum Everything.$SHOWNODEVICELINK = 1;
schaltet das Ersetzen des Gerätenamen durch einen Link auf die Detailseite aus.IMPORT <path with filename>
importiert eine Templatedatei.DEF TPL_<name>(<definition with place holder $1,$2 usw.>)
erzeugt ein Methodentemplate zur wiederholten Nutzung in der Tabellendefinition.↵
oder ↵↵
trennt Tabellenzeilen.|
oder |↵
trennt Tabellenzellen.>↵
oder ,↵
sind zur Textstrukturierung zugelassen.WID([<device>:<reading>],"<widget modifier>"〈,"<command>"〉)
bindet ein Widget an <device>:<reading>, <command> steht für set oder setreading, siehe widgetOverride und FHEMWEB-Widgets STY(<content>,<CSS style attributes>)
schreibt den Inhalt von <content> in die Zelle und formatiert ihn mit <CSS style attributes>.<content>
schreibt den Inhalt von <content> in die Zelle.PUP(<DOIF-name to show interface table>, <iconname[@color number]>)
DOIF_hsv(<current value>, <lower value>, <upper value>, <lower HUE value>, <upper HUE value>, <saturation>, <lightness>)
DOIF_rgb(<start color number>, <end color number>, <lower value>, <upper value>, <current value>)
FW_makeImage(<iconname[@color number]>)
define <name> DOIFtools
defmod DOIFtools DOIFtools
attr DOIFtools DOIFtoolsEventMonitorInDOIF 1
attr DOIFtools DOIFtoolsExecuteDefinition 1
attr DOIFtools DOIFtoolsExecuteSave 1
attr DOIFtools DOIFtoolsMenuEntry 1
attr DOIFtools DOIFtoolsMyShortcuts ##My Shortcuts:,,list DOIFtools,fhem?cmd=list DOIFtools,remove_DOIFtoolsLog,fhem?cmd=delete DOIFtoolsLog;%22rm ./log/DOIFtoolsLog*.log%22
set <name> deleteReadingInTargetDOIF <readings to delete name>
set <name> targetDOIF <target name>
set <name> deleteReadingInTargetDevice <readings to delete name>
set <name> targetDevice <target name>
set <name> sourceAttribute <readingList>
set <name> statisticsDeviceFilterRegex <regular expression as device filter>
set <name> statisticsTYPEs <List of TYPE used for statistics generation>
set <name> statisticsShowRate_ge <integer value for event rate>
set <name> specialLog <0|1>
set <name> doStatistics <enabled|disabled|deleted>
set <name> recording_target_duration <hours>
get <name> DOIF_to_Log <DOIF names for logging>
get <name> checkDOIF
get <name> readingsGroup_for <DOIF names to create readings groups>
get <name> userReading_nextTimer_for <DOIF names where to create real date timer readings>
get <name> statisticsReport
get <name> runningTimerInDOIF
get <name> SetAttrIconForDOIF <DOIF names for setting the attribute icon to helper_doif>
get <name> linearColorGradient <start color number>,<end color number>,<minimal value>,<maximal value>,<step width>
get DOIFtools linearColorGradient #0000FF,#FF0000,7,30,0.5
get <name> modelColorGradient <minimal value>,<middle value>,<maximal value>,<step width>,<color model>
get DOIFtools modelColorGradient 7,20,30,1,0
get DOIFtools modelColorGradient 0,50,100,5,[255,255,0,127,255,0,0,255,0,0,255,255,0,127,255]
get <name> hsvColorGradient <HUE start value>,<HUE end value>,<minimal value>,<maximal value>,<step width>,<saturation>,<lightness>
get DOIFtools hsvColorGradient 240,360,7,30,1,80,80
get <name> subsInPackageDOIF
attr <name> DOIFtoolsExecuteDefinition <0|1>
attr <name> DOIFtoolsExecuteSave <0|1>
attr <name> DOIFtoolsTargetGroup <group names for target>
attr <name> DOIFtoolsTargetRoom <room names for target>
attr <name> DOIFtoolsReadingsPrefix <user defined prefix>
attr <name> DOIFtoolsEventMonitorInDOIF <1|0>
attr <name> DOIFtoolsEMbeforeReadings <1|0>
attr <name> DOIFtoolsHideGetSet <0|1>
attr <name> DOIFtoolsNoLookUp <0|1>
attr <name> DOIFtoolsNoLookUpInDOIF <0|1>
attr <name> DOIFtoolsHideModulShortcuts <0|1>
attr <name> DOIFtoolsHideStatReadings <0|1>
attr <name> DOIFtoolsEventOnDeleted <0|1>
attr <name> DOIFtoolsMyShortcuts <shortcut name>,<command>, ...
attr DOIFtools DOIFtoolsMyShortcuts ##<br>My Shortcuts:,,list DOIFtools,fhem?cmd=list DOIFtools
attr <name> DOIFtoolsMenuEntry <0|1>
attr <name> DOIFtoolsLogDir <path to DOIFtools logfile>
define <devicename> DSBMobile
%Klasse_n_%
defmod dsb_web weblink htmlCode {DSBMobile_simpleHTML("dsb",1)}
defmod dsb_web weblink htmlCode {DSBMobile_tableHTML("dsb",1)}
defmod dsb_infoweb weblink htmlCode {DSBMobile_infoHTML("dsb")}
DBI
und DBD::<dbtype>
müssen installiert werden (use cpan -i <module>
falls die eigene Distribution diese nicht schon mitbringt).
DBI | : sudo apt-get install libdbi-perl |
MySQL | : sudo apt-get install [mysql-server] mysql-client libdbd-mysql libdbd-mysql-perl (mysql-server nur bei lokaler MySQL-Server-Installation) |
SQLite | : sudo apt-get install sqlite3 libdbi-perl libdbd-sqlite3-perl |
PostgreSQL | : sudo apt-get install libdbd-pg-perl |
CREATE DATABASE `fhem` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
current
und history
. current
enthält den letzten Stand pro Device und Reading. history
sind alle Events historisch gespeichert. current
und history
festzulegen.
TIMESTAMP | : Zeitpunkt des Events, z.B. 2007-12-30 21:45:22 |
DEVICE | : Name des Devices, z.B. Wetterstation |
TYPE | : Type des Devices, z.B. KS300 |
EVENT | : das auftretende Event als volle Zeichenkette, z.B. humidity: 71 (%) |
READING | : Name des Readings, ermittelt aus dem Event, z.B. humidity |
VALUE | : aktueller Wert des Readings, ermittelt aus dem Event, z.B. 71 |
UNIT | : Einheit, ermittelt aus dem Event, z.B. % |
MySQL | : CREATE INDEX Search_Idx ON `fhem`.`history` (DEVICE, READING, TIMESTAMP); |
SQLite | : CREATE INDEX Search_Idx ON `history` (DEVICE, READING, TIMESTAMP); |
PostgreSQL | : CREATE INDEX "Search_Idx" ON history USING btree (device, reading, "timestamp"); |
#################################################################################### # database configuration file # # NOTE: # If you don't use a value for user / password please delete the leading hash mark # and write 'user => ""' respectively 'password => ""' instead ! # # ## for MySQL #################################################################################### #%dbconfig= ( # connection => "mysql:database=fhem;host=<database host>;port=3306", # # if want communication over socket-file instead of TCP/IP transport, use: # # connection => "mysql:database=fhem;mysql_socket=</patch/socket-file>", # user => "fhemuser", # password => "fhempassword", # # optional enable(1) / disable(0) UTF-8 support # # (full UTF-8 support exists from DBD::mysql version 4.032, but installing # # 4.042 is highly suggested) # utf8 => 1 #); #################################################################################### # ## for PostgreSQL #################################################################################### #%dbconfig= ( # connection => "Pg:database=fhem;host=<database host>", # user => "fhemuser", # password => "fhempassword" #); #################################################################################### # ## for SQLite (username and password stay empty for SQLite) #################################################################################### #%dbconfig= ( # connection => "SQLite:dbname=/opt/fhem/fhem.db", # user => "", # password => "" #); ####################################################################################Wird configDB genutzt, ist das Konfigurationsfile in die configDB hochzuladen !
FRAME_INITIALIZED | - Das grundlegende Rahmenwerk ist initialisiert. Blockierend arbeitende (Get)-Kommandos können ausgeführt werden. |
SUBPROC_INITIALIZED | - Der SupProcess ist einsatzbereit. Nichtblockierend arbeitende (Set)-Kommandos und Daten Logging können ausgeführt werden. |
SUBPROC_DISCONNECTED | - Der SupProcess wurde von der DB getrennt. |
SUBPROC_STOPPED | - Der SupProcess wurde gestoppt. |
define <name> DbLog <configfilename> <regexp>
<configfilename>
ist die vorbereitete Konfigurationsdatei. <regexp>
ist identisch FileLog der Filelog-Definition.
define myDbLog DbLog /etc/fhem/db.conf .*:.*
get <name> configCheck
yes
wird
transformiert nach 1
. get myDbLog - - 2012-11-10 2012-11-10 KS300:temperature
<devspec>:<Reading> | Das Device kann als Geräte-Spezifikation angegeben werden. |
Die Angabe von "Reading" wird als regulärer Ausdruck ausgewertet. | |
Ist das Reading nicht vorhanden und der Wert "Value" angegeben, wird das Reading | |
in die DB eingefügt wenn es kein regulärer Ausdruck und ein valider Readingname ist. | |
Value | Optional kann "Value" für den Readingwert angegeben werden. |
Ist Value nicht angegeben, wird der aktuelle Wert des Readings in die DB eingefügt. | |
CN=<caller name> | Mit dem Schlüssel "CN=" (Caller Name) kann dem addLog-Aufruf ein String, |
z.B. der Name des aufrufenden Devices, mitgegeben werden. | |
Mit Hilfe der im Attribut valueFn hinterlegten Funktion kann | |
dieser Schlüssel über die Variable $CN ausgewertet werden. | |
!useExcludes | addLog berücksichtigt per default die mit dem Attribut "DbLogExclude" ausgeschlossenen Readings. |
Mit dem Schüsselwort "!useExcludes" wird das gesetzte Attribut "DbLogExclude" ignoriert. |
alldevices | Ermittelt alle in der Datenbank gespeicherten Devices. |
allreadings | Ermittelt alle in der Datenbank gespeicherten Readings für ein bestimmtes Device. |
benötigte Parameter: <device> | |
count | Liefert die Anzahl Datensätze der angegebenen Tabelle. |
benötigte Parameter: <table> (history oder current) | |
fetchrows | Ermittelt die gespeicherten Datensätze eines bestimmten Zeitraumes. |
Die Anzahl der Datensätze im definierten Zeitraum wird als Schlüssel "totalcount" zurückgegeben. | |
benötigte Parameter: <from>, <to>, <offset>, <limit> | |
last | Listet die letzten 10 gespeicherten Events auf. |
mögliche Parameter: <limit> (überschreibt den Standard 10) | |
timerange | Ermittelt die gespeicherten Datensätze der angegebenen Device / Reading Kombination. |
benötigte Parameter: <device>, <reading>, <from>, <to> | |
hourstats | Errechnet die Statistiken SUM, AVG, MIN, MAX, COUNT für eine Stunde. |
benötigte Parameter: <device>, <reading>, <from>, <to> | |
daystats | Errechnet die Statistiken SUM, AVG, MIN, MAX, COUNT für einen Tag. |
benötigte Parameter: <device>, <reading>, <from>, <to> | |
weekstats | Errechnet die Statistiken SUM, AVG, MIN, MAX, COUNT für eine Woche. |
benötigte Parameter: <device>, <reading>, <from>, <to> | |
monthstats | Errechnet die Statistiken SUM, AVG, MIN, MAX, COUNT für einen Monat. |
benötigte Parameter: <device>, <reading>, <from>, <to> | |
yearstats | Errechnet die Statistiken SUM, AVG, MIN, MAX, COUNT für ein Jahr. |
benötigte Parameter: <device>, <reading>, <from>, <to> |
get LogSQLITE3 retrieve alldevices
get LogSQLITE3 retrieve allreadings MySTP_5000
get LogSQLITE3 retrieve last "" "" "" "" "" 50
get LogSQLITE3 retrieve count history
get LogSQLITE3 retrieve timerange MySTP_5000 etotal 2023-01-01_00:00:00 2023-01-25_00:00:00
get LogSQLITE3 retrieve fetchrows MySTP_5000 "" 2023-01-01_00:00:00 2023-01-25_00:00:00 0 100
get LogSQLITE3 retrieve fetchrows "" etotal 2023-01-01_00:00:00 2023-01-25_00:00:00 0 100
get LogSQLITE3 retrieve hourstats MySTP_5000 etotal 2023-01-01_00:00:00 2023-01-25_00:00:00
-
zu setzen um die
Ermittlung der Daten aus der Datenbank für die Plotgenerierung zu prüfen.YYYY-MM-DD_HH24:MI:SS
get myDbLog - - 2012-11-10 2012-11-20 KS300:temperature
get myDbLog current ALL - - %:temperature
get myDbLog - - 2012-11-10_10 2012-11-10_20 KS300:temperature::int1
get myDbLog - all 2012-11-10 2012-11-20 KS300:temperature
get myDbLog - - 2012-11-10 2012-11-20 KS300:temperature KS300:rain::delta-h KS300:rain::delta-d
get myDbLog - - 2012-11-10 2012-11-20 MyFS20:data:::$val=~s/(on|off).*/$1eq"on"?1:0/eg
get myDbLog - - 2012-11-10 2012-11-20 Bodenfeuchte:data:::$val=~s/.*B:\s([-\.\d]+).*/$1/eg
"A: 49.527 % B: 66.647 % C: 9.797 % D: 0.097 V"
2012-11-20_10:23:54 66.647
get DbLog - - 2013-05-26 2013-05-28 Pumpe:data::delta-ts:$val=~s/on/hide/
-
zu setzen.
webchart
zu setzen.
YYYY-MM-DD_HH24:MI:SS
getreadings
um für ein bestimmtes device alle Readings zu erhaltengetdevices
um alle verfügbaren devices zu erhaltentimerange
um Chart-Daten abzufragen. Es werden die Parameter 'xaxis', 'yaxis', 'device', 'to' und 'from' benötigtsavechart
um einen Chart unter Angabe eines 'savename' und seiner zugehörigen Konfiguration abzuspeicherndeletechart
um einen zuvor gespeicherten Chart unter Angabe einer id zu löschengetcharts
um eine Liste aller gespeicherten Charts zu bekommen.getTableData
um Daten aus der Datenbank abzufragen und in einer Tabelle darzustellen. Benötigt paging Parameter wie start und limit.hourstats
um Statistiken für einen Wert (yaxis) für eine Stunde abzufragen.daystats
um Statistiken für einen Wert (yaxis) für einen Tag abzufragen.weekstats
um Statistiken für einen Wert (yaxis) für eine Woche abzufragen.monthstats
um Statistiken für einen Wert (yaxis) für einen Monat abzufragen.yearstats
um Statistiken für einen Wert (yaxis) für ein Jahr abzufragen.get logdb - webchart "" "" "" getcharts
get logdb - webchart "" "" "" getdevices
get logdb - webchart "" "" ESA2000_LED_011e getreadings
get logdb - webchart 2013-02-11_00:00:00 2013-02-12_00:00:00 ESA2000_LED_011e timerange TIMESTAMP day_kwh
[{'TIMESTAMP':'2013-02-11 00:10:10','VALUE':'0.22431388090756'},{'TIMESTAMP'.....}]
get logdb - webchart 2013-02-11_00:00:00 2013-02-12_00:00:00 ESA2000_LED_011e savechart TIMESTAMP day_kwh tageskwh
get logdb - webchart "" "" "" deletechart "" "" 7
0 - | Synchroner Log-Modus. Die zu loggenden Daten werden nur kurz im Cache zwischengespeichert und sofort |
in die Datenbank geschrieben. | |
Vorteile: | |
Die Daten stehen im Prinzip sofort in der Datenbank zur Verfügung. | |
Bei einem Absturz von FHEM gehen sehr wenige bis keine Daten verloren. | |
Nachteile: | |
Eine alternative Speicherung im Filesystem (bei Datenbankproblemen) wird nicht unterstützt. | |
1 - | Asynchroner Log-Modus. Die zu loggenden Daten werden zunächst in einem Memory Cache zwischengespeichert |
und abhängig von einem Zeitintervall bzw. Füllgrad des Caches in die Datenbank geschrieben. | |
Vorteile: | |
Die Daten werden zwischengespeichert und gehen nicht verloren wenn die Datenbank nicht verfügbar ist | |
oder fehlerhaft arbeitet. Die alternative Speicherung im Filesystem wird unterstützt. | |
Nachteile: | |
Die Daten stehen zeitlich verzögert in der Datenbank zur Verfügung. | |
Bei einem Absturz von FHEM gehen alle im Memory Cache zwischengespeicherten Daten verloren. |
0 - | Es werden keine Events für CacheUsage erzeugt. |
1 - | Es werden Events für das Reading CacheUsage erzeugt wenn ein neuer Datensatz zum Cache hinzugefügt wurde. |
2 - | Es werden Events für das Reading CacheUsage erzeugt wenn im asynchronen Mode der Schreibzyklus in die |
Datenbank beginnt. CacheUsage enthält zu diesem Zeitpunkt die Anzahl der im Cache befindlichen | |
Datensätze. |
Current | Events werden nur in die current-Tabelle geloggt. Die current-Tabelle wird bei der SVG-Erstellung ausgewertet. |
History | Events werden nur in die history-Tabelle geloggt. Es wird keine DropDown-Liste mit Vorschlägen bei der SVG-Erstellung erzeugt. |
Current/History | Events werden sowohl in die current- also auch in die hitory Tabelle geloggt. Die current-Tabelle wird bei der SVG-Erstellung ausgewertet. |
SampleFill/History | Events werden nur in die history-Tabelle geloggt. Die current-Tabelle wird bei der SVG-Erstellung ausgewertet und
kann zur Erzeugung einer DropDown-Liste mittels einem
DbRep-Device "set <DbRep-Name> tableCurrentFillup" mit einem einstellbaren Extract der history-Tabelle gefüllt werden (advanced Feature). |
| Modifier | innerhalb Intervall | außerhalb Intervall | | | Wert gleich | Wert geändert | | |----------+--------------------+-----------------+---------------------| | <none> | ignorieren | speichern | speichern | | force | ignorieren | ignorieren | speichern |
attr MyDevice1 DbLogInclude .*
attr MyDevice2 DbLogInclude state,(floorplantext|MyUserReading):300,battery:3600
attr MyDevice2 DbLogInclude state,(floorplantext|MyUserReading):300:force,battery:3600:force
| Modifier | innerhalb Intervall | außerhalb Intervall | | | Wert gleich | Wert geändert | | |----------+--------------------+-----------------+---------------------| | <none> | ignorieren | speichern | speichern | | force | ignorieren | ignorieren | speichern |
attr MyDevice1 DbLogExclude .*
attr MyDevice2 DbLogExclude state,(floorplantext|MyUserReading):300,battery:3600
attr MyDevice2 DbLogExclude state,(floorplantext|MyUserReading):300:force,battery:3600:force
attr SMA_Energymeter DbLogValueFn { if ($READING eq "Bezug_WirkP_Kosten_Diff") { $UNIT="Diff-W"; } if ($READING =~ /Einspeisung_Wirkleistung_Zaehler/ && $VALUE < 2) { $IGNORE=1; } }
attr dblog defaultMinInterval .*::120::force
attr dblog defaultMinInterval (Weather|SMA)::300
attr dblog defaultMinInterval TYPE=CUL_HM::600::force
attr <device> excludeDevs global,Log.*,Cam.*,TYPE=DbLog
attr <device> excludeDevs .*#.*Wirkleistung.*
attr <device> excludeDevs SMA_Energymeter#Bezug_WirkP_Zaehler_Diff
attr <device> expimpdir /opt/fhem/cache/
0 - | Die Daten werden als Array der Datenbankschnittstelle übergeben. |
Es ist in den meisten Fällen der performanteste Weg viele Daten auf einmal in die Datenbank einzufügen. | |
1 - | Die Datensätze werden sequentiell der Datenbankschnittstelle übergeben und in die DB eingefügt. |
ALL | schaltet alle DBI- und Treiberflags an. |
SQL | verfolgt die SQL Statement Ausführung. (Default) |
CON | verfolgt den Verbindungsprozess. |
ENC | verfolgt die Kodierung (Unicode Übersetzung etc). |
DBD | verfolgt nur DBD Nachrichten. |
TXN | verfolgt Transaktionen. |
0 | Tracing ist disabled. (Default) |
1 | Tracing von DBI Top-Level Methoden mit deren Ergebnissen und Fehlern |
2 | Wie oben. Zusätzlich Top-Level Methodeneintäge mit Parametern. |
3 | Wie oben. Zusätzliche werden einige High-Level Informationen des Treibers und einige interne Informationen des DBI hinzugefügt. |
4 | Wie oben. Zusätzlich werden mehr detaillierte Informationen des Treibers eingefügt. |
5-7 | Wie oben, aber mit mehr und mehr internen Informationen. |
attr <device> valueFn {if ($DEVICE eq "living_Clima" && $VALUE eq "off" ){$VALUE=0;} elsif ($DEVICE eq "e-power"){$VALUE= sprintf "%.1f", $VALUE;}}
attr <device> valueFn {if ($DEVICE eq "SMA_Energymeter" && $READING eq "state"){$IGNORE=1;}}
attr <device> valueFn {if ($DEVICE eq "Dum.Energy" && $READING eq "TotalConsumption"){$UNIT="W";}}
attr <device> verbose4Devs sys.*,.*5000.*,Cam.*,global
DbReadingsVal("<name>","<device:reading>","<timestamp>","<default>")
$ret = DbReadingsVal("Rep.LogDB1","MyWetter:temperature","2018-01-13_08:00:00",""); attr <name> userReadings oldtemp {DbReadingsVal("Rep.LogDB1","MyWetter:temperature","2018-04-13_08:00:00","")} attr <name> userReadings todayPowerIn { my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(gettimeofday()); $month++; $year+=1900; my $today = sprintf('%04d-%02d-%02d', $year,$month,$mday); DbReadingsVal("Rep.LogDB1","SMA_Energymeter:Bezug_Wirkleistung_Zaehler",$today."_00:00:00",0) }Die Befehlssyntax als FHEM Kommando ist:
dbReadingsVal <name> <device:reading> <timestamp> <default>
dbReadingsVal Rep.LogDB1 MyWetter:temperature 2018-01-13_08:00:00 0
<name> | : Name des abzufragenden DbRep-Device |
<device:reading> | : Device:Reading dessen Wert geliefert werden soll |
<timestamp> | : Zeitpunkt des zu liefernden Readingwertes (*) im Format "YYYY-MM-DD_hh:mm:ss" |
<default> | : Defaultwert falls kein Readingwert ermittelt werden konnte |
define <name> DbRep <Name der DbLog-Instanz>
set <name> index recreate_Report_Idx
writeToDB | : schreibt jeweils einen Wert mit den Zeitstempeln XX:XX:01 und XX:XX:59 innerhalb der jeweiligen Auswertungsperiode |
writeToDBSingle | : schreibt nur einen Wert mit dem Zeitstempel XX:XX:59 am Ende einer Auswertungsperiode |
writeToDBSingleStart | : schreibt nur einen Wert mit dem Zeitstempel XX:XX:01 am Beginn einer Auswertungsperiode |
writeToDBInTime | : schreibt jeweils einen Wert am Anfang und am Ende der Zeitgrenzen einer Auswertungsperiode |
aggregation | : Auswahl einer Aggregationsperiode |
averageCalcForm | : Auswahl der Berechnungsvariante für den Durchschnitt |
device | : einschließen oder ausschließen von Datensätzen die <device> enthalten |
executeBeforeProc | : ausführen FHEM Kommando (oder Perl-Routine) vor Start Operation |
executeAfterProc | : ausführen FHEM Kommando (oder Perl-Routine) nach Ende Operation |
reading | : einschließen oder ausschließen von Datensätzen die <reading> enthalten |
readingNameMap | : die entstehenden Ergebnisreadings werden partiell umbenannt |
time.* | : eine Reihe von Attributen zur Zeitabgrenzung |
valueFilter | : ein zusätzliches REGEXP um die Datenselektion zu steuern. Der REGEXP wird auf das Datenbankfeld 'VALUE' angewendet. |
<alter String> : | |
<neuer String> : | |
Dem Perl-Ausdruck werden die Variablen $VALUE und $UNIT übergeben. Sie können innerhalb | |
des Perl-Code geändert werden. Der zurückgebene Wert von $VALUE und $UNIT wird in dem Feld | |
VALUE bzw. UNIT des Datensatzes gespeichert. |
device | : einschließen oder ausschließen von Datensätzen die <device> enthalten |
reading | : einschließen oder ausschließen von Datensätzen die <reading> enthalten |
time.* | : eine Reihe von Attributen zur Zeitabgrenzung |
executeBeforeProc | : ausführen FHEM Kommando (oder Perl-Routine) vor Start changeValue |
executeAfterProc | : ausführen FHEM Kommando (oder Perl-Routine) nach Ende changeValue |
valueFilter | : ein zusätzliches REGEXP um die Datenselektion zu steuern. Der REGEXP wird auf das Datenbankfeld 'VALUE' angewendet. |
aggregation | : Zusammenfassung/Gruppierung von Zeitintervallen |
countEntriesDetail | : detaillierte Ausgabe der Datensatzanzahl |
device | : einschließen oder ausschließen von Datensätzen die <device> enthalten |
reading | : einschließen oder ausschließen von Datensätzen die <reading> enthalten |
time.* | : eine Reihe von Attributen zur Zeitabgrenzung |
executeBeforeProc | : ausführen FHEM Kommando (oder Perl-Routine) vor Ausführung |
executeAfterProc | : ausführen FHEM Kommando (oder Perl-Routine) nach Ausführung |
readingNameMap | : die entstehenden Ergebnisreadings werden partiell umbenannt |
valueFilter | : ein zusätzliches REGEXP um die Datenselektion zu steuern. Der REGEXP wird auf das Datenbankfeld 'VALUE' angewendet. |
adviceDelete | : ermittelt die zu löschenden Datensätze (es wird nichts gelöscht !) |
delete | : löscht die Dubletten |
allowDeletion | : Freischaltung der Löschfunktion |
aggregation | : Auswahl einer Aggregationsperiode |
device | : einschließen oder ausschließen von Datensätzen die <device> enthalten |
limit | : begrenzt NUR die Anzahl der anzuzeigenden Datensätze |
reading | : einschließen oder ausschließen von Datensätzen die <reading> enthalten |
time.* | : eine Reihe von Attributen zur Zeitabgrenzung |
executeBeforeProc | : ausführen FHEM Kommando (oder Perl-Routine) vor Start des Befehls |
executeAfterProc | : ausführen FHEM Kommando (oder Perl-Routine) nach Ende des Befehls |
valueFilter | : ein zusätzliches REGEXP um die Datenselektion zu steuern. Der REGEXP wird auf das Datenbankfeld 'VALUE' angewendet. |
allowDeletion | : Freischaltung der Löschfunktion |
device | : einschließen oder ausschließen von Datensätzen die <device> enthalten |
reading | : einschließen oder ausschließen von Datensätzen die <reading> enthalten |
readingNameMap | : die entstehenden Ergebnisreadings werden partiell umbenannt |
time.* | : eine Reihe von Attributen zur Zeitabgrenzung |
executeBeforeProc | : ausführen FHEM Kommando (oder Perl-Routine) vor Start delEntries |
executeAfterProc | : ausführen FHEM Kommando (oder Perl-Routine) nach Ende delEntries |
valueFilter | : ein zusätzliches REGEXP um die Datenselektion zu steuern. Der REGEXP wird auf das Datenbankfeld 'VALUE' angewendet. |
adviceRemain | : simuliert die nach der Operation in der DB verbleibenden Datensätze (es wird nichts gelöscht !) |
adviceDelete | : simuliert die zu löschenden Datensätze (es wird nichts gelöscht !) |
delete | : löscht die sequentiellen Dubletten (siehe Beispiel) |
allowDeletion | : needs to be set to execute the delete option |
aggregation | : Auswahl einer Aggregationsperiode |
device | : einschließen oder ausschließen von Datensätzen die <device> enthalten |
limit | : begrenzt NUR die Anzahl der anzuzeigenden Datensätze |
reading | : einschließen oder ausschließen von Datensätzen die <reading> enthalten |
readingNameMap | : die entstehenden Ergebnisreadings werden partiell umbenannt |
seqDoubletsVariance | : bis zu diesem Wert werden aufeinander folgende numerische Datensätze als identisch angesehen und werden gelöscht |
time.* | : eine Reihe von Attributen zur Zeitabgrenzung |
executeBeforeProc | : ausführen FHEM Kommando (oder Perl-Routine) vor Start des Befehls |
executeAfterProc | : ausführen FHEM Kommando (oder Perl-Routine) nach Ende des Befehls |
valueFilter | : ein zusätzliches REGEXP um die Datenselektion zu steuern. Der REGEXP wird auf das Datenbankfeld 'VALUE' angewendet. |
executeBeforeProc | : ausführen FHEM Kommando (oder Perl-Routine) vor Start des Befehls |
executeAfterProc | : ausführen FHEM Kommando (oder Perl-Routine) nach Ende des Befehls |
aggregation | : Auswahl einer Aggregationsperiode |
device | : einschließen oder ausschließen von Datensätzen die <device> enthalten |
diffAccept | : akzeptierte positive Werte-Differenz zwischen zwei unmittelbar aufeinander folgenden Datensätzen |
executeBeforeProc | : ausführen FHEM Kommando (oder Perl-Routine) vor Start Operation |
executeAfterProc | : ausführen FHEM Kommando (oder Perl-Routine) nach Ende Operation |
reading | : einschließen oder ausschließen von Datensätzen die <reading> enthalten |
readingNameMap | : die entstehenden Ergebnisreadings werden partiell umbenannt |
time* | : eine Reihe von Attributen zur Zeitabgrenzung |
valueFilter | : ein zusätzliches REGEXP um die Datenselektion zu steuern. Der REGEXP wird auf das Datenbankfeld 'VALUE' angewendet. |
dumpComment | : User-Kommentar im Dumpfile |
dumpCompress | : Komprimierung des Dumpfiles nach der Erstellung |
dumpDirLocal | : das lokale Zielverzeichnis für die Erstellung des Dump |
dumpMemlimit | : Begrenzung der Speicherverwendung |
dumpSpeed | : Begrenzung die CPU-Belastung |
dumpFilesKeep | : Anzahl der aufzubwahrenden Dumpfiles |
executeBeforeProc | : ausführen FHEM Kommando (oder Perl-Routine) vor dem Dump |
executeAfterProc | : ausführen FHEM Kommando (oder Perl-Routine) nach dem Dump |
optimizeTablesBeforeDump | : Tabelloptimierung vor dem Dump ausführen |
dumpDirRemote | : das Erstellungsverzeichnis des Dumpfile auf dem entfernten Server |
dumpCompress | : Komprimierung des Dumpfiles nach der Erstellung |
dumpDirLocal | : Directory des lokal gemounteten dumpDirRemote-Verzeichnisses |
dumpFilesKeep | : Anzahl der aufzubwahrenden Dumpfiles |
executeBeforeProc | : ausführen FHEM Kommando (oder Perl-Routine) vor dem Dump |
executeAfterProc | : ausführen FHEM Kommando (oder Perl-Routine) nach dem Dump |
optimizeTablesBeforeDump | : Tabelloptimierung vor dem Dump ausführen |
ftpUse | : FTP Transfer nach dem Dump wird eingeschaltet (ohne SSL Verschlüsselung) |
ftpUser | : User zur Anmeldung am FTP-Server, default: anonymous |
ftpUseSSL | : FTP Transfer mit SSL Verschlüsselung nach dem Dump wird eingeschaltet |
ftpDebug | : Debugging des FTP Verkehrs zur Fehlersuche |
ftpDir | : Verzeichnis auf dem FTP-Server in welches das File übertragen werden soll (default: "/") |
ftpDumpFilesKeep | : Es wird die angegebene Anzahl Dumpfiles im <ftpDir> belassen (default: 3) |
ftpPassive | : setzen wenn passives FTP verwendet werden soll |
ftpPort | : FTP-Port, default: 21 |
ftpPwd | : Passwort des FTP-Users, default nicht gesetzt |
ftpServer | : Name oder IP-Adresse des FTP-Servers. notwendig ! |
ftpTimeout | : Timeout für die FTP-Verbindung in Sekunden (default: 30). |
dumpCompress | : Komprimierung des Dumpfiles nach der Erstellung |
dumpDirLocal | : Zielverzeichnis der Dumpfiles |
dumpFilesKeep | : Anzahl der aufzubwahrenden Dumpfiles |
executeBeforeProc | : ausführen FHEM Kommando (oder Perl-Routine) vor dem Dump |
executeAfterProc | : ausführen FHEM Kommando (oder Perl-Routine) nach dem Dump |
optimizeTablesBeforeDump | : Tabelloptimierung vor dem Dump ausführen |
aggregation | : Festlegung der Selektionspaketierung |
device | : einschließen oder ausschließen von Datensätzen die <device> enthalten |
reading | : einschließen oder ausschließen von Datensätzen die <reading> enthalten |
executeBeforeProc | : FHEM Kommando (oder Perl-Routine) vor dem Export ausführen |
executeAfterProc | : FHEM Kommando (oder Perl-Routine) nach dem Export ausführen |
expimpfile | : der Name des Exportfiles |
time.* | : eine Reihe von Attributen zur Zeitabgrenzung |
valueFilter | : ein zusätzliches REGEXP um die Datenselektion zu steuern. Der REGEXP wird auf das Datenbankfeld 'VALUE' angewendet. |
attr <name> widgetOverride fetchMarkDuplicates:colorpicker
device | : einschließen oder ausschließen von Datensätzen die <device> enthalten |
fetchRoute | : Leserichtung der Selektion innerhalb der Datenbank |
fetchMarkDuplicates | : Hervorhebung von gefundenen Dubletten |
fetchValueFn | : der angezeigte Wert des VALUE Datenbankfeldes kann mit einer Funktion vor der Readingerstellung geändert werden |
limit | : begrenzt die Anzahl zu selektierenden bzw. anzuzeigenden Datensätze |
executeBeforeProc | : FHEM Kommando (oder Perl-Routine) vor dem Befehl ausführen |
executeAfterProc | : FHEM Kommando (oder Perl-Routine) nach dem Befehl ausführen |
reading | : einschließen oder ausschließen von Datensätzen die <reading> enthalten |
time.* | : eine Reihe von Attributen zur Zeitabgrenzung |
valueFilter | : filtert die anzuzeigenden Datensätze mit einem regulären Ausdruck (Datenbank spezifischer REGEXP). Der REGEXP wird auf Werte des Datenbankfeldes 'VALUE' angewendet. |
list_all | : listet die vorhandenen Indexe auf |
recreate_Search_Idx | : erstellt oder erneuert (falls vorhanden) den Index Search_Idx in Tabelle history (Index für DbLog) |
drop_Search_Idx | : löscht den Index Search_Idx in Tabelle history |
recreate_Report_Idx | : erstellt oder erneuert (falls vorhanden) den Index Report_Idx in Tabelle history (Index für DbRep) |
drop_Report_Idx | : löscht den Index Report_Idx in Tabelle history |
useAdminCredentials | : benutzt einen privilegierten User für die Operation |
executeBeforeProc | : FHEM Kommando (oder Perl-Routine) vor dem Befehl ausführen |
executeAfterProc | : FHEM Kommando (oder Perl-Routine) nach dem Befehl ausführen |
executeBeforeProc | : FHEM Kommando (oder Perl-Routine) vor dem Import ausführen |
executeAfterProc | : FHEM Kommando (oder Perl-Routine) nach dem Import ausführen |
expimpfile | : der Name des Importfiles |
showInfo | : zeigt Informationen zum belegten / freien Speicherplatz innerhalb der Datenbank |
execute | : führt die Optimierung aller Tabellen in der Datenbank aus |
ohne Angabe von mode | : die Daten werden auf den ersten Eintrag pro Stunde je Device & Reading reduziert |
average | : numerische Werte werden auf einen Mittelwert pro Stunde je Device & Reading reduziert, sonst wie ohne mode |
average=day | : numerische Werte werden auf einen Mittelwert pro Tag je Device & Reading reduziert, sonst wie ohne mode |
Die FullDay-Option (es werden immer volle Tage selektiert) wird impliziert verwendet. | |
max | : numerische Werte werden auf den Maximalwert pro Stunde je Device & Reading reduziert, sonst wie ohne mode |
max=day | : numerische Werte werden auf den Maximalwert pro Tag je Device & Reading reduziert, sonst wie ohne mode |
Die FullDay-Option (es werden immer volle Tage selektiert) wird impliziert verwendet. | |
min | : numerische Werte werden auf den Minimalwert pro Stunde je Device & Reading reduziert, sonst wie ohne mode |
min=day | : numerische Werte werden auf den Minimalwert pro Tag je Device & Reading reduziert, sonst wie ohne mode |
Die FullDay-Option (es werden immer volle Tage selektiert) wird impliziert verwendet. | |
sum | : numerische Werte werden auf die Summe pro Stunde je Device & Reading reduziert, sonst wie ohne mode |
sum=day | : numerische Werte werden auf die Summe pro Tag je Device & Reading reduziert, sonst wie ohne mode |
Die FullDay-Option (es werden immer volle Tage selektiert) wird impliziert verwendet. |
___purge_sqlhistory___ | : löscht den History Cache |
___list_sqlhistory___ | : zeigt die aktuell im Cache vorhandenen SQL-Statements incl. ihrem Cache Key (ckey) |
___save_sqlhistory___ | : sichert den History Cache manuell |
___restore_sqlhistory___ | : stellt die letzte Sicherung des History Cache wieder her |
50mostFreqLogsLast2days | ermittelt die 50 am häufigsten vorkommenden Loggingeinträge der letzten 2 Tage |
allDevCount | alle in der Datenbank vorkommenden Devices und deren Anzahl |
allDevReadCount | alle in der Datenbank vorkommenden Device/Reading-Kombinationen und deren Anzahl |
50DevReadCount | die 50 am häufigsten in der Datenbank enthaltenen Device/Reading-Kombinationen |
recentReadingsOfDevice | ermittelt die neuesten in der Datenbank vorhandenen Datensätze eines Devices. Das auszuwertende |
Device muß im Attribut device definiert sein. | |
readingsDifferenceByTimeDelta | ermittelt die Wertedifferenz aufeinanderfolgender Datensätze eines Readings. Das auszuwertende |
Device und Reading muß im Attribut device bzw. reading definiert sein. | |
Die Zeitgrenzen der Auswertung werden durch die time.*-Attribute festgelegt. |
writeToDB | : schreibt jeweils einen Wert mit den Zeitstempeln XX:XX:01 und XX:XX:59 innerhalb der jeweiligen Auswertungsperiode |
writeToDBSingle | : schreibt nur einen Wert mit dem Zeitstempel XX:XX:59 am Ende einer Auswertungsperiode |
writeToDBInTime | : schreibt jeweils einen Wert am Anfang und am Ende der Zeitgrenzen einer Auswertungsperiode |
sub dbval { my $name = shift; my $cmd = shift; my $ret = CommandGet(undef,"$name sqlCmdBlocking $cmd"); return $ret; }kann sqlCmdBlocking vereinfacht verwendet werden mit Aufrufen wie:
rel | : zeigt nur Release Informationen |
hints | : zeigt nur Hinweise an |
<key> | : es wird der Hinweis mit der angegebenen Nummer angezeigt |
{ "<source-reading> => "<dest.device> [=> <dest.-reading>]", "<source-reading> => "<dest.device> [=> <dest.-reading>]", ... }In der Angabe <source-reading> sind Wildcards (.*) erlaubt.
{ ".*" => "Dum.Rep.All", ".*AVGAM.*" => "Dum.Rep => average", ".*SUM.*" => "Dum.Rep.Sum => summary", } # alle Readings werden zum Device "Dum.Rep.All" übertragen, Readingname bleibt im Ziel erhalten # Readings mit "AVGAM" im Namen werden zum Device "Dum.Rep" in das Reading "average" übertragen # Readings mit "SUM" im Namen werden zum Device "Dum.Rep.Sum" in das Reading "summary" übertragen
avgArithmeticMean: | Es wird der arithmetische Mittelwert berechnet. (default) |
avgDailyMeanGWS: | Berechnet die Tagesmitteltemperatur entsprechend den |
Vorschriften des deutschen Wetterdienstes. (siehe "get <name> versionNotes 2") | |
Diese Variante verwendet automatisch die Aggregation "day". | |
avgDailyMeanGWSwithGTS: | Wie "avgDailyMeanGWS" und berechnet zusätzlich die Grünlandtemperatursumme. |
Ist der Wert 200 erreicht, wird das Reading "reachedGTSthreshold" mit dem Datum | |
des erstmaligen Erreichens dieses Schwellenwertes erstellt. | |
Hinweis: Das Attribut timestamp_begin muss auf den Beginn eines Jahres gesetzt werden! | |
(siehe "get <name> versionNotes 5") | |
avgTimeWeightMean: | Berechnet den zeitgewichteten Mittelwert. |
Hinweis: Es müssen mindestens zwei Datenpunkte pro aggregation Periode vorhanden sein. |
attr <name> device TYPE=DbRep
attr <name> device MySTP_5000
attr <name> device SMA.*,MySTP.*
attr <name> device SMA_Energymeter,MySTP_5000
attr <name> device %5000
attr <name> device TYPE=SSCam EXCLUDE=SDS1_SVS
attr <name> device TYPE=SSCam,TYPE=ESPEasy EXCLUDE=SDS1_SVS
attr <name> device EXCLUDE=SDS1_SVS
attr <name> device EXCLUDE=TYPE=SSCam
sub adump { my ($name) = @_; my $hash = $defs{$name}; # die eigene Funktion, z.B. Log3($name, 3, "DbRep $name -> Dump ist beendet"); return; }
sub bdump { my ($name) = @_; my $hash = $defs{$name}; # die eigene Funktion, z.B. Log3($name, 3, "DbRep $name -> Dump startet"); return; }
%L | : wird ersetzt durch den Wert des global logdir Attributs |
%TSB | : wird ersetzt durch den (berechneten) Wert des Starttimestamps der Datenselektion |
Allgemein gebräuchliche POSIX-Wildcards sind: | |
%d | : Tag des Monats (01..31) |
%m | : Monat (01..12) |
%Y | : Jahr (1970...) |
%w | : Wochentag (0..6); beginnend mit Sonntag (0) |
%j | : Tag des Jahres (001..366) |
%U | : Wochennummer des Jahres, wobei Wochenbeginn = Sonntag (00..53) |
%W | : Wochennummer des Jahres, wobei Wochenbeginn = Montag (00..53) |
attr <name> expimpfile /sds1/backup/exptest_%TSB.csv
attr <name> expimpfile /sds1/backup/exptest_%Y-%m-%d.csv
attr <name> reading etotal
attr <name> reading et%
attr <name> reading etotal,etoday
attr <name> reading eto%,Einspeisung EXCLUDE=etoday
attr <name> reading etotal,etoday,Ein% EXCLUDE=%Wirkleistung
attr <name> seqDoubletsVariance 0.0014
attr <name> seqDoubletsVariance 1.45
attr <name> seqDoubletsVariance 3.0 2.0
attr <name> seqDoubletsVariance 1.5 EDGE=negative
sub resfromjson { my ($name,$reading,$value) = @_; my $hash = $defs{$name}; if ($reading eq "SqlResult") { # nur Reading SqlResult enthält JSON-kodierte Daten my $data = decode_json($value); foreach my $k (keys(%$data)) { # ab hier eigene Verarbeitung für jedes Hash-Element # z.B. Ausgabe jedes Element welches "Cam" enthält my $ke = $data->{$k}; if($ke =~ m/Cam/i) { my ($res1,$res2) = split("\\|", $ke); Log3($name, 1, "$name - extract element $k by userExitFn: ".$res1." ".$res2); } } } return; }
attr <name> timeDiffToNow 86400
attr <name> timeDiffToNow d:2 h:3 m:2 s:10
attr <name> timeDiffToNow m:600
attr <name> timeDiffToNow h:2.5
attr <name> timeDiffToNow y:1 h:2.5
attr <name> timeDiffToNow y:1.5
attr <name> timeDiffToNow d:8 FullDay
attr <name> timeOlderThan 86400
attr <name> timeOlderThan d:2 h:3 m:2 s:10
attr <name> timeOlderThan m:600
attr <name> timeOlderThan h:2.5
attr <name> timeOlderThan y:1 h:2.5
attr <name> timeOlderThan y:1.5
attr <name> timeOlderThan d:8 FullDay
sub UserFunction { my $name = shift; # der Name des DbRep-Devices my $reading = shift; # der Namen des erstellen Readings my $value = shift; # der Wert des Readings my $hash = $defs{$name}; ... # z.B. übergebene Daten loggen Log3 $name, 1, "UserExitFn $name called - transfer parameter are Reading: $reading, Value: $value " ; ... return; }Im Attribut wird die Subroutine und optional ein Reading:Value Regex als Argument angegeben. Ohne diese Angabe werden alle Wertekombinationen als "wahr" gewertet und an die Subroutine übergeben (entspricht .*:.*).
{ if ($READING =~ /PrEnergySumHwc1_0_value__DIFF/) { my $mpk = AttrVal($NAME, 'Multiplikator', '0'); my $tarf = AttrVal($NAME, 'Tarif', '0'); # Kosten €/kWh my $m3 = sprintf "%.3f", $VALUE/10000 * $mpk; # verbrauchte m3 my $kwh = sprintf "%.3f", $m3 * AttrVal($NAME, 'Brennwert_kWh/m3', '0'); # Umrechnung m3 -> kWh my $cost = sprintf "%.2f", $kwh * $tarf; my $hash = $defs{$NAME}; readingsBulkUpdate ($hash, 'gas_consumption_m3', $m3); readingsBulkUpdate ($hash, 'gas_consumption_kwh', $kwh); readingsBulkUpdate ($hash, 'gas_costs_euro', $cost); } }# Es werden die Readings gas_consumption_m3, gas_consumption_kwh und gas_costs_euro berechnet und im DbRep-Device erzeugt.
define Rep.Agent DbRep LogDB
attr Rep.Agent devStateIcon connected:10px-kreis-gelb .*disconnect:10px-kreis-rot .*done:10px-kreis-gruen
attr Rep.Agent icon security
attr Rep.Agent role Agent
attr Rep.Agent room DbLog
attr Rep.Agent showproctime 1
attr Rep.Agent stateFormat { ReadingsVal($name, 'state', '') eq 'running' ? 'renaming' : ReadingsVal($name, 'state', ''). ' »; ProcTime: '.ReadingsVal($name, 'sql_processing_time', '').' sec'}
attr Rep.Agent timeout 86400
Das DoorBird Modul ermöglicht die Komminikation zwischen der DoorBird Interkommunikationseinheit und dem fhem Automationssystem basierend auf der API des Herstellers her. Für den vollen Funktionsumfang muss sichergestellt werden, dass das Setting "API-Operator" in der DoorBird Android/iPhone - APP unter "Administration -> User -> Edit -> Permission -> API-Operator" gesetzt ist. Die folgenden Software - Pakete müssen noch zusätzlich installiert werden, sofern dies nicht schon durch andere Module erfolgt ist. (Die Beispiele sind auf dem Raspberry JESSIE gestestet):
|
Set |
|
Get |
|
Attributes |
|
define <name> EGPM <device> <socket-nr>
set <name> <[on|off|toggle]>
set <name> <[on-for-timer|off-for-timer|on-till|off-till|blink|intervals]>
define lampe1 EGPM steckdose 1
set lampe1 on
define <name> EGPM2LAN <IP-Address>
set <name> <[on|off|toggle]> <socketnr.>
set <name> <[on|off]> <all>
set <name> password [<mein-passwort>]
set <name> <staterequest>
set <name> <clearreadings>
get <name> state
define sleiste EGPM2LAN 10.192.192.20
set sleiste password SecretGarden
set sleiste on 1
Das ElectricityCalculator Modul berechnet den Verbrauch an elektrischer Energie (Stromverbrauch) und den verbundenen Kosten von einem oder mehreren Elektrizitätszählern. Es ist kein eigenes Zählermodul sondern benötigt eine Regular Expression (regex or regexp) um das Reading mit dem kontinuierlich wachsenden Zählerstand von einem oder mehreren Electrizitätszählern zu finden. Sobald das Modul in der fhem.cfg definiert wurde, reagiert das Modul auf jedes durch das regex definierte event wie beispielsweise ein myOWDEVICE:counter.* etc. Das ElectricityCalculator Modul berechnet augenblickliche, historische statistische und vorhersehbare Werte von einem oder mehreren Elektrizitätszählern und erstellt die entsprechenden Readings. Um zu verhindern, dass man bis zu 12 Monate warten muss, bis alle Werte der Realität entsprechen, müssen die Readings <DestinationDevice>_<SourceCounterReading>_CounterDay1st ,<DestinationDevice>_<SourceCounterReading>_CounterMonth1st ,<DestinationDevice>_<SourceCounterReading>_CounterYear1st und<DestinationDevice>_<SourceCounterReading>_CounterMeter1st entsprechend mit dem setreading - Befehl korrigiert werden.Diese Werte findet man unter Umständen auf der letzten Abrechnung des Elektrizitätsversorgers. Andernfalls dauert es bis zu 24h für die täglichen, 30 Tage für die monatlichen und bis zu 12 Monate für die jährlichen Werte bis diese der Realität entsprechen. Intervalle kleienr als 10s werden ignoriert um Spitzen zu verhindern die von Blockaden des fhem Systems hervorgerufen werden (z.B. DbLog - reducelog). |
Attributes |
Zusätzlich können die globalen Attribute wie room verwendet werden. |
| : Aktueller Zählerstand am mechanischen Zähler. Bei Unterschied muss das Offset-Attribut entspechend korrigiert werden. |
| : Der erste Zählerstand des laufenden Tages seit Mitternacht. |
| : Der letzte Zählerstand des vorherigen Tages. |
| : Der erste Zählerstand seit Mitternacht des ersten Tages der laufenden Ableseperiode. |
| : Der letzte Zählerstand seit Mitternacht des ersten Tages der vorherigen Ableseperiode. |
| : Der erste Zählerstand seit Mitternacht des ersten Tages des laufenden Monats. |
| : Der letzte Zählerstand des vorherigen Monats. |
| : Der erste Zählerstand seit Mitternacht des ersten Tages des laufenden Jahres. |
| : Der letzte Zählerstand des letzten Jahres. |
| : Elektrische Energiekosten des letzten Tages. |
| : Elektrische Energiekosten der letzten Ableseperiode. |
| : Elektrische Energiekosten des letzten Monats. |
| : Elektrische Energiekosten des letzten Kalenderjahres. |
| : Energiekosten in gewählter Währung seit Mitternacht des laufenden Tages. |
| : Energiekosten in gewählter Währung seit Beginn der laufenden Ableseperiode. |
| : Energiekosten in gewählter Währung seit Beginn des laufenden Monats. |
| : Energiekosten in gewählter Währung seit Beginn des laufenden Kalenderjahres. |
| : Energieverbrauch seit Beginn der aktuellen Tages (Mitternacht). |
| : Energieverbrauch in kWh des vorherigen Tages. |
| : Energieverbrauch seit Beginn der aktuellen Ableseperiode. |
| : Energieverbrauch in kWh der vorherigen Ableseperiode. |
| : Energieverbrauch seit Beginn des aktuellen Monats. |
| : Energieverbrauch in kWh des vorherigen Monats. |
| : Energieverbrauch seit Beginn des aktuellen Kalenderjahres. |
| : Energieverbrauch in kWh des vorherigen Kalenderjahres. |
| : Finanzielle Reserve basierend auf den Abschlagszahlungen die jeden Monat an den Elektrizitätsversorger gezahlt werden. Bei negativen Werten ist von einer Nachzahlung auszugehen. |
| : Anzahl der Monate seit der letzten Zählerablesung. Der Monat der Zählerablesung ist der erste Monat = 1. |
| : Aktuelle elektrische Leistung. (Mittelwert zwischen aktueller und letzter Messung) |
| : Mittlere elektrische Leistung seit Mitternacht. |
| : Maximale elektrische Leistungsaufnahme seit Mitternacht. |
| : Minimale elektrische Leistungsaufnahme seit Mitternacht. |
define <name> FBAHA <device>
define fb1 FBAHA fritz.box:2002
define fb1 FBAHA UNIX:SEQPACKET:/var/tmp/me_avm_home_external.ctl
define <name> FBDECT [<FBAHAname>:]<id> props
define lampe FBDECT 16 switch,powerMeter
<= ((o))
=> ((o))
<= [=]
=> [=]
<= X
=> X
=> O_O
<=
=>
define <Name> FB_CALLLIST <FB_CALLMONITOR Name>
.*
zu stellen um die hohe Anzahl an Events in bestimmten Fällen zu minimieren.attr <name> connection-mapping {'DECT_1' => 'Mobilteil Küche', 'FON1' => 'Fax', 'Answering_Machine_1' => 'Anrufbeantworter'}
0123456789.jpg
oder 0345678901.gif
) enthalten ist, wird diese als Kontaktbild in der Anrufliste verwendet.
unknown.jpg
) als Kontaktbild verwendet.
Die Datei muss sich dabei in dem Verzeichnis befinden, welches via Attribut contactImageDirectory konfiguriert ist.
23:00-24:00 00:00-01:00Standardwert ist nicht gesetzt (dauerhaft aktiv)
1 minute
oder 30 minutes
1 hour
oder 12 hours
1 day
oder 5 days
1 month
oder 6 months
(ein Monat entspricht hierbei 30 Tagen month is here equal to 30 days)1 year
oder 2 years
(ein Jahr entspricht hierbei 365 Tagen)0.5 day
).
Der Wert 0
bedeutet, das keine Gespräche nach einem gewissen Zeitfenster gelöscht werden.attr <name> external-mapping {'ISDN' => 'Festnetz', 'SIP0' => 'Anbieter A', 'SIP1' => 'Anbieter B'}
attr <name> icon-mapping {'incoming.connected' => 'phone_ring_in@yellow', 'outgoing.missed' => 'phone_missed_out@red'}
attr <name> internal-number-filter 304050,304060
attr <name> internal-number-filter {'304050' => 'geschftl.', '304060' => 'privat'}
all
- Alle Anrufe werden angezeigtincoming
- Alle eingehenden Anrufe werden angezeigt (aktive und abgeschlossene)outgoing
- Alle ausgehenden Anrufe werden angezeigt (aktive und abgeschlossene)missed-calls
- Alle eingehenden, verpassten Anrufe werden angezeigt.completed
- Alle abgeschlossenen Anrufe werden angezeigt (eingehend und ausgehend)active
- Alle aktuell laufenden Anrufe werden angezeigt (eingehend und ausgehend)$NUMBER
wird dabei mit der entsprechenden Rufnummer der jeweiligen Zeile ersetzt.
set FRITZBOX call $NUMBER
{dialNumber("$NUMBER")}
%a
- Der abgekürzte Wochentagname%b
- Der abgekürzte Monatsname%S
- Die Sekunden als Dezimalzahl%M
- Die Minuten als Dezimalzahl%H
- Die Stunden als Dezimalzahl%d
- Der Tag im Monat als Dezimalzahl%m
- Der Monat als Dezimalzahl%Y
- Das Jahr als Dezimalzahl (4-stellig).strftime()
oder der Dokumentation des entsprechenden Perl Interpreters.
row,state,timestamp,image,name,number,internal,external,connection,duration
#96*5* - Callmonitor aktivieren
#96*4* - Callmonitor deaktivieren
define <name> FB_CALLMONITOR <IP-Addresse>[:Port]
set <name> reopen
set <name> rereadCache
set <name> rereadPhonebook
set <name> rereadTextfile
set <name> password <Passwort>
get <name> search <phone-number>
get <name> showPhonebookIds
get <name> showPhonebookEntries [Phonebook-ID]
get <name> showCacheEntries
get <name> showTextEntries
23:00-24:00 00:00-01:00Standardwert ist nicht gesetzt (dauerhaft aktiv)
<Nummer1>,<Name1> <Nummer2>,<Name2> ... <NummerN>,<NameN>Die Datei kann dabei auch Kommentar-Zeilen enthalten mit # vorangestellt. Sollte die Datei nicht existieren, wird sie durch FHEM erstellt.
tr064
) und speichert diese in dem Verzeichnis contactImageDirectory.
Die heruntergeladenen Kontaktbilder werden dann automatisch für das Reading "contact_image" verwendet.
define <name> FHEM2FHEM <host>[:<portnr>][:SSL] [LOG:regexp|RAW:devicename] {portpassword}
define telnetPort telnet 7072 global
define ds1 FHEM2FHEM 192.168.178.22:7072 LOG:.*
define RpiCUL CUL none 0000
define ds2 FHEM2FHEM 192.168.178.22:7072 RAW:RpiCUL
rename CUL_0 RpiCUL
define <name> FHEMWEB <tcp-portnr> [global|IP]
get myFHEMWEB icon FS20.on
/data/Homeautomation/fhem/FHEM/FS20.on.png
attr WEB column LivingRoom:FS20,notify|FHZ,notify DiningRoom:FS20|FHZ
attr WEB CssFiles pgm2/mystyle.css
Own modules and helper files:$MW_dir:^(.*sh|[0-9][0-9].*Util.*pm|.*cfg|.*holiday|myUtilsTemplate.pm|.*layout)$
Gplot files:$FW_gplotdir:^.*gplo