DOIF: Unterschied zwischen den Versionen

Aus FHEMWiki
(→‎Anwendungsbeispiele: Waschmaschine beschrieben)
(→‎Perl-Modus: Link ins Wiki statt Commandref)
 
(90 dazwischenliegende Versionen von 10 Benutzern werden nicht angezeigt)
Zeile 2: Zeile 2:
|ModPurpose=Do ... if ...  
|ModPurpose=Do ... if ...  
|ModType=h
|ModType=h
|ModForumArea=Automatisierung
|ModForumArea=Automatisierung/DOIF
|ModTechName=98_DOIF.pm
|ModTechName=98_DOIF.pm
|ModOwner=Damian}}
|ModOwner=Damian}}


[[DOIF]] ermöglicht, Aktionen ("do") unter bestimmten Bedingungen ("if") auszuführen. Bedingungen umfasst auch Konstrukte wie "wenn Zustand x ([[watchdog]]) für y Minuten... (Zeitsteuerung)".
[[Datei:Helper doif.png|50px]] (ausgesprochen: du if, übersetzt: tue wenn) ist ein universelles Modul, welches [[Event|ereignis]]- und zeitgesteuert in Abhängigkeit definierter Bedingungen Anweisungen ausführt.
 
Im '''FHEM-Modus''' stellt das Modul [[DOIF]] eine eigene Benutzer-Schnittstelle zur Verfügung ohne Programmierkenntnisse in [https://de.wikipedia.org/wiki/Perl_(Programmiersprache) Perl] unmittelbar vorauszusetzen. Mit diesem Modul ist es möglich, sowohl Ereignis- als auch Zeitsteuerung mit Hilfe logischer Abfragen miteinander zu kombinieren. Damit können komplexere Problemstellungen innerhalb eines [[DOIF]]-Moduls gelöst werden, ohne Perlcode in Kombination mit anderen Modulen programmieren zu müssen.
 
Im '''Perl-Modus''' bietet das Modul [[DOIF]] die Möglichkeit Perl-Blöcke zeit- und ereignisgesteuert auszuführen. Zur Beschreibung der [[DOIF/Einsteigerleitfaden,_Grundfunktionen_und_Erläuterungen#Ausl.C3.B6ser|'''Auslöser''']] kann die DOIF-Syntax, die Angaben in eckigen Klammern direkt in einem Perl-Ausdruck verwendet werden.
 
Das DOIF-Modul verfügt inzwischen über ein [https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg '''eigenes WEB-Interface'''], mit dessen Hilfe sich in tabellarischer Darstellung jegliche Informationen visualisieren sowie FHEM-Geräte über Widgets steuern lassen.


Details zu diesem Modul finden sich derzeit nur in {{Link2Forum|Topic=23833|LinkText=diesem Forenthread}}.


== Voraussetzungen ==
== Voraussetzungen ==
Siehe Forum.
keine


== Anwendung ==
== Anwendung ==
=== Define ===
=== Define ===
Siehe Forum.
==== FHEM-Modus ====
Siehe {{Link2CmdRef|Lang=de|Anker=DOIF_}}
==== Perl-Modus ====
Siehe [[DOIF/Perl-Modus]]


=== Attribute ===
=== Attribute ===
Siehe Forum.
==== FHEM-Modus ====
Siehe {{Link2CmdRef|Lang=de|Anker=DOIF_Attribute}}
==== Perl-Modus ====
Siehe [[DOIF/Perl-Modus#Nutzbare_Attribute_im_Perl-Modus]]
 
===Kurzreferenz===
Siehe {{Link2CmdRef|Lang=de|Anker=DOIF_Kurzreferenz|Label=Kurzreferenz}}


== Anwendungsbeispiele ==
== Anwendungsbeispiele ==
Siehe Forum.
Der Modulautor hat '''im deutschen Teil''' der {{Link2CmdRef|Lang=de|Anker=DOIF}}  eine Vielzahl von einfachen und auch komplexeren Beispielen zur Nutzung von DOIF aufgenommen. Darum wird hier auf weitere Beispiele zu DOIF verzichtet. Ausführliche Code-Beispiele zu DOIF bitte gegebenenfalls als eigene Wiki-Seite unter [[:Kategorie:Code Snippets|Code Snippets]] aufnehmen.


=== Waschmaschine Fertigmeldung ===
== Links ==
Mit DOIF lässt sich sehr einfach eine Fertigmeldung für die Waschmaschine realisieren. Alles was dazu nötig ist, ist ein Dummy-Device das den aktuellen Betriebszustand der Waschmaschine enthält, ein notify der darauf reagiert und z.b. eine Nachricht via pushover sendet und ein DOIF das die Bedingungen für die Änderung des Betriebszustandes definiert. Im Beispiel unten ist im DOIF eine Schwelle von 5 Watt gesetzt ab der das Dummy-Device auf "on" gesetzt wird. Mittels wait wird für diese erste Bedingung eine Zeit von 60 Sekunden angegeben über die die 5 Watt genutzt werden müssen. Für den "fertig"-Fall wird ein Schwellenwert von 4 Watt angesetzt der für mindestens 300 Sekunden unterschritten werden muss.
* [[DOIF/Einsteigerleitfaden, Grundfunktionen und Erläuterungen]]
 
* [[DOIF/Tools und Fehlersuche]]
<code>
* [[DOIF/Tipps zur leichteren Bedienung]] Erstellung, Bearbeitung, Syntaxhervorhebung, Klammerprüfung, Suchen&Ersetzen, Zeilennummerierung, uvm. (nicht nur) von DOIF
define waschmaschine_betrieb dummy
* [[DOIFtools]] Tools für DOIF, Eventanalyse für Alle
attr waschmaschine_betrieb event-on-change-reading state
* [[DOIF/uiTable_Schnelleinstieg]]
 
* [[DOIF/uiTable]]
define waschmaschine_DI DOIF ([waschmaschine_Pwr:power]>5) (set waschmaschine_betrieb on) DOELSEIF ([waschmaschine_Pwr:power]<4) (set waschmaschine_betrieb off)
* [[Import von Code Snippets]] oder [[Raw definition]]
attr waschmaschine_DI wait 60:300
 
define waschmaschine_fertig_pushover notify waschmaschine_betrieb:off set pushover msg 'Waschmaschine' 'Waschmaschine ist jetzt fertig!'
</code>
 
Getestet wurde der Code mit einem [[HM-ES-PMSw1-Pl_Funk-Schaltaktor_1-fach_mit_Leistungsmessung]]. Dabei ist waschmaschine_Pwr das Device zu Channel 2.
 
=== On-for-timer simulieren ===
Die on-for-timer Funktion kann für Geräte, die das nicht von Haus aus unterstützen mit folgenden Definitionen simuliert werden:


<pre>
=== FHEM-Modus: Weiterführende Themen und Beispiele ===
define schalter_d dummy
* [[DOIF/Labor - ausführbare, praxisnahe Beispiele als Problemlösung zum Experimentieren]]
* [[DOIF/Operatorenrangfolge]]
* [[DOIF/Ein- und Ausgabe in FHEMWEB und Tablet-UI am Beispiel einer Schaltuhr]]
* [[DOIF/Mehrfachnutzung eines Tasters]]
* [[DOIF/Zeitgeber]] Wecker, Kurzzeitwecker, Tageszeitgeber
* [[DOIF/Zeitspanne zwischen zwei Terminen schalten]]
* [[DOIF/do always Alternative am Beispiel einer Rollladenautomatik]]
* [[DOIF/do_always_Alternative_am_Beispiel_einer_Batteriewarnung_via_Telegram]]
* [[DOIF/Zeitspanne im DOIF und disabledForIntervals im Vergleich]]
* [[DOIF/partielle Deaktivierung der Befehlsausführung, Zurücksetzen eines Wait-Timers mit $SELF oder IsDisabled verhindern, im Vergleich]]
* DOIF/Verwenden von sunrise / sunset in Zeitintervall im {{Link2Forum|Topic=58884|LinkText=Forenthread}}


define di_Schalter DOIF ([Bewegungsmelder] eq "motion" ) (set schalter_d on, set schalter_d off)
=== Perl-Modus: Weiterführende Themen und Beispiele ===
attr di_Schalter do always
* DOIF/Logeinträge als Trigger (Auslöser) verwenden {{Link2Forum|Topic=99203|Message=926068|LinkText=Forenthread}}
* BOTVAC (Neato, Vorwerk) und DOIF: [[BOTVAC#Alle_Maps_in_einem_Reading_anzeigen|Alle Maps in einem Reading anzeigen]] und {{Link2Forum|Topic=51713|Message=933448|LinkText=Forenthread}}


define di_Licht DOIF ([schalter_d] eq "on") (set Licht on) DOELSE  (set Licht off)
===Entwicklungshistorie===
attr di_Licht wait 0:300
121004
</pre>
* {{Link2Forum|Topic=121004|LinkText=Forenthread}} neues Attribut: uiState
 
* {{Link2Forum|Topic=114252|LinkText=Forenthread}} neue Feature: wiederholende Ausführungstimer mit Bedingung
Details dazu finden sich in {{Link2Forum|Topic=23833|Message=193660|LinkText=diesem Forenbeitrag}}.
* {{Link2Forum|Topic=111266|LinkText=Forenthread}} neue Features: Generalisierung mit Templates
 
* {{Link2Forum|Topic=103401|LinkText=Forenthread}} Umstellung auf NOTIFYDEV-Filter
Alternativ kann man die on-for-timer Funktion durch Verwendung von [[ReadingsProxy|readingsProxy]] simulieren, da readingsProxy-Geräte alle Funktionen der [http://fhem.de/commandref.html#setExtensions setExtension] unterstützen.
* {{Link2Forum|Topic=97320|LinkText=Forenthread}} Neues Feature: event_Readings
 
* {{Link2Forum|Topic=95759|LinkText=Forenthread}} Neues Feature: Durchschnitt, Median, Differenz, prozentualer Anstieg
== Links ==
* {{Link2Forum|Topic=94728|LinkText=Forenthread}} Wochentagsteuerung
* {{Link2Forum|Topic=88291|LinkText=Forenthread}} memory leak in perl 5.24
* {{Link2Forum|Topic=87183|LinkText=Forenthread}} Intervalltimer
* {{Link2Forum|Topic=82523|LinkText=Forenthread}} checkReadingEvent per Default intern gesetzt.
* {{Link2Forum|Topic=86579|LinkText=Forenthread}} keine Timer-Wiederholungen am gleichen Tag, betrifft  Mehrfachtriggerung bei sunset, sunrise, berechnete Timer, z.B. rand() u.ä.
* {{Link2Forum|Topic=84969|LinkText=Forenthread}} neue Features: ereignisgesteuertes Perl
* {{Link2Forum|Topic=81576|LinkText=Forenthread}} neues Attribut: startup, neuer set-Befehl: checkall, neuer get-Befehl: html
* {{Link2Forum|Topic=77690|LinkText=Forenthread}} neues Attribut: uiTable - DOIF User Interface, neues Attribut: DOIF_Readings
* {{Link2Forum|Topic=71000|LinkText=Forenthread}} neue Features: Attribut myReadings
* {{Link2Forum|Topic=70624|LinkText=Forenthread}} Neue Features: Aggregationsfunktion, Filtern nach Zahl mit Nachkommastellen
* {{Link2Forum|Topic=69392|LinkText=Forenthread}} neue Features: Wochentage mit Namen, Überarbeitung für indirekte Timer
* {{Link2Forum|Topic=68705|LinkText=Forenthread}} DOIF für Perlprogrammierer (Anm.: an dieser Stelle nicht eingeführt)
* {{Link2Forum|Topic=68000|LinkText=Forenthread}} neue Features: Perlcode ohne runde Klammern und ohne Semikolon-Dopplung
* {{Link2Forum|Topic=66153|LinkText=Forenthread}} neue Features: set <DOIF_Modul> cmd_<NR>, Zeitvariablen $md $ymd
* {{Link2Forum|Topic=63375|LinkText=Forenthread}} neue Features: checkall: timer|event|all, timertrigger, timerintervall
* {{Link2Forum|Topic=58556|LinkText=Forenthread}} neue Features: Ereignisfilter, Attribut checkall, setList, readingList
* {{Link2Forum|Topic=56851|LinkText=Forenthread}} Stati, Readings in Zeitfunktionen, set enable
* {{Link2Forum|Topic=55785|LinkText=Forenthread}} neue Features: disablecondition, Stati bei Zeitfunktionen (Anm.: disablecondition nicht eingeführt)
* {{Link2Forum|Topic=51117|LinkText=Forenthread}} Möglichkeit auf passende Events zu beschränken
* {{Link2Forum|Topic=51060|LinkText=Forenthread}} Neue Features - $SELF, $self, cmd-Reading, timerevent, selftrigger ...
* {{Link2Forum|Topic=49109|LinkText=Forenthread}} DOIF als endlicher Automat (finite state maschine)
* {{Link2Forum|Topic=48925|LinkText=Forenthread}} serialisierte Timer
* {{Link2Forum|Topic=46327|LinkText=Forenthread}} neue Features: Generalisierung, $DEVICE, $EVENT, Attribut notexist
* {{Link2Forum|Topic=43638|LinkText=Forenthread}} Attribut repeatcmd
* {{Link2Forum|Topic=41859|LinkText=Forenthread}} unabsichtliche Loops unterbunden
* {{Link2Forum|Topic=39070|LinkText=Forenthread}} wait als sleep Alternative
* {{Link2Forum|Topic=36889|LinkText=Forenthread}} mehrere DOIF-Zweige (Anm.: nicht eingeführt)
* {{Link2Forum|Topic=35638|LinkText=Forenthread}} neue Zeit-Features
* {{Link2Forum|Topic=35045|LinkText=Forenthread}} Zeitraster
* {{Link2Forum|Topic=34767|LinkText=Forenthread}} indirekte Zeitangaben, readingFnAttributes
* {{Link2Forum|Topic=34365|LinkText=Forenthread}} indirekte Zeitangaben
* {{Link2Forum|Topic=30847|LinkText=Forenthread}} relative Zeitangaben, Attribute: do resetwait, cmdpause, repeatsame, uvm.
* {{Link2Forum|Topic=23833|LinkText=Forenthread}} zur Entstehung dieses Moduls
* {{Link2Forum|Topic=23833|LinkText=Forenthread}} zur Entstehung dieses Moduls


<!-- (Modulkategorie wird automatisch gesetzt) -->
<!-- (Modulkategorie wird automatisch gesetzt) -->

Aktuelle Version vom 31. Dezember 2021, 17:51 Uhr

DOIF
Zweck / Funktion
Do ... if ...
Allgemein
Typ Hilfsmodul
Details
Dokumentation EN / DE
Support (Forum) Automatisierung/DOIF
Modulname 98_DOIF.pm
Ersteller Damian
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref!


Helper doif.png (ausgesprochen: du if, übersetzt: tue wenn) ist ein universelles Modul, welches ereignis- und zeitgesteuert in Abhängigkeit definierter Bedingungen Anweisungen ausführt.

Im FHEM-Modus stellt das Modul DOIF eine eigene Benutzer-Schnittstelle zur Verfügung ohne Programmierkenntnisse in Perl unmittelbar vorauszusetzen. Mit diesem Modul ist es möglich, sowohl Ereignis- als auch Zeitsteuerung mit Hilfe logischer Abfragen miteinander zu kombinieren. Damit können komplexere Problemstellungen innerhalb eines DOIF-Moduls gelöst werden, ohne Perlcode in Kombination mit anderen Modulen programmieren zu müssen.

Im Perl-Modus bietet das Modul DOIF die Möglichkeit Perl-Blöcke zeit- und ereignisgesteuert auszuführen. Zur Beschreibung der Auslöser kann die DOIF-Syntax, die Angaben in eckigen Klammern direkt in einem Perl-Ausdruck verwendet werden.

Das DOIF-Modul verfügt inzwischen über ein eigenes WEB-Interface, mit dessen Hilfe sich in tabellarischer Darstellung jegliche Informationen visualisieren sowie FHEM-Geräte über Widgets steuern lassen.


Voraussetzungen

keine

Anwendung

Define

FHEM-Modus

Siehe commandref/DOIF_

Perl-Modus

Siehe DOIF/Perl-Modus

Attribute

FHEM-Modus

Siehe commandref/DOIF_Attribute

Perl-Modus

Siehe DOIF/Perl-Modus#Nutzbare_Attribute_im_Perl-Modus

Kurzreferenz

Siehe Kurzreferenz

Anwendungsbeispiele

Der Modulautor hat im deutschen Teil der commandref/DOIF eine Vielzahl von einfachen und auch komplexeren Beispielen zur Nutzung von DOIF aufgenommen. Darum wird hier auf weitere Beispiele zu DOIF verzichtet. Ausführliche Code-Beispiele zu DOIF bitte gegebenenfalls als eigene Wiki-Seite unter Code Snippets aufnehmen.

Links

FHEM-Modus: Weiterführende Themen und Beispiele

Perl-Modus: Weiterführende Themen und Beispiele

Entwicklungshistorie

121004

  • Forenthread neues Attribut: uiState
  • Forenthread neue Feature: wiederholende Ausführungstimer mit Bedingung
  • Forenthread neue Features: Generalisierung mit Templates
  • Forenthread Umstellung auf NOTIFYDEV-Filter
  • Forenthread Neues Feature: event_Readings
  • Forenthread Neues Feature: Durchschnitt, Median, Differenz, prozentualer Anstieg
  • Forenthread Wochentagsteuerung
  • Forenthread memory leak in perl 5.24
  • Forenthread Intervalltimer
  • Forenthread checkReadingEvent per Default intern gesetzt.
  • Forenthread keine Timer-Wiederholungen am gleichen Tag, betrifft Mehrfachtriggerung bei sunset, sunrise, berechnete Timer, z.B. rand() u.ä.
  • Forenthread neue Features: ereignisgesteuertes Perl
  • Forenthread neues Attribut: startup, neuer set-Befehl: checkall, neuer get-Befehl: html
  • Forenthread neues Attribut: uiTable - DOIF User Interface, neues Attribut: DOIF_Readings
  • Forenthread neue Features: Attribut myReadings
  • Forenthread Neue Features: Aggregationsfunktion, Filtern nach Zahl mit Nachkommastellen
  • Forenthread neue Features: Wochentage mit Namen, Überarbeitung für indirekte Timer
  • Forenthread DOIF für Perlprogrammierer (Anm.: an dieser Stelle nicht eingeführt)
  • Forenthread neue Features: Perlcode ohne runde Klammern und ohne Semikolon-Dopplung
  • Forenthread neue Features: set <DOIF_Modul> cmd_<NR>, Zeitvariablen $md $ymd
  • Forenthread neue Features: checkall: timer|event|all, timertrigger, timerintervall
  • Forenthread neue Features: Ereignisfilter, Attribut checkall, setList, readingList
  • Forenthread Stati, Readings in Zeitfunktionen, set enable
  • Forenthread neue Features: disablecondition, Stati bei Zeitfunktionen (Anm.: disablecondition nicht eingeführt)
  • Forenthread Möglichkeit auf passende Events zu beschränken
  • Forenthread Neue Features - $SELF, $self, cmd-Reading, timerevent, selftrigger ...
  • Forenthread DOIF als endlicher Automat (finite state maschine)
  • Forenthread serialisierte Timer
  • Forenthread neue Features: Generalisierung, $DEVICE, $EVENT, Attribut notexist
  • Forenthread Attribut repeatcmd
  • Forenthread unabsichtliche Loops unterbunden
  • Forenthread wait als sleep Alternative
  • Forenthread mehrere DOIF-Zweige (Anm.: nicht eingeführt)
  • Forenthread neue Zeit-Features
  • Forenthread Zeitraster
  • Forenthread indirekte Zeitangaben, readingFnAttributes
  • Forenthread indirekte Zeitangaben
  • Forenthread relative Zeitangaben, Attribute: do resetwait, cmdpause, repeatsame, uvm.
  • Forenthread zur Entstehung dieses Moduls