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 schlage den Einbau von Templates als neue Funktionalität in FHEM vor. Ich schreibe dazu drei Beiträge.


  • Anwendungsfälle (dieser Beitrag)
  • Implementierung (nächster Beitrag mit Patch für fhem.pl)
  • Problem/Diskussion (übernächster Beitrag)

Viele Grüße
Boris

Anwendungsfälle:

  • Zur Definition von gleichartigen Geräten wiederholt sich die Konfiguration regelmäßig mit meist nur geringen Abweichungen bei den Parametern. Die sich wiederholende Konfiguration wird daher in einem Template abgelegt. Das Template wird dann in der Konfiguration unter Angabe der für die variablen Teile zu ersetzenden Parameter aufgerufen.
  • Um mehrere Kommandos hinter at und notify zusammenzuhalten, muss das Semikolon als Befehlstrenner als ;; maskiert angegeben und alles in einer Zeile geschrieben werden. Die Auslagerung der Kommandofolge in ein Template soll diese Maskierungen überflüssig machen und die Benutzung klarer machen.
  • Bei Verwendung von Perl-Kode in FHEM müssen Zeilenenden mit \ und Semikolons mit ;; maskiert werden. Die Verwendung von Templates soll es erlauben, unmaskierten Perl-Kode zu schreiben.

Beispiel zu einem FHEM-Template:

define %name% FHT %fhtcode%
attr %name% IODev CUN
attr %name% alias %alias%
attr %name% group %group%
attr %name% icon icoTempHeizung.png
attr %name% room %room%,Anlagen/Heizungen

define watchdog.%name% watchdog %name% 00:15:00 SAME set %name% report2 255
attr watchdog.%name% group %group%
attr watchdog.%name% room Control/Heizungen

define %name%.log FileLog /opt/fhem/log/%name%-%Y%m.log %name%:.*
attr %name%.log group %group%
attr %name%.log icon icoLog.png
attr %name%.log logtype fht
attr %name%.log room Control/Heizungen

define %name%.weblink SVG %name%.log:%name%:CURRENT
attr %name%.weblink label sprintf("Temperatur: %.0f °C (%.0f °C .. %.0f °C)  Aktor: %.0f %% (%.0f %% .. %.0f %%)", $data{currval1}, $data{min1}, $data{max1}, $data{currval2}, $data{min2}, $data{max2} )
attr %name%.weblink room %room%
attr %name%.weblink alias %alias%


So sehen bei mir alle Definitionen von FHTs aus. Die Zeichenketten in der Form %...% sind die variablen Elemente.
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Dr. Boris Neubert

Der beigefügte experimentelle Patch fügt einen Befehl template zu FHEM hinzu:

Usage: template def fhem|perl <name>(<args>) fileName
       template del <name>
       template list


Beispiel für Definition:

templ def fhem Heizung(fhtcode,name,alias,room,group) Heizung.templ
templ list


Beispiel für Verwendung:

$Heizung(1B2B,hzgwz,Heizung Wohnzimmer,Wohnzimmer,Heizung)

Die Datei Heizung.templ hat genau den Inhalt aus dem vorigen Beitrag.

Es ist nur der Teil ausprogrammiert, der dem ersten Anwendungsfall entspricht.
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Dr. Boris Neubert

Ich habe den Kode nicht weiter ausprogrammiert, bevor ich nicht Gewissheit habe, dass er auch eine Chance hat, aufgenommen zu werden.

Die Schwierigkeit liegt in AnalyzeCommandChain, wo man die Unterscheidung zwischen Kommando, Subkommando (hinter at und notify) und Perl explizit ausprogrammieren muss.
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

rudolfkoenig

Ohne es naeher angeschaut zu haben: kann man das nicht als Modul anlegen?
Dann brauchst du gar nicht zu fragen, ob es aufgenommen wird.

justme1968

es gibt von igami ein modul das glaube ich in diese richtung geht. mit fällt nur gerade her name nicht ein ...
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

Dr. Boris Neubert

Der erste Anwendungfall ginge wohl noch als Modul. Bei den beiden anderen muss man aber doch AnalyzeCommandChain aufbohren, nicht wahr?

Die Anwendungsfälle 2 und 3 ließen sich aber auch lösen, wenn wir einen Parser einführen (Parse-RecDescent). Aber wo ist der Freiwillige dafür?
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

justme1968

das modul heißt archetype.

zum parsen und den ; ... dazu hatte ich in dem ParseParams thread schon mal einen vorschlag gemacht. vielleicht können wir das wiederbeleben
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

betateilchen

#7
Hallo Boris,

willst Du nicht erstmal die Baustelle "RTypes", die vor langer Zeit auf Dein Bestreben in die fhem.pl eingebaut wurde, zuende bringen, bevor jetzt eine neue Baustelle eröffnet wird?

Grundsätzlich sind templates eine gute Idee. Aber in Homematic gibt es solche Templates seit Jahren. Aber ausser martin und mir nutzt die offenbar niemand, wenn man sich viele Homematic Probleme anschaut, die immer wieder im Homematic-Bereich diskutiert werden und die sich vermeiden ließen, wenn man mit templates arbeiten würde.

Wenn man wirklich

ZitatZur Definition von gleichartigen Geräten wiederholt sich die Konfiguration regelmäßig mit meist nur geringen Abweichungen bei den Parametern.

betrachtet, kann man das auch in vielen Fällren mit dem bereits vorhandenen Befehl "copy" abfackeln, dem man ja die abweichenden Parameter im define für das Zieldevice einfach mitgeben kann.

So ganz erschließt sich mir der Nutzen Deines Vorschlages noch nicht wirklich, wenn ich mir den dagegenstehenden Aufwand betrachte und außerdem in Betracht ziehe, welche Möglichkeiten FHEM bereits bietet (setdefaultattr, copy, ...), um solche wiederkehrenden Dinge einfacher zu erledigen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

dev0

Zitat von: betateilchen am 05 März 2017, 12:50:06
Aber in Homematic gibt es solche Templates seit Jahren. Aber ausser martin und mir nutzt die offenbar niemand,

Aus FHEM Anwendersicht:

Als ich vorzeiten gelesen hatte, dass es Homematic Templates gibt, fande ich das sehr spannend. Die Details hatte ich aber auf Anhieb nicht verstanden und da es eine "homematic only Lösung" war auch nicht weiter verfolgt. Ich hätte mich halt einarbeiten müssen, aber das war es mir, für 1(!) Modul, an der Stelle nicht wert. Es lief ja schon alles.
Wäre es ein generelles Konzept gewesen, dass an allen möglichen Stellen zu verwänden wäre, dann hätte ich das mit bestimmt gemacht...

betateilchen

Zitat von: dev0 am 05 März 2017, 13:04:40
Wäre es ein generelles Konzept gewesen, dass an allen möglichen Stellen zu verwänden wäre, dann hätte ich das mit bestimmt gemacht...

Ein generelles Konzept, wie jetzt hier diskutiert, würde aber höchstwahrscheinlich bei den vielen Sonderlocken, die Homematic hat/braucht, auch nicht funktionieren. Somit hätten wir dann schon


  • Homematic templates
  • "generelles Konzept"
  • FHEM-interne, bereits vorhandene Möglichkeiten, wie oben schon beschrieben
  • archetype

Aus Entwickler- und Supportersicht:

Wie willst Du den Anwendern eine Vielzahl solcher "Ideen" für ähnliche Aufgabenstellungen so vermitteln, dass sie verständlich bleiben und so, dass auch Otto Normalverbraucher und Lieschen Müller weiß, wann welcher Ansatz der "richtige" ist? Meiner Ansicht nach schaffen wir damit nur noch mehr Unverständnis und noch mehr Probleme als jetzt schon existieren.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

dev0

Zitat von: betateilchen am 05 März 2017, 13:13:29
Meiner Ansicht nach schaffen wir damit nur noch mehr Unverständnis und noch mehr Probleme als jetzt schon existieren.

Wenn man aber keine neuen Weg testet, dann wird sich auch nichts weiterentwickeln. FHEM ist kein out-of-the-box Produkt. Das weiß Du, als "alter Hase", wahrscheinlich viel besser als ich. Ob es sich durchsetzt oder auch nicht, wird man sehen... mMn hat die Idee zumindest Potenzial dazu.

rudolfkoenig

ZitatDie Schwierigkeit liegt in AnalyzeCommandChain, wo man die Unterscheidung zwischen Kommando, Subkommando (hinter at und notify) und Perl explizit ausprogrammieren muss.

Ich verstehe dieses Problem immer noch nicht. Kann jemand bitte so nett sein, und fuer einen "csrfToken" Geschaedigten das ganz langsam erklaeren? :)

zap

Könnte man nicht anstelle der Einführung von Templates den Copy-Befehl erweitern? Der Befehl unterstützt ja schon die variable Angabe des DEF-Teils.
Wären eigentlich nur noch optionale Parameter zu ergänzen, die Attribute ersetzen.

Beispiel:


copy olddev newdev mydefpar1 attr1=val1 attr2=val2

2xCCU3, Fenster, Rollläden, Themostate, Stromzähler, Steckdosen ...)
Entwicklung: FHEM auf AMD NUC (Ubuntu)
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: FULLY, Meteohub, HMCCU, AndroidDB

betateilchen

Das fände ich auch einen guten (und verständlichen) Weg zur Umsetzung.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

KernSani

Zitat von: zap am 08 März 2017, 08:55:30
Könnte man nicht anstelle der Einführung von Templates den Copy-Befehl erweitern? Der Befehl unterstützt ja schon die variable Angabe des DEF-Teils.
Wären eigentlich nur noch optionale Parameter zu ergänzen, die Attribute ersetzen.

Beispiel:


copy olddev newdev mydefpar1 attr1=val1 attr2=val2


Dies entspricht im Wesentlichen der bereits vorhandenen "import raw" Funktionalität, die ich persönlich für ausreichend halte, um schnell bestehende Definitionen in ein neues Device zu übernehmen.
Auch das Sharing komplexer Szenarien lässt sich über "import raw" leicht realisieren.

Einen echten Mehrwert hätten Templates für mich dann, wenn ich an einer zentralen Stelle Änderungen vornehmen kann, die dann Auswirkungen auf alle auf dem Template basierenden Devices hat.
 
Grüße,

Oli
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...