Hallo allerseits,
ich versuche gerade, eine PV-Anlage einzubinden, wie in dieser Anleitung (https://wiki.fhem.de/wiki/Datenbankgest%C3%BCtzte_Erstellung_der_Energiebilanz_einer_SMA_PV-Anlage_mit_%C3%9Cberschusseinspeisung) beschrieben.
Das Einbinden der Datenquellen funktioniert soweit, und ich bekomme auch Daten geliefert.
Beim Absatz Anlegen Dummy als Energiebilanz (https://wiki.fhem.de/wiki/Datenbankgest%C3%BCtzte_Erstellung_der_Energiebilanz_einer_SMA_PV-Anlage_mit_%C3%9Cberschusseinspeisung#Anlegen_Dummy_als_Energiebilanz-Device) komme ich aber nicht weiter.
Den Block zur Definition des Dum.Energy habe ich als gesamten Block in das Fenster kopiert, das erscheint wenn man das PlusQuadrat neben der Eingabezeile anklickt.
Als Fehlermeldung kommt
Zitat
Missing right curly or square bracket at (eval 16415) line 1, at end of line
syntax error at (eval 16415) line 1, at EOF
Das Problem schien mir zu sein, dass der Code-Block, der mit der Zeile
attr Dum.Energy stateFormat {
beginnt nur zeilenweise gelesen wird. Die Fehlermeldung schien mir also logisch zu sein.
Also habe ich die Zeilen zu einer einzigen Monster-Zeile zusammengefasst. Ergebnis: wieder Fehlermeldung
Missing right curly or square bracket at (eval 17849) line 1, at end of line
syntax error at (eval 17849) line 1, at EOF
Unknown command my, try help.
Unknown command my, try help.
Unknown command my, try help.
Unknown command my, try help.
Unknown command my, try help.
Unknown command my, try help.
Unknown command my, try help.
Unknown command my, try help.
Unknown command my, try help.
Unknown command my, try help.
Unknown command my, try help.
Unknown command my, try help.
Unknown command my, try help.
Unknown command my, try help.
Unknown command my, try help.
Unknown command my, try help.
Unknown command my, try help.
Unknown command my, try help.
Unknown command my, try help.
Unknown command my, try help.
Unknown command ", try help.
Unknown command padding-left:5px, try help.
Unknown command font-weight:bold'>aktueller, try help.
Unknown command padding-left:5px, try help.
Unknown command font-weight:bold'>Heute, try help.
Unknown command padding-left:5px, try help.
Unknown command font-weight:bold'>dieser, try help.
Unknown command padding-left:5px, try help.
Unknown command text-align:left, try help.
Unknown command font-weight:bold'>PV-Erzeugung, try help.
Unknown command padding-left:5px'>".$pv.", try help.
Unknown command padding-left:5px'>".$pvd.", try help.
Unknown command padding-left:5px'>".$pvm.", try help.
Unknown command padding-left:5px, try help.
Unknown command text-align:left, try help.
Unknown command font-weight:bold'>Einspeisung, try help.
Unknown command padding-left:5px'>".$gfi.", try help.
Unknown command padding-left:5px'>".$gfid.", try help.
Unknown command padding-left:5px'>".$gfim.", try help.
Unknown command padding-left:5px, try help.
Unknown command text-align:left, try help.
Unknown command font-weight:bold'>Bezug, try help.
Unknown command padding-left:5px'>".$eb.", try help.
Unknown command padding-left:5px'>".$ebd.", try help.
Unknown command padding-left:5px'>".$ebm.", try help.
Unknown command padding-left:5px, try help.
Unknown command text-align:left, try help.
Unknown command font-weight:bold'>Energieverbrauch, try help.
Unknown command padding-left:5px'>".$et.", try help.
Unknown command padding-left:5px'>".$etd.", try help.
Unknown command padding-left:5px'>".$etm.", try help.
Unknown command padding-left:5px, try help.
Unknown command text-align:left, try help.
Unknown command font-weight:bold'>Autarkiequote, try help.
Unknown command padding-left:5px'>".$aq.", try help.
Unknown command padding-left:5px'>".$aqd.", try help.
Unknown command padding-left:5px'>".$aqm.", try help.
Unknown command padding-left:5px, try help.
Unknown command text-align:left, try help.
Unknown command font-weight:bold'>Eigenverbrauchsquote, try help.
Unknown command padding-left:5px'>".$sq.", try help.
Unknown command padding-left:5px'>".$sqd.", try help.
Unknown command padding-left:5px'>".$sqm.", try help.
Unknown command padding-left:5px, try help.
Unknown command text-align:left, try help.
Unknown command font-weight:bold'>Berechnung, try help.
Unknown command padding-left:5px'>".$md.", try help.
Unknown command padding-left:5px'>".$cd.", try help.
Unknown command padding-left:5px'>".$cm.", try help.
Was ist denn der korrekte Weg, solche mehrzeiligen Code-Blöcke einzugeben?
Da hat jemand im Wiki leider RAW-DEF-kompatible Schreibweise an der einen Stelle verwendet, nicht aber durchgängig (und das dann auch noch falsch angekündigt).
Wenn du das über "das grüne Plus" machen willst: Am Zeilenende aller Zeilen bis auf der letzten den Zeilenumbruch maskieren ("\"). Einfacher ist es vermutlich, diesen Attributinhalt dann über das Attribut-Feld reinzukopieren, da braucht man es nicht.
Hört denn der Unfug mit solchen Monstertexten in Attributen niemals auf?
Ein so langer Codeblock gehört in die 99_myUtils.pm. Basta.
...korrekt...
Und das ganze samt dem weiteren Zusatzcode in eine gepackagte separate myUtils-Datei, die man unter contrib runterladen kann und auch entsprechende cref enthält?
Darfst du gerne bei den Solar-Leuten einkippen ;) ...
Vielen Dank erst einmal für die schnellen Antworten!
Das mit den Backslashes hört sich als Workaround erstmal ganz gut an.
Zu der RAW-DEF-Geschichte muss ich wohl noch etwas recherchieren..
Die 99_myUtils.pm wäre eine Datei, die ich selbst erstelle? Und es ist sichergestellt, dass diese Datei auch nicht (von einem Update) überschrieben wird? Wie bindet man solch eine Datei ein? Da muss man mit sicherheit auch irgendwelche Naming-Conventions einhalten etc/pp.
Insgesamt halte ich die Konfiguration über ein Eingabefeld in einem Web-Frontend für sehr unglücklich. Das ist zwar ganz hübsch , wenn man schnell mal was testen möchte. Für eine reproduzierbare oder auch automatisierte Konfiguration ist das aber nicht brauchbar. Ich konfiguriere alle meine Rechner vollautomatisch mit einem (selbstgeschriebenen) System ähnlich cfengine. Das beisst sich mit der interaktiven Konfiguration von fhem.
Die Konfiguration über eine Datei (wie zB 99_wieAuchImmer.pm) käme mir insofern deutlich entgegen. Viel besser wäre es, wenn man die Konfiguration auf viele Dateien innerhalb eines Verzeichnisses verteilen könnte (wie zB /etc/apt/conf.d).
Also: eine "myUtils" ist - im Prinzip - eine automatisch geladene Moduldatei, die Perl-Funktionen bereitstellt, siehe https://wiki.fhem.de/wiki/99_myUtils_anlegen.
Das hat mit der Konfiguration nur dahingehend was zu tun, dass du z.B. eben für stateFormat dann einfach die Funktion aufrufst, statt den kompletten Perl-Code da reinzumalen.
Verteilte cfg geht, Stichwort: "include", aber wenn ich das höre, gruselt es mich, und Einsteigern, die Fragen dieser Art und Güte hier stellen (ist nicht persönlich gemeint), kann man nur raten, die Hände von der cfg zu lassen und definitiv NICHT mit includes anzufangen...
Grund v.a.: über FHEMWEB kann man als Modulautor die Syntax checken und ggf. Hinweise geben, wie es geht.
Zitat von: jw9 am 11 Januar 2021, 13:56:57
Viel besser wäre es, wenn man die Konfiguration auf viele Dateien innerhalb eines Verzeichnisses verteilen könnte (wie zB /etc/apt/conf.d).
ich geh schonmal Popcorn holen...
Zitat von: Beta-User am 11 Januar 2021, 14:03:58
Also: eine "myUtils" ist - im Prinzip - eine automatisch geladene Moduldatei, die Perl-Funktionen bereitstellt, siehe https://wiki.fhem.de/wiki/99_myUtils_anlegen.
Das hat mit der Konfiguration nur dahingehend was zu tun, dass du z.B. eben für stateFormat dann einfach die Funktion aufrufst, statt den kompletten Perl-Code da reinzumalen.
Soweit klar.
Zitat
Verteilte cfg geht, Stichwort: "include", aber wenn ich das höre, gruselt es mich, und Einsteigern, die Fragen dieser Art und Güte hier stellen (ist nicht persönlich gemeint), kann man nur raten, die Hände von der cfg zu lassen und definitiv NICHT mit includes anzufangen...
Ob "include" das richtige Mittel dazu wäre, sei mal dahingestellt.
Verteilte Config ist ein probates Mittel, um zu verhindern, dass Konfiguration von mehreren Autoritäten (zB ein Teil automatisch generiert, anderer Teil interaktiv) sich nicht gegenseitig in die Quere kommen. Nicht umsonst sieht man immer mehr *.d-Verzeichnisse bei allen Distributionen. Das muss aber nicht zwingend über eine interne include-directive implementiert sein, siehe unten.
Das eigentliche Problem ist vielmehr der Interaktive Charakter der fhem-Konfiguration. Es wäre schon viel geholfen, wenn man das, was man normalerweise in die Eingabezeile bzw ins PlusQuadrat eingibt, an fhem.pl zB über die STDIN und/oder über eine temporäre Datei verfüttern könnte.
Das könnte zB so aussehen:
#! /bin/sh
VERSION=6.0
apt install xxx yyy zzz foo bar baz
wget http://fhem.de/fhem-$VERSION.deb
dpkg -i fhem-$VERSION.deb
cd /opt/fhem && sudo -u fhem /opt/fhem/fhem.pl <<__EOF__
update
shutdown restart
__EOF__
cd /opt/fhem && sudo -u fhem /opt/fhem/fhem.pl <<__EOF__
attr WEB sslVersion TLSv12:!SSLv3
attr WEB HTTPS 1
save
shutdown restart
__EOF__
Oder verteilte Config, wie oben geschrieben:
for i in /meine/configs/fhem.d/*; do sudo -u fhem /opt/fhem/fhem.pl read $i; done
Oder so ähnlich...
Man muss dazu in keinster Weise wissen, wie fhem.cfg aufgebaut ist und welche Prüfungen/Modifikationen fhem.pl beim Abspeichern vornimmt. Im fhem.d-Verzeichmis liegen die Code-Schnipsel so vor, wie sie auf den Wiki-Seiten vorzufinden sind.
Zitat
Grund v.a.: über FHEMWEB kann man als Modulautor die Syntax checken und ggf. Hinweise geben, wie es geht.
Ich sehe hier keinen Widerspruch...
Der Code der aus einer Datei gelesen wird kann doch exakt der gleichen Prüfung/Behandlung unterzogen werden wie wenn er aus dem PlusQuadrat kommt. Ich sehe nicht, warum man da eine andere Behandlung vornehmen sollte.
Und vor Allem: wer Konfiguration automatisch erstellt, ist selbstverständlich auch dafür verantwortlich, dass die generierte Konfiguration auch korrekt ist, und zwar nicht nur in Bezug auf Syntax, sondern vor Allem auch in Bezug auf Verknüpfungen.
Zitat von: Beta-User am 11 Januar 2021, 12:58:05
Wenn du das über "das grüne Plus" machen willst: Am Zeilenende aller Zeilen bis auf der letzten den Zeilenumbruch maskieren ("\").
Der Backslash hilft leider nicht. Immer noch der gleiche Fehler.
Auch dann, wenn ich beim HTML-Code (String, der sich über viele Zeilen hinwegzieht) die Backslashes weglasse...
...vermutlich hat betateilchen recht und das wird ein Popcorn-Thread...
Ich versuch's trotzdem mal...
Zitat von: jw9 am 11 Januar 2021, 17:29:02
Das eigentliche Problem ist vielmehr der Interaktive Charakter der fhem-Konfiguration. Es wäre schon viel geholfen, wenn man das, was man normalerweise in die Eingabezeile bzw ins PlusQuadrat eingibt, an fhem.pl zB über die STDIN und/oder über eine temporäre Datei verfüttern könnte.
[...]
Das sollte gehen, auch und gerade mit #include. Nach meinem Verständnis ist das (wie auch fast aller Text in fhem.cfg, so man die hat) schlicht "Kommandozeilen-Code".
Zitat von: jw9 am 11 Januar 2021, 17:45:02
Der Backslash hilft leider nicht. Immer noch der gleiche Fehler.
Auch dann, wenn ich beim HTML-Code (String, der sich über viele Zeilen hinwegzieht) die Backslashes weglasse...
Damit ist aber mitnichten beantwortet, ob das auch nur ansatzweise sinnvoll ist.
ZitatMan muss dazu in keinster Weise wissen, wie fhem.cfg aufgebaut ist und welche Prüfungen/Modifikationen fhem.pl beim Abspeichern vornimmt.
Nö, muss man nicht, und in der Regel macht man sich auch 0 Gedanken dazu, v.a., wenn die Konfigurationsdaten in einer Datenbank liegen - wie bei mir hier...
Bie der Eingabe können die Fehler passieren, und dann lädt eben FHEM diese Teile nicht, abgespeichert wird nur, was mal erfolgreich in die Konfiguration geladen wurde, und dazu eben noch die aktuellen Readingwerte (und manche laufenden Timer).
Zitat
Der Code der aus einer Datei gelesen wird kann doch exakt der gleichen Prüfung/Behandlung unterzogen werden wie wenn er aus dem PlusQuadrat kommt. Ich sehe nicht, warum man da eine andere Behandlung vornehmen sollte.
Nope. Wenn nach $init_done bestimmte Eingaben kommen, kann man dem User sagen, dass z.B. das vermeintlich zu steuernde Device nicht exisitert und die Annahme verweigern. Kommt das vor $init_done, kann man noch gar nicht wissen, ob das später noch definiert werden wird, und schreibt dann - so man es als Maintainer gut mit dem User meint - eben was ins Log; dann kann er das da ggf. auch später noch finden, falls er mal das Zieldevice umbenannt oder gelöscht hat usw....
ZitatUnd vor Allem: wer Konfiguration automatisch erstellt, ist selbstverständlich auch dafür verantwortlich, dass die generierte Konfiguration auch korrekt ist, und zwar nicht nur in Bezug auf Syntax, sondern vor Allem auch in Bezug auf Verknüpfungen.
Jo. Von daher: viel Spaß beim Entwickeln einer solchen Lösung ;) .
Den Code im Wiki hatte ich zwischenzeitlich erweitert, nicht, dass da jetzt zwei backslashes stehen... Ansonsten wie gesagt: einfach ohne die Backslashes in das Attribut-Feld eingeben, oder noch besser (du kannst ja Programmieren): Das ganze direkt in myUtils auslagern, fertig die Laube...
Ein Config System wie cfengine (o.Ä.) hat Vorteile, wenn man mehrere Server managen muß. Hier dagegen wir EIN Server administriert.
Teoretisch könntest Du über die telnet-Schnitstelle code "reinpusten". Nur ... wie willst Du ichergehen, das nicht immer der gleiche Code "reingepustet" wird?
Zitat von: Beta-User am 11 Januar 2021, 17:51:22
...vermutlich hat betateilchen recht und das wird ein Popcorn-Thread...
Auch ein Pocorn-Thread kann sinnvolle Ergebnisse vorbringen, wenn man nicht komplett aneinander vorbeiredet.
Zitat
Ich versuch's trotzdem mal...Das sollte gehen, auch und gerade mit #include. Nach meinem Verständnis ist das (wie auch fast aller Text in fhem.cfg, so man die hat) schlicht "Kommandozeilen-Code".
Ein Anfang könnte erst einmal sein, sich über den Begriff "Kommandozeile" zu einigen.
Das, was in der fhem.cfg steht, kann ich nicht an eine Shell verfüttern. Können wir uns hier auf den Begriff "Web-Kommandozeile" einigen?
Zitat
ZitatBackslashes helfen nicht
Damit ist aber mitnichten beantwortet, ob das auch nur ansatzweise sinnvoll ist.
Stimmt. Es zeigt aber, dass mehrere (ggf unterschiedliche) Quote-Ebenen nicht von Vorteil sind.
Kopiert man das in ein Attribute-Feld, so werden immer noch mehrere Quote-Ebenen durchlaufen.
Zitat
Zitatmuss nicht wissen, welche Prüfungen/Modifikationen bei Abspeichern vorgenommen werden
Nö, muss man nicht,
Insbesondere auch nicht, weil das nicht ganz dem entspricht, was man ursprünglich in die Web-Kommandozeile gefüttert hat. So ist es zB mit uuid's angereichert. Und auch die Reihenfolge stimmt nicht mehr.
Zitatund in der Regel macht man sich auch 0 Gedanken dazu, v.a., wenn die Konfigurationsdaten in einer Datenbank liegen - wie bei mir hier...
Beschreib doch mal wie Du das organisiert hast?
Möglicherweise liegen wir zwei hier gar nicht so weit auseinander. Deine Config liegt in einer Datenbank, meine in Dateien. Die Frage ist nun, wie man diese Config möglichst schmerzarm in fhem importiert, so dass dabei hinten eine fhem.cfg herausfällt so als ob man es in die Web-Kommandozeile eingegeben hätte.
Zitat
Bie der Eingabe können die Fehler passieren, und dann lädt eben FHEM diese Teile nicht, abgespeichert wird nur, was mal erfolgreich in die Konfiguration geladen wurde, und dazu eben noch die aktuellen Readingwerte (und manche laufenden Timer).
Bei der
interaktiven Eingabe können Fehler passieren. Das ist auch einer der Gründe, warum ich allergisch auf manuelle Konfiguration bin. Ich will reproduzierbare Ergebnisse haben.
Zitat
Nope. Wenn nach $init_done bestimmte Eingaben kommen, kann man dem User sagen, dass z.B. das vermeintlich zu steuernde Device nicht exisitert und die Annahme verweigern. Kommt das vor $init_done, kann man noch gar nicht wissen, ob das später noch definiert werden wird, und schreibt dann - so man es als Maintainer gut mit dem User meint - eben was ins Log; dann kann er das da ggf. auch später noch finden, falls er mal das Zieldevice umbenannt oder gelöscht hat usw....
Hier reden wir wohl mächtig aneinander vorbei.
Weder in der Dokumentation noch in Wiki/HOWTOs wird die Konfiguration über fhem.cfg beschrieben. Grundsätzlich wird die Konfiguration über die Web-Kommandozeile beschrieben.
Das ist also die Ebene über die wir reden. Wenn man Befehle in die Web-Kommandozeile eingibt, ist $init_done bereits gesetzt, oder nicht?
Soweit ich das überblicke, ist $init_done für Modul-Entwickler. Ich rede aber nicht über die Entwicklung eines Moduls, sondern lediglich davon, die normale Konfiguration non-interaktiv in fhem einkippen zu können. Im Grunde also über nichts anderes als das, was der normale Benutzer mittels Cut'n'Paste ins PlusQuadrat hineinkippt, nur dass es eben non-interaktiv (also über Dateien oder STDIN) erfolgen soll.
Zitat
Jo. Von daher: viel Spaß beim Entwickeln einer solchen Lösung ;) .
Vielen Dank! Diesen Spass habe ich bereits seit 2002. Insbesondere auch weil ich dadurch ohne viel nachzudenken mal schnell eine (produktive!) Kiste plattmachen kann und in kürzester Zeit wieder (mit dem gerade aktuellsten Release) komplett net aufsetzen kann. Alle benötigten Subsysteme werden ohne Weiteres Zutun installiert und wieder konfiguriert.
Zitat
Den Code im Wiki hatte ich zwischenzeitlich erweitert, nicht, dass da jetzt zwei backslashes stehen...
Nein, ich hatte das noch auf Basis des alten Codes gemacht.
Aber auch der geänderte Code aus dem Wiki geht nicht. Nur dass jetzt die Fehlermeldung nicht mehr Zeile 1 nennt sondern Zeile 2.
Mir scheint, dass an einigen Stellen auch die Strichpunkte gedoppelt werden müssten. Die Quoting-Regeln von fhem habe ich mir noch nicht so angetan.
Zitat von: Wernieman am 11 Januar 2021, 18:05:47
Ein Config System wie cfengine (o.Ä.) hat Vorteile, wenn man mehrere Server managen muß. Hier dagegen wir EIN Server administriert.
Es hat auch Vorteile, wenn man ein und denselben Server mehrfach installiert, aus welchem Grund auch immer.
Und wieso reden wir über EINEN Server?
Wer sagt, dass in einer Installation nur ein fhem-server laufen darf? Aus physikalischen Gegebenheiten würde ich einen in der Garage, einen im Gartenhaus und dann auch noch einen je Stockwerk haben. Ohne automatische Konfiguration befürchte ich jetzt schon, dass ich den Überblick verliere.
Zitat
Teoretisch könntest Du über die telnet-Schnitstelle code "reinpusten". Nur ... wie willst Du ichergehen, das nicht immer der gleiche Code "reingepustet" wird?
Ja, das "idempotent"-Thema. Hast gut aufgepasst.
Aber darüber muss man sich keine Gedanken machen, solang man nur interaktiv konfigurieren kann..
ZitatWer sagt, dass in einer Installation nur ein fhem-server laufen darf? Aus physikalischen Gegebenheiten würde ich einen in der Garage, einen im Gartenhaus und dann auch noch einen je Stockwerk haben.
Soo so viel Leistung braucht FHEM auch nicht, das Du so differenziert arbeiten mußt. Ein Automatisierungs-System brint Dir eigentlich nur etwas, wenn Du die Infos Zentral sammelst ....
ZitatJa, das "idempotent"-Thema. Hast gut aufgepasst.
Deinen Ton nehme ich an, das Du Lust auf Stänkern und nicht auf Lösungen hast. Bin raus ... habe kein Popcorn mehr
Zitat von: jw9 am 11 Januar 2021, 20:47:48
Ein Anfang könnte erst einmal sein, sich über den Begriff "Kommandozeile" zu einigen.
OK, gemeint war das "Kommandofeld" entsprechend der Begrifflichkeit im "Quick-Start (https://wiki.fhem.de/wiki/Quick-Start#Erster_Aufruf_von_FHEM)".
Zitat
Stimmt. Es zeigt aber, dass mehrere (ggf unterschiedliche) Quote-Ebenen nicht von Vorteil sind.
Das mag sein, aber "cfg-Ge-Editiere" war eben früher, und manches (v.a. das RAW-Dingens) wurde später eben erst später implementiert. Afaik. v.a. auch deswegen, weil "man" gemerkt hat, dass sich viele Probleme vermeiden lassen, wenn man den Weg über FHEMWEB zum default macht und dort viele typische Fehler schon bei der Eingabe abgefangen werden.
Zitat
Beschreib doch mal wie Du das organisiert hast?
Ich nutze configDB (s. commandref) und habe "nur" ein einziges System, weil mir das Verteilen und Doppeln von Infos auch zu doof ist; wo sinnvoll, versuche ich Teile der Logik eher dann extern abzubilden, z.B. in Arduino-Code@MySensors und dann einfach die Ergebnisse an FHEM zu übermitteln und FHEM ansonsten möglichst nicht mit Zeug zu belasten, das ich auch anderweitig bequem abgebildet bekomme (die berühmten Mülltonnen, z.B.). Ergo macht FHEM v.a. "Hardware" und grundlegende Automatismen.
Es ist aber ein (bei Neulingen weit verbreiteter) Irrtum, dass sich die Kondiguration nur in der fhem.cfg findet, manche Module lagern ihre (mglichen Konfigurations-) Daten auch woanders.
Ob es Sinn macht, da irgendwas zu Automatisieren beim Erstellen der cfg, kann ich als Nicht-IT'ler nicht beantworten, letztlich _glaube ich_, dass jedes FHEM-System (auch bei mehreren verteilten wie es dir vorschwebt) so individuell ist, dass der Automatisierungsaufwand höher ist wie der Nutzen. Wer eine zentrale Verwaltung und Versionierung will, kann configDB via Netzwerk oder andere Methoden seiner Wahl nutzen, um die Konfiguration von wo auch immer her zu laden.
Zitat
Aber auch der geänderte Code aus dem Wiki geht nicht. Nur dass jetzt die Fehlermeldung nicht mehr Zeile 1 nennt sondern Zeile 2.
Mir scheint, dass an einigen Stellen auch die Strichpunkte gedoppelt werden müssten. Die Quoting-Regeln von fhem habe ich mir noch nicht so angetan.
Vermutlich. Ist nicht meine Baustelle, von daher habe ich meine untauglichen Änderungen im Wiki rückgängig gemacht.
FHEM und die Doku lebt eben auch davon, dass es viele gibt, die daran mitwirken, und da passieren eben auch mal Fehler. Gerade deswegen: (erstmalige) Eingabe via FHEMWEB, und die meisten Probleme sind beseitigt, wenn es mal in der cfg/db enthalten ist...
Zitat von: Wernieman am 12 Januar 2021, 08:56:53
Soo so viel Leistung braucht FHEM auch nicht, das Du so differenziert arbeiten mußt. Ein Automatisierungs-System brint Dir eigentlich nur etwas, wenn Du die Infos Zentral sammelst ....
Nein, es geht dabei nicht um Leistung, sondern um die Verkabelung.
An den Stellen wo sich "devices" häufen (zB Garage oder Gartenhaus), da kommt ein fhem hin, der das Ganze sozusagen als "Konzentrator" an den zentralen FHEM weiterleitet.
Die Alternative wäre, die Leitungen der Sensoren quer durch das Grundstück zum "es kann nur einen geben" zu ziehen.
Zitat
Deinen Ton nehme ich an, das Du Lust auf Stänkern und nicht auf Lösungen hast.
Sorry, das war kein Stänkern, sondern der Fachbegriff für das, was Du im obigen Post umschrieben hattest. Das war sozusagen die Bestätigung meinerseits, dass Du eines der zentralen Probleme der automatisierten Konfiguration angesprochen hattest, auch wenn Du den zugehörigen Fachbegriff nicht explizit genannt hattest. Siehe auch in dieser Beschreibung (https://docs.cfengine.com/docs/3.12/guide-special-topics-change-management.html) den Absatz unter den Bildchen mit dem Berg und dem Gravitationsnetz:
Zitat
With CFEngine you focus on the end state (right hand figure), not where you start from. Every change, action or recipe may be repeated a infinite number of times[4] without adverse consquences, because every action will only bring you to the desired state, no matter where you start from.
[4] Some writers like to call this property idempotence.
Zitat von: Beta-User am 11 Januar 2021, 12:58:05
Da hat jemand im Wiki leider RAW-DEF-kompatible Schreibweise an der einen Stelle verwendet, nicht aber durchgängig (und das dann auch noch falsch angekündigt).
Noch mal zum Verständnis: das grüne PlusQuadrat
IST doch die Stelle, wo man RAW-DEF hineinkippen soll, oder nicht?
Zitat von: betateilchen am 11 Januar 2021, 13:36:07
Ein so langer Codeblock gehört in die 99_myUtils.pm. Basta.
OK. Habe das jetzt soweit abgeändert, dass myUtils verwendet wird, und es funktioniert soweit auch.
ALLERDINGS: bei mir funktioniert der offitielle Weg, die Datei über "Edit Files" zu bearbeiten ganz und gar nicht. Beim Speichern verschwindet die Datei unwiderbringlich. Sie wird im Anschluss weder unter "Edit Files" gelistet, noch ist sie im Dateisystem aufzufinden.
Sehr ärgerlich, denn man hat sich ja viel Arbeit gemacht, diese zu erstellen.
Folglich habe ich das Beispiel auf die gute alte Art mit emacs erstellt, und es funktioniert jetzt.
Insofern würde ich erst einmal davon abesehen, das Wiki entsprechend abzuändern. Nach meiner Auffassung sollten im Wiki keine "workarounds" auftauchen, sondern nur der offiziell vorgesehene Weg. Da auf diesem offiziellen Weg die Datei (zumindest bei mir) nicht erstellt werden kann, macht es auch keinen Sinn, das dort zu beschreiben.
Hier der Inhalt der 99_Energybalance.pm
package main;
use strict;
use warnings;
sub
Energybalance_Initialize($$)
{
my ($hash) = @_;
}
sub
Energybalance_table($)
{
my $name = @_;
my $pv = ReadingsVal("$name","PV", "")." W";
my $pvd = ReadingsVal("$name","PVDay", "")." kWh";
my $pvm = ReadingsVal("$name","PVMonth", "")." kWh";
my $gfi = ReadingsVal("$name","GridFeedIn", "")." W";
my $gfid = ReadingsVal("$name","GridFeedInDay", "")." kWh";
my $gfim = ReadingsVal("$name","GridFeedInMonth", "")." kWh";
my $eb = ReadingsVal("$name","GridConsumption", "")." W";
my $ebd = ReadingsVal("$name","GridConsumptionDay", "")." kWh";
my $ebm = ReadingsVal("$name","GridConsumptionMonth", "")." kWh";
my $et = ReadingsVal("$name","TotalConsumption", "")." W";
my $etd = ReadingsVal("$name","TotalConsumptionDay", "")." kWh";
my $etm = ReadingsVal("$name","TotalConsumptionMonth", "")." kWh";
my $aq = ReadingsVal("$name","AutarkyQuote", "")." %";
my $aqd = ReadingsVal("$name","AutarkyQuoteDay", "")." %";
my $aqm = ReadingsVal("$name","AutarkyQuoteMonth", "")." %";
my $sq = ReadingsVal("$name","SelfConsumptionQuote", "")." %";
my $sqd = ReadingsVal("$name","SelfConsumptionQuoteDay", "")." %";
my $sqm = ReadingsVal("$name","SelfConsumptionQuoteMonth", "")." %";
my $md = ReadingsTimestamp("$name", "TotalConsumption", "");
my $cd = ReadingsTimestamp("$name", "AutarkyQuoteDay", "");
my $cm = ReadingsTimestamp("$name", "AutarkyQuoteMonth", "");
"<html><table border=2 bordercolor='darkgreen' cellspacing=0>
<tr>
<td style='padding-right:5px;padding-left:5px;font-weight:bold'></td>
<td style='padding-right:5px;padding-left:5px;font-weight:bold'>aktueller Wert</td>
<td style='padding-right:5px;padding-left:5px;font-weight:bold'>Heute</td>
<td style='padding-right:5px;padding-left:5px;font-weight:bold'>dieser Monat</td>
</tr><tr>
<td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>PV-Erzeugung</td>
<td style='padding-right:5px;padding-left:5px'>".$pv."</td>
<td style='padding-right:5px;padding-left:5px'>".$pvd."</td>
<td style='padding-right:5px;padding-left:5px'>".$pvm."</td>
</tr><tr>
<td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Einspeisung</td>
<td style='padding-right:5px;padding-left:5px'>".$gfi."</td>
<td style='padding-right:5px;padding-left:5px'>".$gfid."</td>
<td style='padding-right:5px;padding-left:5px'>".$gfim."</td>
</tr><tr>
<td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Bezug</td>
<td style='padding-right:5px;padding-left:5px'>".$eb."</td>
<td style='padding-right:5px;padding-left:5px'>".$ebd."</td>
<td style='padding-right:5px;padding-left:5px'>".$ebm."</td>
</tr><tr>
<td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Energieverbrauch</td>
<td style='padding-right:5px;padding-left:5px'>".$et."</td>
<td style='padding-right:5px;padding-left:5px'>".$etd."</td>
<td style='padding-right:5px;padding-left:5px'>".$etm."</td>
</tr><tr>
<td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Autarkiequote</td>
<td style='padding-right:5px;padding-left:5px'>".$aq."</td>
<td style='padding-right:5px;padding-left:5px'>".$aqd."</td>
<td style='padding-right:5px;padding-left:5px'>".$aqm."</td>
</tr><tr>
<td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Eigenverbrauchsquote</td>
<td style='padding-right:5px;padding-left:5px'>".$sq."</td>
<td style='padding-right:5px;padding-left:5px'>".$sqd."</td>
<td style='padding-right:5px;padding-left:5px'>".$sqm."</td>
</tr><tr>
<td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Berechnung am</td>
<td style='padding-right:5px;padding-left:5px'>".$md."</td>
<td style='padding-right:5px;padding-left:5px'>".$cd."</td>
<td style='padding-right:5px;padding-left:5px'>".$cm."</td>
</tr></table>
</html>"
}
1;
Aufgerufen wird das dann über
attr Dum.Energy stateFormat { Energybalance_table ($name);; }
Und ja: wie oben vermutet, lag das Problem beim Doppel-Strichpunkt.
Zitat von: jw9 am 12 Januar 2021, 14:41:05
Noch mal zum Verständnis: das grüne PlusQuadrat IST doch die Stelle, wo man RAW-DEF hineinkippen soll, oder nicht?
Ja. Der Vollständigkeit wegen: Es gibt noch eine zweite Option, nämlich das (vorausgefüllte) Dialogfeld, das erscheint, wenn man in der Detailansicht eines Geräts auf "Raw definition" klickt.
Ich selbst verwurstel' das dann noch relativ häufig für attrTemplate (zum allgemeinen Gebrauch). Da ist die Syntax auch ähnlich, aber nicht ganz gleich...
Zitat
ALLERDINGS: bei mir funktioniert der offitielle Weg, die Datei über "Edit Files" zu bearbeiten ganz und gar nicht.
Im Wiki steht aber auch, dass die Namenskontention u.A. ein "Utils" vorschreibt. Kann ich bei dir nicht erkennen:
ZitatFolgende Dinge sind für eigene Programmdateien besonders zu beachten:
- Der Dateiname muss mit 99_ beginnen. [...].
- Damit die neue Datei bei Edit files angezeigt wird, muss sie mit .pm enden und den Bestandteil Utils enthalten. Also zum Beispiel 99_meineUtils.pm oder 99_myUtils_Homematic.pm.
Warum die nicht im Dateisystem zu finden sein sollte, erschließt sich mir nicht.
Was die Syntax-Problematik mit den Semicolon etc. angeht, bitte den Autor des Artikels kontaktieren; wie gesagt: nicht meine Baustelle...