Referenz auf das letzte definierte Objekt?

Begonnen von heiko73, 10 Oktober 2018, 22:31:05

Vorheriges Thema - Nächstes Thema

heiko73

Hallo und danke schon mal für die Zeit, das hier zu lesen ;)

Ich habe in der (sehr guten und ausführlichen) Doku bzw. CommandRef und auch im Forum nichts darüber gefunden, ob ich in meiner Konfiguration statt eines Objektnamens einen Platzhalter/Variable verwenden kann, die den Namen des zuletzt definierten Objekts enthält. Wow, klingt kompliziert ... Vielleicht mal ein Beispiel:

Statt
define WEB FHEMWEB 8083 global
attr WEB hiddenroom Geheim
attr WEB stylesheetPrefix darktouchpad


würde ich gern sowas schreiben:
define WEB FHEMWEB 8083 global   # hier würde $THIS=WEB gesetzt werden
attr $THIS hiddenroom Geheim                 # hier würde $THIS durch WEB ersetzt werden
attr $THIS stylesheetPrefix darktouchpad   # hier auch (und bei den folgenden x Konfigurationszeilen, eben bis zum nächsten define)


Dabei würde also $THIS immer mit dem Namen des letzten definierten Objekts ersetzt werden. Vor allem bei Objekten mit vielen Attributen würde das bei handgeschriebener Konfig helfen, glaube ich. Ich habe die Templates gefunden und werde damit mal rumprobieren, aber dann muss der eigentliche Konfig-Text in einer separaten Datei sein.

Falls jemand das liest und entweder denkt "das kann man doch schon anders lösen" oder "braucht kein Mensch", ich würde mich über eine Antwort (wie auch immer) sehr freuen!

Danke!

Damian

Da man Definitionen und auch die Attribute nicht in der fhem.cfg editiert, sondern über die Weboberfläche, ist dies überflüssig, weil dort immer der richtige Name des Moduls schon vorgegeben wird.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

heiko73

Wow, turboschnell, danke!

Ich habe bisher meistens in der Konfigurationsdatei editiert, geht schneller (vor allem wenn man z.B. ein Attribut für 10 Thermostate ändern möchte und in seinem Lieblingseditor copy and paste nutzen kann) und erlaubt es auch, ganze Konfigurationsblöcke mal auszublenden (wenn man, wie ich, seine Konfig in viele kleine Dateien unterteilt hat und die mit include "reinholt") etc. etc.

Kann verstehen, dass das nicht Jedermann's Sache ist. Aber ist das grundsätzlich die Lehrmeinung, das "man das nicht tut"?

Danke nochmal, interessiert mich wirklich ob ich da was "Verbotenes" mache ;) ...

CoolTux

FHEM ist OO. Auch wenn es heißt man kann die ganze Welt in OÖ erklären  ;D
Damian hat Recht, man soll in der cfg nicht editieren. Und die cfg ist nur eine Konfigdatei, und mehr sollte man aus ihr auch nicht machen. Um es kurz zu machen es geht nicht.
Vielleicht erzählst Du einfach mal den Hintergrund für die Frage.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux

Zitat von: heiko73 am 10 Oktober 2018, 22:39:51
Wow, turboschnell, danke!

Ich habe bisher meistens in der Konfigurationsdatei editiert, geht schneller (vor allem wenn man z.B. ein Attribut für 10 Thermostate ändern möchte und in seinem Lieblingseditor copy and paste nutzen kann) und erlaubt es auch, ganze Konfigurationsblöcke mal auszublenden (wenn man, wie ich, seine Konfig in viele kleine Dateien unterteilt hat und die mit include "reinholt") etc. etc.

Kann verstehen, dass das nicht Jedermann's Sache ist. Aber ist das grundsätzlich die Lehrmeinung, das "man das nicht tut"?

Danke nochmal, interessiert mich wirklich ob ich da was "Verbotenes" mache ;) ...

Verboten ist gar nichts. Es ist nur so daß diese Methode dafür sorgen kann das man schnell Probleme bekommt. Das Editieren eines Attributes von mehreren Devices kann man schneller in FHEMWEB machen. Regex und dev2spec sei Dank
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Damian

Manche Module z. B. DOIF verhalten sich unterschiedlich, ob man ein Attribut oder eine Definition zur Laufzeit oder im "Stillstand" durch Editieren der cfg definiert.

Der ganz entscheidender Punkt ist z. B. eine Syntaxprüfung bei bestimmten Modulen zur Laufzeit mit Hinweisen auf den Fehler, die hat man sonst nicht hat und dann ist die ganze Definition möglicherweise für die Katz - spätestens wenn man save drückt ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

heiko73

:D

Ok, ich versuchs mal. Ich editiere meine FHEM Konfiguration schon seit einiger Zeit direkt mit dem Editor, weil ich aufgeräumten Code mag (da kann man gut drin suchen, wenn was nicht klappt). Ich habe in der fhem.cfg z.B. eine Zeile

include ./config/devices/homematic.cfg

und im Unterverzeichnis config/devices in der Datei homematic.cfg eben dann alle meine Homematic Geräte definiert. FHEM legt neu angelerntes ja erstmal per autocreate in der fhem.cfg direkt ab und schreibt auch nur da rein, aber das wird extrem schnell extrem unübersichtlich. Meine homematic.cfg hat mittlerweile fast 2000 Zeilen, und es gibt ja auch noch die hue.cfg und die fritz.cfg und so weiter.

Wenn ich zum Beispiel die 10 Thermostate im Erdgeschoss alle mit einem Satz gleicher Attribute versehen will, dann kann ich das sicher gut mit RegEx oder so übers Web mit jeweils einer Befehlszeile pro Attribut hinbekommen. Aber wenn ich dann irgendwann später noch mal ein 11. Thermostat und ein 12. Thermostat dazubekomme, finde ich das Kopieren der "atrib" Zeilen eines der existierenden Thermostate ganz nett, um die beiden neuen genauso zu setzen.

Ausserdem: Stellt Euch vor, ich möchte 10 Attribute anpassen. Dann muss ich entweder 10x eine Befehlszeile in das Webinterface eingeben (mit Regex, damit ich pro Attribut alle 10 Thermostate gleichzeitig setze) oder ich öffne die Konfigdatei in meinem Editor, kopiere den Block mit den 10 attrib Zeilen vom ersten Thermostat und füge ihn 9x ein, jeweils einmal unter jedes der 9 defines für die anderen Thermostate. Im Moment heisst das aber leider, dass ich danach die attrib Zeilen jeweils anpassen muss, weil sie den Namen des ersten Thermostats enthalten. Würde ich einfach nur einen Platzhalter haben, der den Namen des zuletzt definierten Objekts enthält, bräuchte ich die Zeilen nicht anpassen.

Eben statt:

define Thermostat1 CUL_HM xyz
attrib Thermostat1 Attribut1 a
attrib Thermostat1 Attribut2 b
attrib Thermostat1 Attribut3 c


lieber


define Thermostat1 CUL_HM xyz
attrib $THIS Attribut1 a
attrib $THIS Attribut2 b
attrib $THIS Attribut3 c


.. dann könnte ich die drei "attrib" Zeilen unter jedes der 9 Thermostate kopieren und müsste sie nicht anpassen.

OK, ich verstehe dass das speziell ist und entschuldige mich für den sehr ausladenden Post. Eventuell versuche ich mal, das selbst irgendwie hinzubekommen.

CoolTux

https://wiki.fhem.de/wiki/Template

Ich habe keine cfg, daher kenne ich das Problem nicht. Aber der Wiki Link hilft Dir vielleicht.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

heiko73

Zitat von: Damian am 10 Oktober 2018, 22:51:02
Manche Module z. B. DOIF verhalten sich unterschiedlich, ob man ein Attribut oder eine Definition zur Laufzeit oder im "Stillstand" durch Editieren der cfg definiert.

Der ganz entscheidender Punkt ist z. B. eine Syntaxprüfung bei bestimmten Modulen zur Laufzeit mit Hinweisen auf den Fehler, die hat man sonst nicht hat und dann ist die ganze Definition möglicherweise für die Katz - spätestens wenn man save drückt ;)

Guter Punkt. Ich werde halt mit dem Rumklicken im FHEMWEB nicht warm und die Befehlszeile im Webinterface hat auch nicht so nette Features wie Befehlshistorie. Wenn ich einen Befehl falsch eingebe, bekomme ich zwar eine Fehlermeldung, muss aber dann die korrigierte Fassung komplett neu eingeben (außer ich war so geistesgegenwärtig, sie mir in die Zwischenablage zu kopieren, bevor ich RETURN gedrückt habe). Vielleicht kann man bei einer fehlerhaften Eingabe die letzte (fehlerhafte) Zeile einfach mit ausgeben, dann kann man die nochmal kopieren, in dem Befehlseingabe-Feld einfügen und editieren.

Naja, ok. Danke auf jeden Fall für Eure Antworten und Euren Einsatz, FHEM ist für mich definitiv das perfekte Home Automation System - vor allem auch weil ich direkt editieren kann und nicht auf die Funktionalität der WebUI festgenagelt werde (wie das z.B. bei Homematic der Fall ist).

heiko73


CoolTux

Zitat von: heiko73 am 10 Oktober 2018, 23:05:48
Guter Punkt. Ich werde halt mit dem Rumklicken im FHEMWEB nicht warm und die Befehlszeile im Webinterface hat auch nicht so nette Features wie Befehlshistorie. Wenn ich einen Befehl falsch eingebe, bekomme ich zwar eine Fehlermeldung, muss aber dann die korrigierte Fassung komplett neu eingeben (außer ich war so geistesgegenwärtig, sie mir in die Zwischenablage zu kopieren, bevor ich RETURN gedrückt habe). Vielleicht kann man bei einer fehlerhaften Eingabe die letzte (fehlerhafte) Zeile einfach mit ausgeben, dann kann man die nochmal kopieren, in dem Befehlseingabe-Feld einfügen und editieren.

Naja, ok. Danke auf jeden Fall für Eure Antworten und Euren Einsatz, FHEM ist für mich definitiv das perfekte Home Automation System - vor allem auch weil ich direkt editieren kann und nicht auf die Funktionalität der WebUI festgenagelt werde (wie das z.B. bei Homematic der Fall ist).

Du kannst das ganze ja auch per telnet machen. Da gibt es mit etwas Anpassung auch History. Du kannst in FHEMWEB eine Vorlage bauen mit Hilfe von Raw Definition.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

heiko73

Zitat von: CoolTux am 10 Oktober 2018, 23:05:19
https://wiki.fhem.de/wiki/Template

Ich habe keine cfg, daher kenne ich das Problem nicht. Aber der Wiki Link hilft Dir vielleicht.

:D habe gerade Deine Signatur gesehen: "kein Support für cfg Editierer" ... Vielen Dank für die Ausnahme ;)

Gebe hiermit offiziell auf :) ... Nochmals Danke und einen schönen Abend noch!

peterk_de

In Ergänzung zu Damian: Ein weiterer Grund ist, dass ungültige Definitionen dann mitunter einfach mal komplett aus dem Hash fliegen und nach dem save dann auf einmal das komplette Device in der fhem.cfg  inkl. aller Attribute weg ist ... ärgerlich z.B. bei einem komplexen HTTMOD-Modul mit > 30 liebevoll gestrickten regulären Ausdrücken. Das ist ein Verhalten, dass ich an FHEM sehr schätze - kleine Fehler werden hart bestraft und man wird zu einer guten Backupstrategie erzogen 😂😂😂 SCNR.

Ein guter Tipp für das was du vor hast ist neben den templates auch der copy- Befehl. Damit kann
man auch eine art ,,Template" für ein neues Device bekommen, wenn schon eines vom gleichen Typ existiert. Z.B. bei deinem Beispiel ,,Thermostat" müsstest du nach dem Kopieren nur noch die Attribute alias,room, ... beim neuen Thermostat anpassen, alles andere was gleich bleiben soll (icon, event-on-change-reading, ...) braucht dich dann nicht mehr kümmern.
FHEM auf Ubuntu-VM / 2xNUC Proxmox Cluster
UI: HomeKit, TabletUI, Grafana
IOdevs: 2xHueBridge, RaspiMatic-CCU, CUL868, 2xHarmonyHub, 6xRaspi-Roomnode mit CO2, VOC und lepresenced
Devices: 107xHomematic(IP), 96xPhilips Hue, 17xTECHEM, 12xBTLE, 8xSONOS, 2xHomeConnect, 1xShelly 3em, 1xNanoleaf ...

heiko73

#13
Zitat von: peterk_de am 10 Oktober 2018, 23:19:55
In Ergänzung zu Damian: Ein weiterer Grund ist, dass ungültige Definitionen dann mitunter einfach mal komplett aus dem Hash fliegen und nach dem save dann auf einmal das komplette Device in der fhem.cfg  inkl. aller Attribute weg ist ... ärgerlich z.B. bei einem komplexen HTTMOD-Modul mit > 30 liebevoll gestrickten regulären Ausdrücken. Das ist ein Verhalten, dass ich an FHEM sehr schätze - kleine Fehler werden hart bestraft und man wird zu einer guten Backupstrategie erzogen 😂😂😂 SCNR.

;D Jau, sehr gut! BTW: Genau deshalb mag ich das cfg Editieren mehr. Kleiner Fehler in Eingabezeile/Eingabefeld im Web => Fehlermeldung, Zeile aber weg. Habe ich einen Fehler in der cfg Datei, startet FHEM entweder nicht oder zumindest bekomme ich auch da eine Fehlermeldung. Dann kann ich aber die Datei noch mal mit dem Editor aufmachen, das fehlende Semikolon (oder was auch immer) korrigieren und erneut starten, fertig. Es verschwindet nix auf nimmer Wiedersehen. Habe aber verstanden, dass das manuelle Editieren halt bedeutet, dass man eher exotisch unterwegs ist. Welche Probleme man sich damit schafft, ist mir nicht klar geworden. Ich bin immer davon ausgegangen, dass die Konfigurationsdatei rein logisch nichts anderes darstellt als eine (zugegebenermassen recht lange) Abfolge von Befehlen, die ich genauso auch im FHEMWEB in die Eingabezeile eingeben könnte oder am Telnet Prompt nacheinander eintippe. In welcher Situation es da beim Konfigfile zu einem Problem kommen kann, das ich nicht habe wenn ich die Eingabezeile im Web verwende, kann ich mir nicht vorstellen. Aber da haben die anderen Thread-Teilnehmer definitiv einiges an Mehr-Erfahrung und sicher schon die eine oder andere Katastrophe erlebt, daher akzeptiere ich die Aussage natürlich. Nur weils bei mir super klappt, muss das nicht überall so sein.

Zitat
Ein guter Tipp für das was du vor hast ist neben den templates auch der copy- Befehl. Damit kann
man auch eine art ,,Template" für ein neues Device bekommen, wenn schon eines vom gleichen Typ existiert. Z.B. bei deinem Beispiel ,,Thermostat" müsstest du nach dem Kopieren nur noch die Attribute alias,room, ... beim neuen Thermostat anpassen, alles andere was gleich bleiben soll (icon, event-on-change-reading, ...) braucht dich dann nicht mehr kümmern.

Guter Tipp, danke! Werde ich mir auch mal anschauen. Sowohl "template" als auch "include" setzen ja manuelles Editieren voraus, template gefällt mir aber besonders gut weil man damit sogar "Batch-Dateien" bzw. "Makros" direkt aus dem Web oder am Telnet Prompt ausführen kann, inklusive Parameter. Nice ;)

Beta-User

Du.kennst die Option mit RAW? (Wiki: Import von code sniplets).
Das+Editor (Kate o. Notepad++) gibt m.E. auch genug Freiraum., um dauernde Restarts zu vermeiden, und Geräte klonen ist damit auch einfach...


DAS (häufiges Neu starten) finde ich lästig....


So hat halt jeder seine Vorlieben ;) [size=78%].[/size]
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors