Merkwürdige Zeilen in der fhem.cfg

Begonnen von Cluni, 22 Juni 2017, 15:20:47

Vorheriges Thema - Nächstes Thema

Cluni

Hallo zusammen,

mir waren vor einiger Zeit bereits ein paar merkwürdige Einträge in der Logdatei aufgefallen:
Unknown command elsif, try help.\
Unknown command if, try help.\
Unknown command elsif, try help.\
Unknown command if, try help.\
Unknown command elsif, try help.\
Unknown command if, try help.\
Unknown command elsif, try help.\
Unknown command if, try help.\
Unknown command elsif, try help.\


Hatte auch mal danach gesucht, wo das her kommen könnte, aber nichts gefunden.  Nun ist mir zufällig was in der fhem.cfg aufgefallen (siehe Bild im Anhang), als ich nach einem Schreibfehler suchte, der sich per Copy & Paste ziemlich verbreitet hatte in meiner Installation. Nun die große(n) Frage(n):

- Was wachen diese Zeilen in der fhem.cfg?
- Gehören sie da überhaupt hin?
- Wenn nein, wie sind sie da hinein gekommen? Ich habe die fhem.cfg kein einziges Mal per Hand editiert.
- Kann ich die Zeilen mit "./log/fhem.save:" und "Unknown command" einfach löschen und wenn ja wo am Besten (fhem-Editor oder lieber bei heruntergefahrenem fhem im nano?

Liebe Grüße und danke für die Hilfe
Bernd

CoolTux

Commandref oder Wiki. Nach global und modt suchen.
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

gloob

#2
Lösch die Zeilen über FHEM in den Konfigurationsdatei und speichern.
Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway

Otto123

Hi,

sieht so aus, als ob das einfach als Nachricht in deinem attr global motd drinstehen.
Du kannst einfach hergehen und den Inhalt des Attributes in der Oberfläche löschen.

Geht auch in der FHEM Kommandozeile mit attr global motd none
Dann save machen.

Sollte das beim Neustart wieder auftauchen liegt das Problem in einer Deiner Definitionen.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Cluni

Danke euch allen.

Zitat von: Otto123 am 22 Juni 2017, 15:31:30
sieht so aus, als ob das einfach als Nachricht in deinem attr global motd drinstehen.
Du kannst einfach hergehen und den Inhalt des Attributes in der Oberfläche löschen.

Das hatte ich jetzt über den Hinweis von CoolTux auch gefunden, dass es da drin steht. Gehört also nicht dahin, hat keine Bedeutung und kann ich bedenkenlos löschen? Ich frag mich nur, wo das genau herkommt.

Muss das none denn in motd drin stehen, oder kann ich das ersatzlos löschen mit dem Button oder per attrdelete?

Gruß Bernd

marvin78

Das was Otto schrieb hast du gelesen? Da steht alles drin. Kommt es wieder, musst du schauen, wo der Fehler ist. Vermutlich in einer Definition von dir.

Otto123

Hallo Bernd,

nein nicht das attr löschen, bitte nur den Inhalt. Mit none verhinderst Du die Standard Sicherheitsmeldung, Ergebnis zum nächsten wirklichen Fehler..

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Cluni

@marvin: Natürlich hatte ich das gelesen, sonst hätte ich ihn ja nicht zitiert. Ich hatte nur noch ein Verständnisproblem, weshalb ich nochmal nachgefragt habe.

@Otto: Danke, genau das wollte ich wissen. Ich kannte die Funktion/Bedeutung von motd bis jetzt noch nicht...

Otto123

Dann schreib nichts rein sondern lass es leer, dann kannst Du die Bedeutung auf dem Startschirm lesen :)
-> set the global attribute motd to none to supress this message.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

CoolTux

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

Cluni

Zitat von: CoolTux am 22 Juni 2017, 16:31:48
Steht hier unter Attribut motd gut beschrieben.
Jops, hatte ich auch dank der zielführenden Hinweise gelesen.

Ich habe den Mist aber wieder drin stehen nach einem Neustart. Mal suchen, wo das herkommen könnte....

CoolTux

Ich gehe von einem selbst geschriebenen notify aus.
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

Cluni

#12
Zitat von: CoolTux am 22 Juni 2017, 16:45:25
Ich gehe von einem selbst geschriebenen notify aus.

In der Tat! Ich habe eine Routine, die mir Timer für jeden einzelnen Rollladen anlegt. Diese Routine wird normal mitten in der Nacht ausgeführt, aber auch beim Neustart, weil die Timer nur temporär sind und dann nach einem Neustart nicht mehr da sind.
In dieser Perl-Routine werden die ats - weil sie etwas länger sind - der Übersicht halber über mehrere Zeilen geschrieben. Hier mal ein Ausschnitt:
elsif (($A_Modus_runter eq 'immer') and (AttrVal("$dev","Auto_Drehgriffkontakt","nv") ne "nv")) {
        $runter_at = "define $Rol_runter_Timername at $Runter_Zeit
{ \
if ((ReadingsVal(\"Rollladen.Automatik.abends\",\"state\",\"nv\") eq \"on\" ) and (AttrVal(\"$dev\",\"Auto_Modus_runter\",\"aus\") ne \"aus\") and (ReadingsVal(\"$A_Drehgriffkontakt\",\"state\",\"\") eq \"tilted\" )) {fhem (\"setreading $dev Automatik_automatische_Fahrt 1;;setreading $dev Automatik_Pos_vor_Geoeffnet 0;;set $dev $A_Lueften_Pos\")  } \
elsif ((ReadingsVal(\"Rollladen.Automatik.abends\",\"state\",\"nv\") eq \"on\" ) and (AttrVal(\"$dev\",\"Auto_Modus_runter\",\"aus\") ne \"aus\") and (ReadingsVal(\"$A_Drehgriffkontakt\",\"state\",\"\") eq \"open\" )) {fhem (\"setreading $dev Automatik_automatische_Fahrt 1;;setreading $dev Automatik_Pos_vor_Geoeffnet 0;;set $dev $A_Geoeffnet_Pos\") } \
elsif ((ReadingsVal(\"Rollladen.Automatik.abends\",\"state\",\"nv\") eq \"on\" ) and (AttrVal(\"$dev\",\"Auto_Modus_runter\",\"aus\") ne \"aus\") and (ReadingsVal(\"$A_Drehgriffkontakt\",\"state\",\"\") eq \"closed\" )) {fhem(\"setreading $dev Automatik_automatische_Fahrt 1;;set $dev off\") }}";
}


Und das stößt beim Aufrufen der Routine während des Systemstarts anscheinend auf. Die ats werden aber korrekt angelegt und funktionieren auch.

Da ich das alles momentan aber umbaue (es kommt nur noch der Aufruf einer Perl-Routine mit Übergabe des Rollladennamens in das at und der Rest wird dann in der Perl-Routine abgefragt und behandelt), wird sich das Problem in Kürze selber erledigen. Ich frage mich nur, was da zu den genannten Meldungen führt. Lauffähig ist das Resultat ja nachher ohne jeglichen Fehler...

Grüße Bernd

CoolTux

Gib mal bitte ein List von diesem at.


if ((ReadingsVal(\"Rollladen.Automatik.abends\",\"state\",\"nv\") eq \"on\" ) and (AttrVal(\"$dev\",\"Auto_Modus_runter\",\"aus\") ne \"aus\") and (ReadingsVal(\"$A_Drehgriffkontakt\",\"state\",\"\") eq \"tilted\" )) {fhem (\"setreading $dev Automatik_automatische_Fahrt 1;;setreading $dev Automatik_Pos_vor_Geoeffnet 0;;set $dev $A_Lueften_Pos\")  } \


Ich gehe davon aus das dies ein Auszug aus Deiner fhem.cfg ist. Ich gebe dafür keinen Support weil man alles über das Webinterface machen kann und sollte.
Auf jeden Fall sind die Backslash bis auf das hinterste völlig falsch. Ein Wunder das es überhaupt geht.
Wenn Du das über das Webinterface anlegen oder bearbeiten würdest, würdest du eine Fehlermeldung mit Syntaxerror bekommen.


Daher bitte ein list vom at und dann schauen wir mal wie man es sauber in der FHEMWEB Oberfläche hinbekommt. Es sei denn natürlich Du hast kein Interesse am Lernfaktor, dann kannst es auch so lassen  ;)
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

Cluni

Zitat von: CoolTux am 23 Juni 2017, 12:48:28
Ich gehe davon aus das dies ein Auszug aus Deiner fhem.cfg ist. Ich gebe dafür keinen Support weil man alles über das Webinterface machen kann und sollte.

Nein, ist nicht aus der fhem.cfg. Darin habe ich noch nie etwas von Hand geändert. Der obige Ausschnitt ist aus einer Perl-Routine, die mir die ats jede Nacht neu berechnet - je nach Einstellung in den User-Attributen des Rollladens berechne ich die Zeiten für den kommenden Tag für rauf und runter. Dabei werden u.A. Sonnenauf- und Untergangszeiten, früheste / späteste Zeiten für die Fahrt, zusätzliche Zusatzzeiten, Fensterkontakte, und und und... berücksichtigt.

Das erzeugte at sieht dann zum Beispiel nachher so aus (direktes list eines automatisch erzeugten at):

Internals:
   CFGFN
   COMMAND    {
if ((ReadingsVal("Rollladen.Automatik.abends","state","nv") eq "on" ) and (AttrVal("Rol.Bad","Auto_Modus_runter","aus") ne "aus") and (ReadingsVal("Sensor.Bad","state","") eq "open" )) {fhem ("setreading Rol.Bad Automatik_automatische_Fahrt 1;setreading Rol.Bad Automatik_Pos_vor_Lueften 0;set Rol.Bad 40")  }
elsif ((ReadingsVal("Rollladen.Automatik.abends","state","nv") eq "on" ) and (AttrVal("Rol.Bad","Auto_Modus_runter","aus") ne "aus") and (ReadingsVal("Sensor.Bad","state","") ne "open" )) { fhem ("setreading Rol.Bad Automatik_automatische_Fahrt 1;set Rol.Bad off") }}
   DEF        2017-06-23T20:40:41 {
if ((ReadingsVal("Rollladen.Automatik.abends","state","nv") eq "on" ) and (AttrVal("Rol.Bad","Auto_Modus_runter","aus") ne "aus") and (ReadingsVal("Sensor.Bad","state","") eq "open" )) {fhem ("setreading Rol.Bad Automatik_automatische_Fahrt 1;setreading Rol.Bad Automatik_Pos_vor_Lueften 0;set Rol.Bad 40")  }
elsif ((ReadingsVal("Rollladen.Automatik.abends","state","nv") eq "on" ) and (AttrVal("Rol.Bad","Auto_Modus_runter","aus") ne "aus") and (ReadingsVal("Sensor.Bad","state","") ne "open" )) { fhem ("setreading Rol.Bad Automatik_automatische_Fahrt 1;set Rol.Bad off") }}
   NAME       Rol_Timer_runter_Rol.Bad
   NR         5067
   PERIODIC   no
   RELATIVE   no
   STATE      Next: 20:40:41
   TIMESPEC   20:40:41
   TRIGGERTIME 1498243241
   TRIGGERTIME_FMT 2017-06-23 20:40:41
   TYPE       at
   VOLATILE   1
   Readings:
     2017-06-23 03:05:01   state           Next: 20:40:41
Attributes:
   icon       fts_shutter_automatic@green
   room       Timer


Zitat von: CoolTux am 23 Juni 2017, 12:48:28
Auf jeden Fall sind die Backslash bis auf das hinterste völlig falsch. Ein Wunder das es überhaupt geht.

Denke ich nicht (aber lasse mich gerne eines Besseren belehren) - die sind ja da, weil nachfolgende Zeichen übernommen werden sollen.

Zitat von: CoolTux am 23 Juni 2017, 12:48:28
Wenn Du das über das Webinterface anlegen oder bearbeiten würdest, würdest du eine Fehlermeldung mit Syntaxerror bekommen.

Das ist mir klar, dass das dann anders aussehen muss.

Zitat von: CoolTux am 23 Juni 2017, 12:48:28
Daher bitte ein list vom at und dann schauen wir mal wie man es sauber in der FHEMWEB Oberfläche hinbekommt. Es sei denn natürlich Du hast kein Interesse am Lernfaktor, dann kannst es auch so lassen  ;)

Lernen ist immer gut - nobody is perfect. Aber ich will es ja nicht direkt in der Fhem-Oberfläche eingeben, weil sich ja zum einen die Zeiten täglich ändern und zum anderen die restlichen Einstellungen in den Attributen des Rollladens ja ggf. auch.  Die ganzen if/elsif und else fliegen eh in Kürze raus auf dem at und dann ist nur noch ein Routinenaufruf mit Übergabe des Rollladennamens da. Aber wie mehrmals gesagt - ich wüsste schon gerne, warum das zu der nachricht führt...

Cluni

Ach so - bevor die Nachfrage kommt, warum in dem list nur ein elsif und vorher in dem Beispiel zwei elsif sind: Der Rollladen im List hat keinen Drehgriffkontakt und das Beispiel aus der Perl war für ein Fenster mit Drehgriffkontakt.  ;)

CoolTux

Also wenn es erstellt ist sieht es gut aus. Zu mindest was die \ an geht. Eventuell zu viele } oder {
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

Cluni

Wüsste nicht, wo man da noch was weglassen könnte. Hab mal einen Screenshot vom Inline-Editor im def gemacht:

CoolTux

Du kannst die runden Klammern zwischen den and Abfragen weglassen. Aber das hat nichts mit dem Fehler zu tun.

Gib mir mal bitte ein list von diesem Notify. Die Meldung wird beim ausführen des Notify kommen denke ich.

Ich habe Dich doch richtig verstanden das Du ein notiy hast welches dann für jedes Rollo ein at anlegt?
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

Benni

#19
Zitat von: Cluni am 23 Juni 2017, 13:43:24
Hab mal einen Screenshot vom Inline-Editor im def gemacht:

statt einfach nur den Text zu kopieren und hier in Code-Tags einzufügen  ::)

Ich würde so was, doch schon relativ komplexes (auch wenn ich den Sinn noch nicht ganz verstanden habe; muß ich auch nicht), in eine sub in der 99_myUtils auslagern:


sub autoRollBad() {
    return undef if(ReadingsVal("Rollladen.Automatik.abends","state","nv") ne "on" );
    return undef if(AttrVal("Rol.Bad","Auto_Modus_runter","aus") eq "aus");

    fhem ("setreading Rol.Bad Automatik_automatische_Fahrt 1;setreading Rol.Bad Automatik_Pos_vor_Lueften 0;set Rol.Bad 40") 
        if(ReadingsVal("Sensor.Bad","state","") eq "open");

    fhem ("setreading Rol.Bad Automatik_automatische_Fahrt 1;set Rol.Bad off");
   
}


Da kann man manches eleganter lösen und übersichtlicher ist es allemal.

Cluni

Zitat von: CoolTux am 23 Juni 2017, 13:53:25
Du kannst die runden Klammern zwischen den and Abfragen weglassen. Aber das hat nichts mit dem Fehler zu tun.

Stimmt - ich finde das geklammert aber übersichtlicher - da sieht man schneller, was Sache ist

Zitat von: CoolTux am 23 Juni 2017, 13:53:25
Gib mir mal bitte ein list von diesem Notify. Die Meldung wird beim ausführen des Notify kommen denke ich.

Es gibt kein Notify - das ist nur ein at, welches zu einer bestimmten Zeit ausgeführt wird. Das List ist das obige in Post #14

Zitat von: CoolTux am 23 Juni 2017, 13:53:25
Ich habe Dich doch richtig verstanden das Du ein notiy hast welches dann für jedes Rollo ein at anlegt?

Nein, ich habe ein at, welches täglich um 3:05Uhr nachts (damit das auch nach einer Zeitumstellung funktioniert) ausgeführt wird. Hier das List:

Internals:
   COMMAND    {Auto_Rol_group_at("Rol")}
   DEF        *03:05:00 {Auto_Rol_group_at("Rol")}
   NAME       TimerErzeuger_Rol
   NR         293
   PERIODIC   yes
   RELATIVE   no
   REP        -1
   STATE      Next: 03:05:00
   TIMESPEC   03:05:00
   TRIGGERTIME 1498266300
   TRIGGERTIME_FMT 2017-06-24 03:05:00
   TYPE       at
   Readings:
     2017-06-23 03:05:14   state           Next: 03:05:00
Attributes:
   icon       clock@blue
   room       Timer
   webCmd     execNow


Die aufgerufene Perl-Routine "Auto_Rol_group_at" erzeugt dann für jeden Rollladen zwei ats - einen für morgens und einen für abends (wenn der Rollladen in den User-Attributen nicht deaktiviert ist).

Für den Fall (warum auch immer), dass das System neu gestartet wird, triggere ich beim Systemstart ein Notify, welches diesen Timer manuell anstößt (wobei mir gerade auffällt, dass ich dort auch direkt die Perl-Routine anschmeißen könnte - immer gut, wenn man darüber spricht  ::) ). Dieses Notify sieht so aus:

Internals:
   DEF        global:INITIALIZED {fhem("set TimerErzeuger_Rol execNow")}
   NAME       TimerSystemStart.ntfy
   NOTIFYDEV  global
   NR         258
   NTFY_ORDER 50-TimerSystemStart.ntfy
   REGEXP     global:INITIALIZED
   STATE      2017-06-22 16:28:24
   TYPE       notify
   Readings:
     2017-06-22 16:28:23   state           active
Attributes:
   icon       system_fhem_reboot@orange
   room       Timer





Zitat von: Benni am 23 Juni 2017, 13:57:09
statt einfach nur den Text zu kopieren und hier in Code-Tags einzufügen  ::)

Siehe den Code in Post #14 - dies ist das List dieses ats. Ich fand halt nur, dass es besser zu sehen ist in dem Screenshot. Habe ich aber auch geschrieben, dass das davon ist.

Zitat von: Benni am 23 Juni 2017, 13:57:09
Ich würde so was, doch schon relativ komplexes (auch wenn ich den Sinn noch nicht ganz verstanden habe; muß ich auch nicht), in eine sub in der 99_myUtils auslagern:


sub autoRollBad() {
....
);
}


Da kann man manches eleganter lösen und übersichtlicher ist es allemal.

Es tut mir Leid, aber ich muss dich nochmals auf frühere Posts hier verweisen
Post #14 (letzer Absatz):
ZitatDie ganzen if/elsif und else fliegen eh in Kürze raus auf dem at und dann ist nur noch ein Routinenaufruf mit Übergabe des Rollladennamens da.

Post #12 (letzter Absatz):
ZitatDa ich das alles momentan aber umbaue (es kommt nur noch der Aufruf einer Perl-Routine mit Übergabe des Rollladennamens in das at und der Rest wird dann in der Perl-Routine abgefragt und behandelt), wird sich das Problem in Kürze selber erledigen.



Beta-User

Hi Cluni,

schön zu sehen, wie das vorangeht mit dem code, bin leider mit der "Modularisierung" immer noch nicht vorangekommen.

@Cooltux und Benni:
Es geht um den code aus diesem Post hier.
Vielleicht habt Ihr Lust und Muse, Hinweise zu geben, ob und wie man am besten ein Modul bastelt aus diesem umfangreichen Code, den Cluni und Frini (und evtl. Hugomckinnley) da entwickelt haben.

Eigentlich wären da interne timer usw. die elegantere Lösung...

Gruß, Beta-User
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Cluni

Ich würde noch gerne eine Woche oder so warten. Der Code in dem Thread ist wegen dem momentanen Umbau nicht mehr ganz aktuell - deshalb habe ich hier auch nicht auf den thread verwiesen. Wir sind aber denke ich bald soweit, dass wir eine aktualisierte Version posten können. Die ganzen Notifies für die Fenster- open/tilted/closed Geschichte gibt es schon nicht mehr. Das macht mittlerweile nur noch ein Notify. Darüber wird auch abgefangen, wenn der Rollladen manuell betrieben wird, um eine Sperrzeit vor der nächsten automatischen Aktion zu setzen. Ist mittlerweile schon viel aufgeräumter. Aber damit es noch aufgeräumter und übersichtlicher wird, möchte ich vorher noch die Timergeschichten sauberer machen, damit der auszuführende Teil immer gleich ist. Denke, dass das dann auch in einem Modul sauberer zu implementieren ist.

Aber wir werden hier offtopic... ;)