Problem mit Plots, Addlog und Trigger

Begonnen von roedert, 29 Oktober 2013, 08:49:07

Vorheriges Thema - Nächstes Thema

roedert

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.

betateilchen

hast Du mal versucht, im Plot anstatt mit "line" mit steps zu arbeiten? Da gibts drei verschiedene.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

roedert

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.

UliM

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
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

roedert

#4
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"  ;)

UliM

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
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

roedert

#6
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?

UliM

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-)
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

roedert

#8
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


roedert

...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.... >:(

UliM

Moin,
hab grad das neue FHEMWEB-Attribut endPlotNow gesehen - vielleicht ist das ja eine (einfachere) Alternative für Dich.

=8-)
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

Benne

#11
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!

marvin78

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).

Benne

ok danke. War aber nur ne Kleinigkeit:

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

gero

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
Odroid C1 - CULV3-868, JeeLink
16 x TX 29 DTH
MAX!: 15x Heizkörperthermostat+, 2x Wandthermostat, 14x Fenserkontakt, 1x Ecotaster
FS20 S4A, FS20IRF, BSB-Heizungssteuerung über Atmega2560
Z-Wave: ZME_UZB1, Fibaro Wall Plug + Motion Sensor