Hauptmenü

Perl vs FHEM code

Begonnen von dominik, 22 August 2015, 00:11:54

Vorheriges Thema - Nächstes Thema

dominik

Hallo,
nach einigen Automatisierung die ich nun in FHEM eingepflegt habe (Guten Morgen Radio, Licht auf Basis von Twilight & Residents, Ventilatorsteuerung nach Temperatur, ...) stell ich mir noch immer die Frage nach dem "Coding Style". Wie schreibt ihr euren Code? Vermehrt in Perl oder hauptsächlich über FHEM code?

Wenn ich beim Auslösen eines Events noch mehr als einen weiteren Wert abfrage (z.B. Licht nur in der Zeit zwischen 17-23Uhr einschalten, wenn ich nach Hause komme und twilight "dunkel" meldet) tendiere ich immer zu Perl. Das resultiert mittlerweile dazu, dass ich fast nur mehr "dummy" notifies mache. Also viele Notifies rufen direkt Perl Code auf und prüfen dort die Abhängigkeiten. Aufgrund der Wiederverwendbarkeit der einzelnen Funktionen in Perl halte ich das (zumindest für mich) für die bessere Lösung. Ist das Best Practice? Wie handhabt ihr das?

Gruß
dominik
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

Ellert

Die Frage stelle ich mir auch hin und wieder. Wenn Lösungen mir in FHEM zu unübersichtlich werden, dann mach ich es in Perl.

Das DOIF ist ein sehr mächtiges Device, das benutze ich als erste Wahl für Aufgaben mittlerer Komplexität.

Für Dein Beispiel:

define DOIF ([17:00-23:00] and [zuHause] eq "present" and [Lichtintensität] eq "dunkel") (set Licht on)

da benötigt man kein Perl.

dominik

Gut dass sich auch andere immer wieder diese Frage stellen :)
DOIF habe ich bei mir noch nicht verwendet. Sieht aber sehr schön kompakt aus. Das kann bei mir wahrscheinlich auch bisschen Perl Code ablösen.

Aber nochmals zum Thema allgemein...ich bin immer ein Freund davon Funktionen wieder zu verwenden und das fehlt mir etwas in FHEM. Ich baue dann lieber Funktionen in Perl für "braucheIchGeradeLicht()", "kommeNachHause()", usw..
Dann verwende ich im Code eben immer wieder irgendwo "braucheIchGeradeLicht()" und verknüpfe diese Abfrage mit twilight, Uhrzeit oder vielleicht später mal mit noch irgendetwas. So habe ich aber eine Stelle wo ich Code ändere und nicht 10 verschiedene.
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

justme1968

solche makros kannst du durch notifys die auf ihren eigenen namen lauschen unsetzen:

  define meinMakro notify meinMakro ... fhem code ...

der aufruf geht dann mit:

  trigger meinMakro

du kannst auch paramer mitgeben die dann in $EVTPARTx landen.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

dominik

Cool, danke für die Info. Das kannte ich noch nicht.

Werde nun mal versuchen meinen Perl Code mit DOIF und Notify Makros zu reduzieren. Mal sehn wie weit ich komme.
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

Ellert

In meiner Definition hat sich ein Fehler eingeschlichen, ich berichtige sie und baue das DOIF etwas um:
define braucheIchGeradeLicht DOIF ([17:00-23:00] and [zuHause] eq "present" and [Lichtintensität] eq "dunkel")\
DOELSEIF  ([23:01-16:59] or ![zuHause] eq "present" or ![Lichtintensität] eq "dunkel")

define LichtImWohnzimmer DOIF ([?braucheIchGeradeLicht] eq "cmd_1" and [BinImWohnzimmer] eq "pesent") (set LichtWohnzimmer on)


Wenn ich Dich richtig verstanden habe, müsste das erste DOIF die Funktion  braucheIchGeradeLicht() abbilden, die dann beim Betreten eines Zimmers das Licht einschaltet, in Verbindung mit dem zweiten DOIF. Die Definitionen sind nicht getestet und ggf. nicht vollständig und nur zur Veranschaulichung gedacht.

Bei mir hängt es auch immer vom Kenntnisstand ab, ob ich Perl benutze oder FHEM.
Zum Beispiel frage ich, wenn das Mediencenter einen Film abspielt zwei Bewegungsmelder ab, deren Auslösung Grundlage für die Zustände rein/raus und  Zahl der Abwesenden ist. Das habe ich in Perl gelöst, weil ich nicht weiss wie ich das in FHEM lösen müsste. Und über DOIF: Der Erste der geht pausiert die Wiedergabe, der Letzte, der kommt startet die Wiedergabe, wenn ein Film wiedergegeben wird. Es ist auch ein bisschen Geschmackssache.


dominik

Fazit, ich muss sagen, seit der Nutzung von DOIF habe ich meinen Perl Code wirklich auf ein Minimum reduziert. Mittlerweile versuche ich (im Gegenteil zu vorher) mehr in FHEM abzubilden und weniger in Perl. So hoffe ich die Wartbarkeit des Codes zumindest größtenteils auf eine Sprache zu reduzieren.

Also jeder der DOIF noch nicht probiert hat, sollte das unbedingt mal verwenden bevor er 100te Zeilen Perl Code schreibt :D
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

Damian

Zitat von: dominik am 26 September 2015, 10:05:27
Fazit, ich muss sagen, seit der Nutzung von DOIF habe ich meinen Perl Code wirklich auf ein Minimum reduziert. Mittlerweile versuche ich (im Gegenteil zu vorher) mehr in FHEM abzubilden und weniger in Perl. So hoffe ich die Wartbarkeit des Codes zumindest größtenteils auf eine Sprache zu reduzieren.

Also jeder der DOIF noch nicht probiert hat, sollte das unbedingt mal verwenden bevor er 100te Zeilen Perl Code schreibt :D

Es freut mich, dass du in so kurzer Zeit (seit dem 22. August) zu dieser Erkenntnis gekommen bist. Also bin ich nicht der einzige, der es so sieht.

Ich könnte ziemlich alles in Perl automatisieren, habe es aber nicht für sinnvoll erachtet, denn entweder ist ein Problem so komplex, dass ich eigenes Modul programmiere oder ich mache es mit FHEM-Board-Mitteln (inzwischen ohne notify und at). Daher ist auch meine myUtils bisher leer geblieben.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF