Ankündigung

Einklappen
Keine Ankündigung bisher.

LinKNX: Diskussionen zu Tipps, Tricks und Beispiele

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • mumpf
    antwortet
    Hi,

    spontan würde mir einfallen einfach einen Timer für Mitternacht einzurichten, der bei einem exceptionday ein objekt auf true setzt, das man dann in weiteren logiken auswerten kann. Das Objekt muss natürlich bei einem nicht-exceptionday auch wieder auf false gesetzt werden...

    Gruß, Waldemar

    Einen Kommentar schreiben:


  • Cneumaier
    antwortet
    linknx und exceptiondays

    Hallo,

    hat jemand erfahrung damit, in linknx mit den exceptiondays zu arbeiten?

    Die Anwendung bei Zeitschaltfunktionen ist ja klar:
    Code:
      <at hour="14" min="00" wdays="12345" exception="no" />
    bedeutet, dass die Funktion nicht an "Ausnahmetagen" ausgeführt wird. Mit exception="yes" ist es unabhängig davon.

    Aber ich möchte auswerten, ob ein "Ausnahmetag" ist. Also verschiedene Funktionen nur an diesen Tagen ausführen.

    Wie setzte ich sowas um, bzw. is das überhaupt möglich?

    Einen Kommentar schreiben:


  • dundee
    antwortet
    Hallo Carsten,

    Zitat von netsrac Beitrag anzeigen
    Die Logs werden dem User als Mail zugestellt. Je nachdem ob eMails auf dem Server aufgesetzt sind. Schau einfach mal in /var/mail/username. Kannst Du auch einfach mit 'nem Texteditor öffnen.
    Hab grad keinen Zugriff aufs System. Muss ich mal gucken. Ich hab da keine EMails aufgesetzt.
    Aber trotzdem super Tip!

    Zitat von netsrac Beitrag anzeigen
    Zu Deinem obigen Code:

    Erkläre mir mal, was der "\" vor der ersten Klammer soll :-)
    Ich dachte immer, die erste geschweifte müsste man escapen.
    Habs grad getestet - geht doch glatt auch ohne.
    Zitat von netsrac Beitrag anzeigen
    Zum Aufräumen der Logfiles gibt es übrigens ein besseres Tool namens "logrotate". Dort kannst Du die Maximalgröße einies einzelnen Files angeben und wie viele "archive" Du behalten willst.
    Da bin ich grad erst gestern Abend drüber gestolpert.
    Wenn ich da das eibd.log mit einbeziehe muss ich dann aber wohl nen Deamon-Restart mit reinnehmen, oder?
    Jedenfalls erzeugt er kein neues Logfile, wenn man ihm das alte im laufenden Betrieb weglöscht (und das macht logrotate doch, oder?).

    Bin ich der einzige, der den eibd.log mit ins logrotate nehmen will?
    Oder gibts da schon ne logrotate.conf dafür?


    Oh Mann, jetzt sind wir langsam völlig OT. Und ich hab eh schon den Fred gekapert (eigentlich nur für EINE KURZE FRAGE).

    Ich übergeb den Fred jetzt wieder offiziell an den TE.
    logrotate und Deamon-Restart krieg ich wohl auch alleine in den Griff. Schaut jetzt nicht so sonderlich komplex aus - hoffe ich mal....

    Einen Kommentar schreiben:


  • netsrac
    antwortet
    Zitat von dundee Beitrag anzeigen
    Hab bei mir in der crontab
    Code:
    0 3 1 * * find /var/log -name '*.gz' -exec rm -f \{} \;
    Also immer am 1. des Monats um 03:00.
    Läuft aber nicht.

    Gibts irgendwo nen Log, wo man Fehlermeldungen sieht?
    Die Logs werden dem User als Mail zugestellt. Je nachdem ob eMails auf dem Server aufgesetzt sind. Schau einfach mal in /var/mail/username. Kannst Du auch einfach mit 'nem Texteditor öffnen.

    Zu Deinem obigen Code:

    Erkläre mir mal, was der "\" vor der ersten Klammer soll :-)

    Versuchs mal so:
    Code:
    0 3 1 * * (find /var/log -name \*.gz -exec rm -f {} \;)
    Zum Aufräumen der Logfiles gibt es übrigens ein besseres Tool namens "logrotate". Dort kannst Du die Maximalgröße einies einzelnen Files angeben und wie viele "archive" Du behalten willst.

    Gruß, netsrac

    Einen Kommentar schreiben:


  • dundee
    antwortet
    Hallo Carsten,

    muss das ein Shell-Script sein, oder kann ich da auch direkt Kommandos angeben.

    Hab bei mir in der crontab
    Code:
    0 3 1 * * find /var/log -name '*.gz' -exec rm -f \{} \;
    Also immer am 1. des Monats um 03:00.
    Läuft aber nicht.

    Gibts irgendwo nen Log, wo man Fehlermeldungen sieht?

    Sorry, wenn ich den Fred gekapert hab.
    Aber die Info hilft dem Michi sicher auch.

    Einen Kommentar schreiben:


  • netsrac
    antwortet
    Zitat von Michixx Beitrag anzeigen
    Edit: Ok, über Crontab habe ich jetzt was über Google finden können, scheint echt einfach zu sein.
    Ich muß dann nur mal schauen, wie ich dann die Werte wieder nach Linknx. bekomme.
    So...CRON ist echt kein Hexenwerk.

    Einfach auf Shell-Ebene folgendes Kommando eingeben:

    Code:
    crontab -e
    Daraufhin öffnet sich Dein Lieblingseditor. Nun einfach pro Zeile ein Eintrag. Die Spalten sehen dabei wie folgt aus:

    Code:
               field         allowed values
               -----         --------------
               minute        0-59
               hour          0-23
               day of month  1-31
               month         1-12 (or names, see below)
               day of week   0-7 (0 or 7 is Sun, or use names)
               script name
    Für jede Zeit-Spalte kannst Du ein "*" verwenden.

    Wenn Du also alle 5 Minuten ein Script ausführen willst, dann schreibst Du:
    Code:
    */5 * * * * /path/to/script.sh
    Ein Script zu festen 10-er Minuten ausführen kannst Du hiermit:
    Code:
    10,20,30,40,50 * * * * /path/to/script2.sh
    Oder immer kurz vor Mitternacht:
    Code:
    59 23 * * * /path/to/script3.sh
    Nur mal so als Idee....

    Gruß, Netsrac

    Einen Kommentar schreiben:


  • Michixx
    antwortet
    Problem scheint gelöst

    So,

    jetzt habe ich den/die Übeltäter gefunden.

    Zitat von netsrac Beitrag anzeigen
    Ich vermute mal, dass LinKNX hier stehen bleibt, weil irgendein Shell-Script hängen bleibt.
    Das hatte ich jetzt auch schon vermutet, denn je mehr Shell-Scripte ich hinzugefügt habe desto schneller ist Linknx ausgestiegen.

    Die Scripte haben sich nicht beendet, es sind nach jedem Aufruf noch netcat Prozesse sowie die Scripte als Prozess über ps zu sehen.
    Code:
    2798 ?        S      0:00 sh -c /home/rrdtool/update_database_RL_Flur.sh
     2799 ?        S      0:00 /bin/bash /home/rrdtool/update_database_RL_Flur.sh
     2811 ?        S      0:00 netcat localhost 1028
     2812 ?        S      0:00 sh -c /home/rrdtool/update_database_RL_WZ_HK2.sh
     2813 ?        S      0:00 /bin/bash /home/rrdtool/update_database_RL_WZ_HK2.sh
     2818 ?        S      0:00 netcat localhost 1028
     2819 ?        S      0:00 sh -c /home/rrdtool/update_database_RL_WZ_HK1.sh
     2820 ?        S      0:00 /bin/bash /home/rrdtool/update_database_RL_WZ_HK1.sh
     2832 ?        S      0:00 netcat localhost 1028
     2840 ?        S      0:00 sh -c /home/rrdtool/update_database_RL_Erdgeschoss.sh
     2841 ?        S      0:00 /bin/bash /home/rrdtool/update_database_RL_Erdgeschoss.sh
     2853 ?        S      0:00 netcat localhost 1028
     2854 ?        S      0:00 sh -c /home/rrdtool/update_database_VL_Erdgeschoss.sh
     2855 ?        S      0:00 /bin/bash /home/rrdtool/update_database_VL_Erdgeschoss.sh
     2867 ?        S      0:00 netcat localhost 1028
     2884 ?        S      0:00 sh -c /home/rrdtool/update_database_RL_Flur.sh
     2885 ?        S      0:00 /bin/bash /home/rrdtool/update_database_RL_Flur.sh
     2897 ?        S      0:00 netcat localhost 1028
     2898 ?        S      0:00 sh -c /home/rrdtool/update_database_RL_WZ_HK2.sh
     2899 ?        S      0:00 /bin/bash /home/rrdtool/update_database_RL_WZ_HK2.sh
     2904 ?        S      0:00 netcat localhost 1028
     2906 ?        S      0:00 sh -c /home/rrdtool/update_database_RL_WZ_HK1.sh
     2907 ?        S      0:00 /bin/bash /home/rrdtool/update_database_RL_WZ_HK1.sh
     2919 ?        S      0:00 netcat localhost 1028
     2920 ?        R      0:00 ps ax
    Ich habe das Scrpit nun abgeändert, nun ist alles sauber.

    Code:
    #!/bin/bash
    cd /home/rrdtool
    # Read temperature from sensor Arbeitszimmer
    tempread=`cat /mnt/1wire/28.B3B100040000/temperature`
     
    OBJECTID="Arbeitszimmer_Temperatur"
    #printf '<write><object id="%s" value=%s /></write>\4' "$OBJECTID" "$tempread" | netcat localhost 1028 > /dev/null 2>&1
    [COLOR=darkred]printf '<write><object id="%s" value=%s /></write>\4' "$OBJECTID" "$tempread" | nc -q 1 localhost 1028 > /dev/null 2>&1[/COLOR]

    Zitat von netsrac Beitrag anzeigen
    Sowas gehört in den CRON. Hier kannst Du zu festgelegten Zeiten/Intervallen einfach ein Shell-Script aufrufen. Mach einfach mal "man crontab". Ist super einfach.
    Ich denke auch dass es da besser aufgehoben ist.
    Leider habe ich mich damit noch nicht richtig auseinander gesetzt.
    Kannst mir da mal jemand zu meinen Script ein einfaches Beispiel erstellen?
    Wenn ich erst einmal einen Anfang/Vorlage habe, dann komme ich mit dem Rest auch selber klar.
    Besten Dank.

    Gruß
    Michi

    Edit: Ok, über Crontab habe ich jetzt was über Google finden können, scheint echt einfach zu sein.
    Ich muß dann nur mal schauen, wie ich dann die Werte wieder nach Linknx. bekomme.

    Einen Kommentar schreiben:


  • netsrac
    antwortet
    Habe gerade mal in Dein XML geschaut...
    Code:
        <rule id="sendRL_Flur_Temp">
          <condition type="timer" trigger="true">
            <every>250</every>
          </condition>
          <actionlist>
            <action type="shell-cmd" cmd="/home/rrdtool/update_database_RL_Flur.sh"/>
          </actionlist>
        </rule>
    Ich vermute mal, dass LinKNX hier stehen bleibt, weil irgendein Shell-Script hängen bleibt.

    Auch wenn es prinzipiell so laufen sollte, denke ich dennoch, das die reinen Timer-Rules nicht wirklich für LinKNX geeignet sollen.

    Sowas gehört in den CRON. Hier kannst Du zu festgelegten Zeiten/Intervallen einfach ein Shell-Script aufrufen. Mach einfach mal "man crontab". Ist super einfach.

    Gruß, Netsrac

    Einen Kommentar schreiben:


  • Michixx
    antwortet
    Hallo Ihr,

    @panzaeron,
    ich habe mal am Beginn und Ende des Shell-Skripts eine Ausgabe in eine zweite Log-Datei erstellt und den Loglevel auf Debug gesetzt.

    @toggle,

    der Prozess ist scheinbar nicht mehr vorhanden, hier nach dem es wieder stehen geblieben ist, nach 8 Std., keine 6, habe mich da vertan.
    Code:
    /var/lib/linknx$ ps ax | grep linknx
    13277 ?        S      0:00 grep linknx
    Und hier nach einem reboot
    Code:
    /var/log$ ps ax | grep linknx
     2212 ?        Ss     0:05 /usr/local/bin/linknx -c/var/lib/linknx/linknx.xml -p /var/run/linknx.pid -d/var/log/linknx.log -w
     2896 ?        S      0:00 grep linknx
    Ich schaue dann mal wie es in 8 Std. wieder aussieht.

    Gruß
    Michi

    Einen Kommentar schreiben:


  • toggle
    antwortet
    Was bedeutet "bleibt stehen"? Ist der Prozess noch vorhanden und reagiert auf keine Aktionen mehr oder verabschiedet er sich nach 6 Stunden? Was machst du, wenn linknx stehen bleibt?

    Möglicherweise gibt es einen Deadlock im 1-Wire Treiber.

    Einen Kommentar schreiben:


  • panzaeron
    antwortet
    Hallo Michi,

    du könntest zum Testen noch am Beginn und Ende des Shell-Skripts eine Ausgabe in eine zweite Log-Datei machen. Dann siehsteht du ob sich das Skript aufhängt. Zusätzlich kannst du noch in linknx.xml den Loglevel auf Debug setzen vielleicht sieht man denn mehr. Ansonsten fällt mir nichts auf

    Einen Kommentar schreiben:


  • Michixx
    antwortet
    Linknx bleibt stehen

    Hallo zusammen,

    ich weiß jetzt nicht mehr weiter.
    Leider bleibt mein Linknx ca. alle 6 Std. stehen, das war früher auch schon so, allerdings erst alle 2,5 Tage, keine Ahnung warum.

    Jetzt ist mir aufgefallen, je mehr 1-Wire Sensoren ich anschließe desto früher bleibt Linknx stehen.
    In dem Logfile steht dann natürlich auch nicht mehr warum.

    Als OS benutze ich Debian auf einem Raspberry , mit eibd und der CometVisu.
    Der eibd und die CometVisu laufen weiter, auch wenn Linknx stehen geblieben ist.
    Die 1-Wire Sensoren sind über einen 1-Wire USB Adapter DS9490R angeschlossen.
    Linkx schreibt mir die Temperaturwerte eigentlich nur auf den Bus, bzw. von der Außentemperatur (Siemens Kombisensor) und vom RTR im Wohnzimmer in ein rrd.

    Meine linknx.xlm und die linknx.log habe ich angehängt.
    Als Beispiel das bash script vom Arbeitszimmer, das sieht so bei den anderen Sensoren entsprechend equivalent aus.
    Code:
    #!/bin/bash
    cd /home/rrdtool
    # Read temperature from sensor Arbeitszimmer
    tempread=`cat /mnt/1wire/28.B3B100040000/temperature`
     
    OBJECTID="Arbeitszimmer_Temperatur"
    printf '<write><object id="%s" value=%s /></write>\4' "$OBJECTID" "$tempread" | netcat localhost 1028 > /dev/null 2>&1
    Vielleicht kann mir da einer von Euch etwas helfen.

    Gruß
    Michi
    Angehängte Dateien

    Einen Kommentar schreiben:


  • johnnychicago
    antwortet
    Zeit vergleichen

    Hallo --

    Ich wollte einige meiner Rules etwas flexibler gestalten und Zeiten vergleichen. Eigentlich dachte ich, sowas sollte funktionieren:
    Code:
    <condition type="object" id="test.time_now" op="lt" value="22:00:00" />
    oder so was:
    Code:
    <action type="set-value" id="test.timeset" value="22:00:00" />
    Tut es aber anscheinend nicht. Was mache ich denn bei der Syntax falsch?

    Ich hab's auch mit hour="22" min="0" probiert, tat's aber auch nicht.

    Kann mich jemand da mal dezent anschubsen, bitte?

    Einen Kommentar schreiben:


  • lordhelmchench
    antwortet
    Hallo Zusammen

    Ich kann hier leider noch nicht viel zu betragen, da meine Installation erst in ca. 2 Monaten zum fliegen kommt, aber ich wollte mich einmal für diesen Thread bedanken und das geteilte Wissen bedanken (Wie auch sonst in dem Forum, aber dieser Thread ist für mich sehr nützlich). Ich habe hier viel gelernt und bin gespannt, was dann in der Realität dann alles funktioniert... :-)

    Gruss und schönen Abend
    Stef

    Einen Kommentar schreiben:


  • johnnychicago
    antwortet
    Zitat von toggle Beitrag anzeigen
    Wie erwähnt, solange man den Zustand der Dunstabzugshaube nicht ermitteln kann, kann es Störungen bzw. Diskrepanzen zwischen Sollwert und Istwert geben. Z.B. wenn eine simulierte Betätigung nicht angenommen wurde oder wenn jemand die Tasten manuel betätigt.
    Prinzipiell schon, wenn man allerdings richtig zählt und die Fernbedienung der Haube versteckt, sollte das funktionieren.

    Meine Haube geht bei Spannungsverlust auf aus, somit kann ich sie bei Bedarf nullen.

    Folgenden Ansatz habe ich jetzt mal:

    Code:
          <object type="5.xxx" id="andere.haube.haube_stufe_ist" gad="3/6/0" log="true" init="persist">Haube Stufe Ist</object>
          <object type="5.xxx" id="andere.haube.haube_stufe_soll" gad="3/6/1" log="true" init="persist">Haube Stufe Soll</object>
          <object type="1.001" id="andere.haube.haube_taster_plus" gad="3/6/2" log="true" init="persist">Haube Taster Plus</object>
          <object type="1.001" id="andere.haube.haube_taster_minus" gad="3/6/3" log="true" init="persist">Haube Taster Minus</object>
    
    <rule id="haube_plus">
      <condition type="and">
        <condition type="or">
          <condition type="object" id="andere.haube.haube_stufe_ist" trigger="true" />
          <condition type="object" id="andere.haube.haube_stufe_soll" trigger="true" />
        </condition>
        <condition type="object-compare" id="andere.haube.haube_stufe_soll" id2="andere.haube.haube_stufe_ist" op="gt" />
      </condition>
      <actionlist type="if-true">
        <action type="set-value" id="andere.haube.haube_taster_plus" value="on" />
        <action type="set-value" id="andere.haube.haube_taster_plus" value="off" delay="200ms" />
        <action type="formula" id="andere.haube.haube_stufe_ist" x="andere.haube.haube_stufe_ist" c="1" delay="400ms" />
      </actionlist>
    </rule>
    
    <rule id="haube_minus">
      <condition type="and">
        <condition type="or">
          <condition type="object" id="andere.haube.haube_stufe_ist" trigger="true" />
          <condition type="object" id="andere.haube.haube_stufe_soll" trigger="true" />
        </condition>
        <condition type="object-compare" id="andere.haube.haube_stufe_soll" id2="andere.haube.haube_stufe_ist" op="lt" />
      </condition>
      <actionlist type="if-true">
        <action type="set-value" id="andere.haube.haube_taster_minus" value="on" />
        <action type="set-value" id="andere.haube.haube_taster_minus" value="off" delay="200ms" />
        <action type="formula" id="andere.haube.haube_stufe_ist" x="andere.haube.haube_stufe_ist" c="-1" delay="400ms" />
      </actionlist>
    </rule>
    Auf der Kommandozeile geht das schon mal, ich bau jetzt noch Rules, um die Taster und LED's zu mappen und programmier das mal in die Komponenten.

    Einen Kommentar schreiben:

Lädt...
X