FHEM Forum

FHEM => Frontends => SVG / Plots / logProxy => Thema gestartet von: roedert am 29 Oktober 2013, 08:49:07

Titel: Problem mit Plots, Addlog und Trigger
Beitrag von: roedert am 29 Oktober 2013, 08:49:07
Wenn ich eine Grafik (SVG-Plot) von einem Gerät erstellen lassen welche sticht periodisch Daten liefert, ist der Plot leider beim letzten Messwert zu Ende - und wird nicht mit diesem Wert bis zum aktuellen Zeitpunkt weitergezeichnet.
Die irgendwie in der Plot-Definition zu ändern ist glaube ich nicht machbar, bzw. ich habe dazu nichts gefunden.

Als Workaround wurde hier mal die Funktion AddLog gepostet. diese Funktion wird periodisch aufgerufen und schreibt den aktuellen Wert ins Log (inhaltlich der Befehl trigger $logdevice $logentry). Somit wird der Plot auch komplett gezeichnet - zumindest bis zum letzten Logeintrag, der ja nun relativ aktuell ist.

Nachteil ist jedoch auch, dass permanent die Trigger ausgelöst werden, die auf dem Device liegen.

Ich suche also eine Lösung um
  a) im Plot den letzten Messwert (egal wie alt) bis zum aktuellen Zeitpunkt weiterzuzeichnen (Messwert ist dumm ausgedrückt, Sinn macht sowas  ja nur beim Plot von Geräten mit zb ein und aus als Zustand)
     oder
  b) die aktuellen Werte der betroffenen Geräte periodisch ins Log zu schreiben (in meinem Fall DBlog) ohne entsprechende Aktionen wie Trigger oder Notify's erneut auszulösen.
Titel: Antw:Problem mit Plots, Addlog und Trigger
Beitrag von: betateilchen am 29 Oktober 2013, 09:45:27
hast Du mal versucht, im Plot anstatt mit "line" mit steps zu arbeiten? Da gibts drei verschiedene.
Titel: Antw:Problem mit Plots, Addlog und Trigger
Beitrag von: roedert am 29 Oktober 2013, 10:05:25
Ja klar. Für das Anzeigen von on/off-Zuständen ist steps das richtige, und das nutze ich auch bereits.

Trotzdem hört der Plot beim letzten Messwert bzw. Logeintrag auf.
Titel: Antw:Problem mit Plots, Addlog und Trigger
Beitrag von: UliM am 29 Oktober 2013, 21:50:34
Hi,
naiver Ansatz: Die Bedingung der notifies so anpassen, dass sie nicht ziehen, wenn das Stichwort addlog im event auftaucht..

define abc notify device:((?!AddLog).)* doFhemStuff

oder so :)

Gruss, Uli
Titel: Antw:Problem mit Plots, Addlog und Trigger
Beitrag von: roedert am 29 Oktober 2013, 22:17:38
AddLog ist einer Benutzerfunktion (in 99_Utils) aus dem Wiki (http://www.fhemwiki.de/wiki/Plot-Abriss_vermeiden) und die wie gesagt als Command "trigger $logdevice $logentry" ausführt und somit den gewünschten Logeintrag hervorruft.
Ich wüsste nicht wie ich dies im definierten trigger herausfiltern sollte.

Das Auslösen der notifys bzw. Trigger ist im Wiki ja auch unter Nebeneffekte beschrieben. Ich brauche also ein Addlog ohne "Nebeneffekte"  ;)
Titel: Antw:Problem mit Plots, Addlog und Trigger
Beitrag von: UliM am 29 Oktober 2013, 22:22:30
Hi,
den trigger (addlog, siehe auch wiki http://www.fhemwiki.de/wiki/Plot-Abriss_vermeiden ) so benutzen wie's da steht.

Ich hab verstanden, dass Du nicht willst, dass abhängige notifies ziehen - Lösungsansatz siehe oben.

Was Du mit weiteren triggern meinst, verstehe ich nicht.

Gruß, Uli
Titel: Antw:Problem mit Plots, Addlog und Trigger
Beitrag von: roedert am 29 Oktober 2013, 22:24:30
sorry .... ich meinte watchdog, nicht trigger  ;D

Trigger ist ja nur das Command im Addlog. Tschuldigung für die Verwirrung.

Konkretes (vereinfachtes) Beispiel:
Der TV hängt an einem FS20-Funkschalter. Im Log kommen natürlich nur Einträge wenn ich die Taste an der Fernbedienung drücke um den Funkschalter zu schalten. Deshalb Addlog alle 10 min - damit ich eine schönen durchgehenden Plot zeichnen kann, der nicht beim letzten Ein- bzw. Ausschalten aufhört.

Auf diesen Funkschalter ist ein watchdog gelegt, der 5min nach TV aus auch das Licht ausmacht ... dieser wird nun jedoch bei jedem Addlog erneut ausgelöst.

define Lichtaus watchdog TV:off 00:05:00 TV:on

Würde das denn so funktionieren? 

define Lichtaus watchdog TV:((?!AddLog).)off 00:05:00 TV:((?!AddLog).)on

Wird "Addlog" denn im Event übergeben?
Titel: Antw:Problem mit Plots, Addlog und Trigger
Beitrag von: UliM am 30 Oktober 2013, 06:52:04
Hi,
habe (zumindest bei mir) die Einträge, die durch addlog getriggert werden, mit dem appendix <<<addLog versehen. So hatte ich das glaub ich auch ins Wiki gestellt.
D.h. jedes von addlog erzeugte event hat diesen appendix, auf den kann man filtern.

Die regexp musst Du etwas anpassen, denn im event kommterst das on und am Ende der Text addlog (Gross/Klein beachten!)

Ob das so funktioniert kannst Du ja testen :)

=8-)
Titel: Antw:Problem mit Plots, Addlog und Trigger
Beitrag von: roedert am 30 Oktober 2013, 10:32:58
Dank dir erstmal für deine Unterstützung  :)

Das Appendix "<<< AddLog" hatte ich nicht in der Funktion mit drin ... hab es wohl aus einer der ersten Versionen übernommen als es das noch nicht gab.
Es funktioniert jetzt wie gewünscht, die Plots können die Einträge weiterhin lesen und der Watchdog löst bei den Addlog-Einträgen nicht mehr aus.

Jedoch gibt es eine Warnung im Log beim Aufruf der Plots für numerische Werte (Temperatur zb):
Argument "12.0   << addLog" isn't numeric in sprintf at /opt/fhem/FHEM/98_SVG.pm line 962.

Hier müsste ich also in der Plotdefinition das "<<< addlog" am Ende wieder rausfiltern.
Aktuell ist als Datenquelle nur angegeben Arbeitszimmer.Thermostat:temperature:0: ... hast du da noch einen Ansatz für?

Die Grundlagen für diesen Ausdruck sind ja hier beschrieben http://fhem.de/commandref_DE.html#DbLog ... aber gibt es irgendwo eine genauere Beschreibung wo man zB diesen Syntax verstehen kann so dass man ihn entsprechend abändern kann: MyFS20:data:::$val=~s/(on|off).*/$1eq"on"?1:0/eg

Titel: Antw:Problem mit Plots, Addlog und Trigger
Beitrag von: roedert am 30 Oktober 2013, 13:21:18
...nach einigem Probieren hab ich eine funktionierende Lösung:
     $val=~s/^([-\.\d]+).*/$1/eg
liefert mit nur die Zahl am Anfang des Strings und entfernt das "<<< AddLog" wieder.

Diese Perl-RegExp's werde ich wohl nie komplett verstehen.... >:(
Titel: Antw:Problem mit Plots, Addlog und Trigger
Beitrag von: UliM am 31 Oktober 2013, 07:15:57
Moin,
hab grad das neue FHEMWEB-Attribut endPlotNow gesehen - vielleicht ist das ja eine (einfachere) Alternative für Dich.

=8-)
Titel: Antw:Problem mit Plots, Addlog und Trigger
Beitrag von: Benne am 16 November 2015, 17:24:26
hallo!
Für mich ist das Thema wieder aktuell, da das notify jetzt alles 15 Minuten getriggert wird.

Ich habe addLog zu RESIDENTS hinzugefügt:

define zuhause_actuator1 at +*00:15 {addLog("zuhause","presence")}

Immer wenn sich "presence" ändert soll RadiatorUpdate() aufgerufen werden - aber eben nicht bei addLog Einträgen.

define ThermostatUpdate notify zuhause:presence.* {RadiatorUpdate();;}\

Kann mir jemand einen Tipp geben wie ich den regulären Ausdruck einbinden muss? Danke!
Titel: Antw:Problem mit Plots, Addlog und Trigger
Beitrag von: marvin78 am 16 November 2015, 18:10:40
Bitte verwende Code-Tags. Das kann man kaum lesen.

Wenn du über addLog das Reading presence Triggerst und auch auf den Trigger presence reagieren möchtest, dann musst du dich mit event-on-change-reading, event-min-interval auseinander setzen (commandref).
Titel: Antw:Problem mit Plots, Addlog und Trigger
Beitrag von: Benne am 16 November 2015, 19:31:57
ok danke. War aber nur ne Kleinigkeit:

define ThermostatUpdate notify zuhause:presence((?!addLog).)* {RadiatorUpdate();;}\
Titel: Antw:Problem mit Plots, Addlog und Trigger
Beitrag von: gero am 16 November 2015, 21:21:26
Für alle, die DbLog verwenden, gibt es auch eine Möglichkeit ohne trigger auszukommen:


sub addDbLog($$) {
my ($dev,$reading) = @_;
my $dbLogDevice = 'myDbLog';
   
if ( $defs{$dev} ) {
if ( defined $defs{$dev}->{READINGS}->{$reading} ) {
my $sqlValues = "'".TimeNow()."','"
                            .$dev."','"
                            .uc($defs{$dev}->{TYPE})
                            ."','".(($reading eq 'state') ? '' : $reading.": ").$defs{$dev}->{READINGS}->{$reading}->{VAL}."','"
                            .$reading."','"
                            .$defs{$dev}->{READINGS}->{$reading}->{VAL}."',''";
CommandSet(undef, $dbLogDevice.' userCommand INSERT INTO HISTORY VALUES ('.$sqlValues.');');
}else { Log 1, "addDbLog(): Reading '$reading' not found on device '$dev'"; }
}else { Log 1, "addDbLog(): Device '$dev' is not defined"; }
}


Der Name des Log Devices muss natürlich angepasst werden.
(Dieser Code stammt nicht von mir, sondern aus diesem Forum)

Um das ganze addLog Handling für mich zu vereinfachen, habe ich ein userAttr addLog zu global hinzugefügt. Damit kann ich bei jedem Device eine Liste von Readings im Attribut addLog hinterlegen.
Folgende Funktion wird dann per notify kurz vor und kurz nach Mitternacht aufgerufen:

sub
addLogAll() {
foreach my $dev (keys %defs) {
    #Log3 undef, 1,"dev: $defs{$dev}{NAME}";
        my $name=$defs{$dev}{NAME};
        next if(AttrVal($name,"disable",0)==1 || !defined(AttrVal($name,"addLog",undef)));
        foreach my $reading (keys %{$defs{$dev}{READINGS}}){
          my @readings = split(" ", AttrVal($name,"addLog",undef));
          if(grep( /^$reading$/, @readings )){
          #if( $reading ~~ @readings ){
            Log3 undef, 4,"addLog $dev reading: $reading";
            addDbLog($dev,$reading);
          }
        }       
    }
}


Gruß,
Gero
Titel: Antw:Problem mit Plots, Addlog und Trigger
Beitrag von: Hilde25 am 22 Februar 2016, 22:02:44
Hallo Gero,

ich würde gerne deine Variante nutzen, habe dem entsprechend alles eingegeben in die myUtils.
Bei entsprechenden Device habe ich addLog in den Readings definiert.

Leider kommt bei mir nur im Log folgendes :

a_addLogAll: Please define addLogAll first

Sub ist aber gemäß deinem Code angegeben.

Kannst du vielleicht noch angeben wie du genau die Reading definiert hast, und wie du das notify aufrufst ?

Besten Dank.

Frank

Titel: Antw:Problem mit Plots, Addlog und Trigger
Beitrag von: gero am 24 Februar 2016, 07:35:22
Hallo Frank,

hier noch ein paar Infos, die dir hoffentlich weiterhelfen:

Um für jedes Device das Attribut addLog zur Verfügung zu haben, muß es im device global als userattr hinzugefügt werden:

attr global userattr DbLogExclude DbLogInclude HeatingThermostatPlus HeatingThermostatPlus_map Klima Klima_map addLog ...

Damit läßt sich für jedes Device angeben, welche Readings geloggt werden sollen. Z.B.:

attr ecostate addLog state


Kurz vor und kurz nach Mitternacht wird die Funktion addLogAll getriggert:

define addlog_startday.at at *00:01 {addLogAll()}
define addlog_endday.at at *23:59 {addLogAll()}

Ich habe in meinem letzten Post notify geschrieben. Das ist natürlich falsch, Sorry.

Gruß,
Gero
Titel: Antw:Problem mit Plots, Addlog und Trigger
Beitrag von: harryman am 10 Februar 2017, 21:25:34
Super Lösung, aber eine Anmerkung habe ich noch.
Bei mir ging es nicht auf Anhieb.
CommandSet(undef, $dbLogDevice.' userCommand INSERT INTO HISTORY VALUES ('.$sqlValues.');');
musste heißen
CommandSet(undef, $dbLogDevice.' userCommand INSERT INTO history VALUES ('.$sqlValues.');');

==> Linux, mySQL => Tablename = case sensitive

Gruß Harry