Templates in FHEM

Begonnen von Dr. Boris Neubert, 05 März 2017, 11:58:33

Vorheriges Thema - Nächstes Thema

Dr. Boris Neubert

Hallo,

ich habe mir die von Euch vorgeschlagenen Lösungen angesehen:
- Ich kann nicht erkennen, wie ich den Anwendungsfall aus meinem Eingangsbeitrag rationell mit copy und setdefaultattr bewerkstelligen könnte: Anlage von 4 zusammenhängenden Geräten mit einer Namenskonvention und Konvention für Attribute.
- Archetype habe ich mir angesehen und halte durch dieses Modul den Anwendungsfall auch nicht abgedeckt. Zudem habe ich größte Mühe, zu verstehen, wie das Modul benutzt wird.
- @KernSani: was ist die "import raw"-Funktionalität?

Mein Vorschlag entspricht im wesentlichen den aus C bekannten Makros. Ich halte eine solche Funktionalität im Framework für sinnvoll und nützlich. Auch um Einsteigern die Arbeit zu erleichtern, indem für komplexe Konfigurationen Templates in einer Sammlung zur Verfügung gestellt werden.

Wenn eine Makro-/Template-Funktionalität in fhem.pl keine Zustimmung/kein genügendes Interesse findet, werde ich den Weg über ein Modul gehen. Das macht die Benutzung dann weniger anwenderfreundlich.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

KernSani

Hi Boris,

ich meinte den "Raw definition" button unten beim device - Dieser ist meines Erachtens ausreichend um Devices zu kopieren oder komplexe Definitionen zu importieren (sie - angepasst - zu kopieren ist damit etwas aufwändiger, weil ich es pro Device machen muss).
Generell halte ich deinen Ansatz für gut, um z.B. immer wiederkehrende Fragen (Wie kann ich meine Rolläden bei Sonnenuntergang herunter lassen und bei Sonnenaufgang wieder hoch?) oder eben auch komplexere Szenarien als template mit auszuliefern. Ob sie genutzt werden würde? Keine Ahnung... Für mich persönlich sehe ich aktuell keinen Anwendungsfall...
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

betateilchen

Zitat von: Dr. Boris Neubert am 09 März 2017, 22:05:08
sinnvoll und nützlich. Auch um Einsteigern die Arbeit zu erleichtern, indem für komplexe Konfigurationen


  • Anfänger sollten keine komplexen Konfigurationen haben, sondern sich einarbeiten und verstehen, was sie eigentlich tun
  • man sollte Anfängern ihre Lernerfolge nicht durch Template-Sammlungen, deren Hintergründe von Anfängern eh nicht auf Anhieb zu durchschauen sind, wegnehmen.

Templates mögen ein probates Mittel für Leute sein, die genau wissen, wozu sie die einsetzen. Aber hör doch bitte damit auf, die Templates mit der Argumentation "für Anfänger" vermarkten zu wollen - das wird bei Anfängern nicht funktionieren, die verstehen doch oft am Anfang noch nicht einmal den Zusammenhang zwischen device, reading und attribute.

Du kannst diese Templates für Dich bauen und nutzen. Oder auch als Modul, wie von Rudi schon vorgeschlagen. Auch in meiner Konfiguration gibt es bestimmte Konstrukte, die mir die tägliche Arbeit erleichtern. Aber die würde ich nie in FHEM veröffentlichen, weil ich dann aus den Support-Anfragen gar nicht mehr rauskäme.

Eine grundsätzliche und zwangsweise Verankerung solcher Templates in jeder FHEM-Installation halte ich weiterhin nicht für zielführend.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: Dr. Boris Neubert am 09 März 2017, 22:05:08
- @KernSani: was ist die "import raw"-Funktionalität?

Diese Frage hätte m.E. von Dir als Entwickler, der gerade solche Vorschläge wie "Templates" macht, eigentlich nicht kommen dürfen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dr. Boris Neubert

Hoppla, was ist denn hier passiert?

Zitat von: betateilchen am 09 März 2017, 22:55:04
Aber hör doch bitte damit auf, ...

Ich möchte keine Befehle empfangen, welche Vorschläge ich mache.

Zitat von: betateilchen am 09 März 2017, 22:55:04
Diese Frage hätte m.E. von Dir als Entwickler, der gerade solche Vorschläge wie "Templates" macht, eigentlich nicht kommen dürfen.

Was möchtest Du mir damit sagen?

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Dr. Boris Neubert

Hallo KernSani,

Zitat von: KernSani am 09 März 2017, 22:40:09
ich meinte den "Raw definition" button unten beim device - Dieser ist meines Erachtens ausreichend um Devices zu kopieren oder komplexe Definitionen zu importieren (sie - angepasst - zu kopieren ist damit etwas aufwändiger, weil ich es pro Device machen muss).

Danke für die Aufklärung. Ich bin gedanklich bei der händischen Konfiguration, weil ich das Webfrontend außer für die Erstellung von .gplot-Dateien nicht zu Konfigurationszwecken nutze.

Einen impliziten Wunsch sollte ich dazu noch offen legen, nämlich die Konfigurationsdatei übersichtlich zu halten, indem wiederkehrende Strophen nicht immer wieder sondern nur einmal hingeschrieben werden müssen. Dies erhöht die Wartbarkeit, weil nicht jedes Gerät angefasst werden muss, wenn man systematisch Änderungen vornehmen will.

Dein Aspekt, an zentraler Stelle Änderungen vornehmen zu können, die dann auf alle Devices übernommen werden, würde damit auch abgedeckt werden, indem das Template geändert und die Konfiguration neu verarbeitet wird (erfordert Neustart, aber wenn die grundsätzliche Akzeptanz gegeben ist, würde man dafür auch eine Lösung ohne Neustart finden).

Zitat
Generell halte ich deinen Ansatz für gut, um z.B. immer wiederkehrende Fragen (Wie kann ich meine Rolläden bei Sonnenuntergang herunter lassen und bei Sonnenaufgang wieder hoch?) oder eben auch komplexere Szenarien als template mit auszuliefern.

Danke für die Zustimmung.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Dr. Boris Neubert

#21
Zitat von: rudolfkoenig am 05 März 2017, 14:45:10
Ich verstehe dieses Problem immer noch nicht. Kann jemand bitte so nett sein, und fuer einen "csrfToken" Geschaedigten das ganz langsam erklaeren? :)

define n notify foo:bar set lamp1 off;;set door open;;set alarm off;;set display text ";"
define m notify baz:bat { perl;;code;; \
  if(bla) \{ ... \} ...\
  print("}");; \
}


Ausgangssituation und Zielsetzung: In beiden Fällen habe ich Mühe, die richtige Maskierung zu setzen. Ich würde gerne die Befehlsfolgen in umaskierten FHEM-Befehlen bzw. unmaskierten Perl schreiben und dann verwenden können.

Vermutlich würde dies aber auch durch ein Template-Device (hier mit Namen templ) erledigt werden können:

define n notify foo:bar set templ Tagschaltung()
define m notify baz:bat set templ wirrerPerlCode(bla)

Mit meinem im Eingangsbeitrag gemachten Vorschlag würde man schreiben:

define n notify foo:bar $Tagschaltung()
define m notify baz:bat $wirrerPerlCode(bla)

Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

rudolfkoenig

@Boris:
Ich wuerde die Indirektion "templ def type name param...", gefolgt von "$name(param,...)" entfernen.

Type "fhem" finde ich sinnvoll, und wuerde es mit parseParams (https://forum.fhem.de/index.php/topic,52242.msg440262.html#msg440262) implementieren:
templ def Heizung.templ name=hzwgz fhtcode=1B2B alias="Heizung Wohnzimmer" room=Wohnzimmer group=Heizung
Ein "templ del Heizung.templ name=hzwgz", was die per def angelegten Definitionen entfernt, sollte auch machbar sein.

Type "perl" finde ich falsch: wir haben mit DOIF bereits eine Alternative, dessen Syntax die Benutzer verwirrt, das reicht. Man hat die Moeglichkeit Perl-Funktionen zu verwenden, und da muss man nichts zusaetzlich wg. Variablenersetzung erklaeren.

Falls ich was falsch verstanden habe, bitte korrigieren.

Dr. Boris Neubert

Zitat von: rudolfkoenig am 10 März 2017, 09:37:00
Ich wuerde die Indirektion "templ def type name param...", gefolgt von "$name(param,...)" entfernen.

Type "fhem" finde ich sinnvoll, und wuerde es mit parseParams (https://forum.fhem.de/index.php/topic,52242.msg440262.html#msg440262) implementieren:
templ def Heizung.templ name=hzwgz fhtcode=1B2B alias="Heizung Wohnzimmer" room=Wohnzimmer group=Heizung

Keine Indirektion: verstehe ich und ich finde keinen Grund für Indirektion; template def hätte das Makro definiert und das Template aus der Datei geladen, template use dann das Makro ausgeführt. Es geht aber auch gleich template use (statt def) und die Datei wird jedesmal geladen, wenn ein template use aufgerufen wird.

ParseParams: ist mehr FHEM-like (statt des funktionalen Stils à la C-Makro).

Zitat
Ein "templ del Heizung.templ name=hzwgz", was die per def angelegten Definitionen entfernt, sollte auch machbar sein.

Das bräuchte man dann eigentlich nicht mehr. Es sei denn, dass mitgeschrieben wird, was template use tut, um es rückgängig zu machen. Frage an @KernSani: wie würdest Du Dir die Benutzung von Templates vorstellen (Beispielkommandofolge), um nach Änderung des Templates in der Datei die Geräte neu anzulegen? Oder reicht Dir die Möglichkeit über shutdown restart?

@Rudi: wie würde define n notify foo:bar set templ Tagschaltung() geschrieben werden?

Wie würde man die Variablen im Template markieren (im Vorschlag mit %NAME%, weil diese Zeichenkette vermutlich nie vorkommt und man dann stumpf Stringersetzung verwenden kann)?

Zitat
Type "perl" finde ich falsch: wir haben mit DOIF bereits eine Alternative, dessen Syntax die Benutzer verwirrt, das reicht. Man hat die Moeglichkeit Perl-Funktionen zu verwenden, und da muss man nichts zusaetzlich wg. Variablenersetzung erklaeren.

Lass uns das bitte einen Moment zurückstellen.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

rudolfkoenig

Zitat@Rudi: wie würde
define n notify foo:bar set templ Tagschaltung()
geschrieben werden?
Gar nicht, da das nur in der "perl" Variante sinnvoll ist, und da bin ich ja dagegen.

Dr. Boris Neubert

Zitat von: rudolfkoenig am 10 März 2017, 13:19:59
Gar nicht, da das nur in der "perl" Variante sinnvoll ist, und da bin ich ja dagegen.

Ich bin überzeugt. Wenn man das braucht, kann man auch gleich das ganze define in ein Template packen.

Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

betateilchen

Zitat von: Dr. Boris Neubert am 10 März 2017, 08:00:21
Ich möchte keine Befehle empfangen, welche Vorschläge ich mache.

Da stand nix von Befehl, sondern ganz klar "bitte".

Zitat von: Dr. Boris Neubert am 10 März 2017, 08:00:21
Was möchtest Du mir damit sagen?

Nichts anderes, als dass es vielleicht manchmal sinnvoll ist, sich mit den zur Verfügung stehenden Mitteln von FHEM auseinanderzusetzen. Insbesondere, wenn man nicht tagesaktuell die Weiterentwicklung von FHEM beobachtet und im Blick hat (was man von niemandem erwartet). Manchmal haben sich einfach schon neue Werkzeuge/Möglichkeiten ergeben, die eine aufkommende Frage schon beantworten können oder Lösungsansätze für ein "Problem" bieten. Und gerade von Entwicklern erwarte ich ein solches Vorgehen noch viel eher als von einem reinen Anwender.

Speziell die "raw definition" in der Detailansicht ist nun wirklich nicht neu, sondern (geschätzt) ein halbes Jahr alt.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dr. Boris Neubert

Zitat von: rudolfkoenig am 10 März 2017, 09:37:00
@Boris:
Ich wuerde die Indirektion "templ def type name param...", gefolgt von "$name(param,...)" entfernen.

Type "fhem" finde ich sinnvoll, und wuerde es mit parseParams (https://forum.fhem.de/index.php/topic,52242.msg440262.html#msg440262) implementieren:
templ def Heizung.templ name=hzwgz fhtcode=1B2B alias="Heizung Wohnzimmer" room=Wohnzimmer group=Heizung

Das habe ich jetzt so realisiert. Bitte finde anbei die Patches dazu.
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

rudolfkoenig

Das ist alles perfekt, bis auf die Tatsache, dass es Teil von fhem.pl ist.
Wieso nicht als eigenstaendiges Modul?

Statt open..close wuerde ich FileRead() verwenden, dann darf das template im configDB gespeichert sein.

Dr. Boris Neubert

Guten Morgen,

Zitat von: rudolfkoenig am 12 März 2017, 07:31:28
Wieso nicht als eigenstaendiges Modul?

Alte Gewohnheit. Es wandert nach 98_template.pm und wird im Laufe des Tages eingecheckt.

Bei der Codebeschau ist mir ein Überbleibsel in fhem.pl aufgefallen: in Zeile 369 steht die Hilfe zu restore, was aber auch ein eigenes Modul ist.

Sollten nicht noch mehr Befehle in Module ausziehen?

Zitat
Statt open..close wuerde ich FileRead() verwenden, dann darf das template im configDB gespeichert sein.

Danke für den Tipp. Baue ich ein.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!