fronthem + Plots + status.log für smartVISU 2.9

Begonnen von raman, 03 April 2018, 20:36:21

Vorheriges Thema - Nächstes Thema

raman

Hallo miteinander,

nachdem sich auf der smartVISU-Seite einiges getan hat, der io_fhem-Treiber angepasst wurde
und die Diskussion mal wieder aufkam fronthem um neue Features zu erweitern, habe ich mich
mal durch den Hash- und Arraydschungel gekämpft. Eigentlich habe ich ein angepasstes fronthem,
das mir Plotdaten an smartVISU liefert schon seit längerem im Einsatz. Ich habe das Ganze nochmal
überarbeitet und stelle es jetzt mal zum Testen zur Verfügung. Man kann sicher noch mehr Zeit
aufwenden und den Code performanter gestalten.
Den smartVISU-Treiber musste ich leicht motifizieren, um die neuen Daten für Log und Plot verarbeiten
zu können. Die alten Funktionen sollten durch die Änderungen nicht beeinträchtigt worden sein.

Nicht unbedingt gleich für den Produktiveinsatz verwenden!

Zum Testen hier also eine überarbeitete Version von fronthem mit Funktionalität für die Abfrage
von Plot-Daten aus der FHEM-Datenbank über DbLog oder mit eingeschränktem Umfang aus FileLog.


Für die Anpassung wurden folgende Dateien überarbeitet und sind in der angehängten zip-Datei
zu finden:

  • 01_fronthem.pm
  • 31_fronthemDevice.pm
  • 99_fronthemUtils.pm
  • fronthemEditor.js
und

  • io_fhem.js (smartVISU-Treiber)

Es gibt zwei neue Modi log und plot im Item Editor (formerly known as GAD Editor).
Weiterhin sind in der 99_fronthemUtils.pm drei neu Converter, Log für status.log,
Plot für die Abfrage über DbLog und Plotfile für die Abfrage über FileLog enthalten
und werden im Editor zur Verfügung gestellt.

Für Plot muss im Editor unter converter als Argument der Name des DbLog Device mitgegeben werden!

Wenn ein Item "PlotTest.0" in smartVISU existiert und "desired-temp" aus "myDbLog" ausgelesen werden soll:

Einstellungen Item-Editor:
Item: PlotTest.0
mode: plot
device: HM_3C92F7_Climate
reading: desired-temp
converter: Plot myDbLog

Für Plotfile muss im Editor unter converter als Argument der Name der FileLog-Datei mitgegeben werden,
in die für das entsprechende Device die Daten geschrieben werden!

Wenn der Eintrag im FileLog so aussieht (state wird geloggt) und ein Item "PlotTest.0" in smartVISU existiert:
2018-04-01_00:03:27 heizung_verbraucherkreis_temp_vl 25.10

Einstellungen Item-Editor:
Item: PlotTest.0
mode: plot
device: heizung_verbraucherkreis_temp_vl
reading: state
converter: Plotfile FileLog_ heizung_verbraucherkreis_temp_vl

Wenn der Eintrag im FileLog so aussieht und ein Item "PlotTest.0" in smartVISU existiert:
2018-04-03_11:16:35 HM_3C92F7_Climate desired-temp: 18.0

Einstellungen Item-Editor:
Item: PlotTest.0
mode: plot
device: HM_3C92F7_Climate
reading: desired-temp
converter: Plotfile FileLog_HM_3C92F7_Climate

Wenn der Eintrag im FileLog so aussieht und ein Item "PlotTest.1" in smartVISU existiert:
2018-04-03_21:18:11 Temperature_Bathroom values: T: 19.4 H: 52

Einstellungen Item-Editor, wenn man die Temperatur als Plot will:
Item: PlotTest.1
mode: plot
device: Temperature_Bathroom
reading: values
converter: Plotfile FileLog_Temperature_Bathroom 5 T

(Der Wert für die Temperatur befindet sich von links ausgehend in der 5 Spalte.)

Einstellungen Item-Editor, wenn man die Luftfeuchte als Plot will:
Im Item-Editor:
Item: PlotTest.1
mode: plot
device: Temperature_Bathroom
reading: values
converter: Plotfile FileLog_Temperature_Bathroom 7 H

(Der Wert für die Luftfeuchte befindet sich von links ausgehend in der 7 Spalte.)

Unter Verwendung von DbLog und Plot sollte man alle Modi der smartVISU-Plots ('avg', 'sum', 'min', 'max', 'minmax',
'minmaxavg' oder 'raw') nutzen können. Aber nur für 'raw' werden z.Zt. point-Updates "geliefert"!
FileLog in Verbindung mit Plotfile liefert nur Daten für Serien, also keine Durchschnitts-, Min-, Maxwerte, ...


Um status.log von smartVISU mit FHEM nutzen zu können, sind einige Vorarbeiten nötig!

Die Readings werden pro "Readings-Gruppe" in einem Dummy-Device gesammelt. Dieses wird
automatisch angelegt. Das so erzeugte Dummy-Device muss dann im Editor mit dem
status.log-Item verknüpft werden. (converter ist Log)

1. Notify erstellen:
define Log notify .* { Log_SetList($NAME,$EVENT) }

2. Folgende Attribute in attr global userattr hinzufügen:

    svEvents svReadins svRegex
   
3. Einstellungen vornehmen (Attribute bei zu überwachenden Devices setzen):

    svReadins: Für das Device das Reading setzen, das überwacht werden soll (z.B. state überwachen):

attr <device> svReadins state

Wenn state und battery überwacht und battery in Batterie geändert werden soll:

attr <device> svReadins state battery:Batterie


Zur Übersicht der überwachten Devices kann eine readingsGroup angelegt werden:
define rg_svLog readingsGroup <Name>,<svReadings> .*:?svLog,?
attr rg_svLog nameStyle style="color:red;font-weight:bold"


    svEvents:  Wird automatisch für das Dummy-Device (Log-Liste) angelegt, kann aber an die jeweiligen Bedürdnisse angepasst werden.
   
    svRegex:   Hier kann für das Dummy-Device (Log-Liste) eine Liste mit Events, die ersetzt werden sollen, angegeben werden.
    z.B.
attr <device> svRegex low:schwach opened:geöffnet closed:geschlossen connected:verbunden disconnected:getrennt


Gruß
R.

HCS

Das ist ja mal cool.

Basierend auf welcher Treiber-Version vom mir hast Du die Anpassungen gemacht?
Ich könnte das dann übernehmen.

HCS

Habe den Treiber übernommen.
Läuft noch wie gehabt.
Soll ich es als pull request nach SV schicken?


raman

Das ist dein Treiber aus der aktuellen smartvisu-develop mit meinen Veränderungen und den Optimierungen, die smai hier vorgeschlagen hat:
https://forum.fhem.de/index.php/topic,85423.msg789034.html#msg789034

Also teste mal lieber, ob für die Addon-Funktionen noch alles geht!

Ich habe  für handleReceivedData: case plot und case log ergänzt.
Alle Plot-Daten, die von fronthem kommen, werden mit dem "cmd": "plot" geliefert, um sie von den Serien aus dem Addon-Treiber zu unterscheiden.
Für die Logs hat sich erst nach einem "Umbau" fronthem ergeben, dass sie eigentlich wie ein ankommendes item verarbeitet werden können.
Deswegen die aufgeteilte Behandlung.

Beim Spliten der items und für monitor habe ich die Infos für die Plots, die an fronthem übergeben werden, entsprechend angepasst.

Gestet habe ich mit der aktuellsten smartvisu-develop von heute.

herrmannj

darf ich auch übernehmen, bzw wenn Du magst kannst Du das auch pushen. Weil Du geschrieben hast "nicht unbedingt produktiv", wir können ja einen dev zweig machen.

danke vg
joerg

raman

Kannst du gerne machen!
Oder wir warten evtl. noch mal ein bisschen ab, bis mal ein paar Leute getestet haben.
Die Entscheidung überlasse ich dir!

raman

#6
Ein dev-Zweig für fronthem wäre denke ich ganz sinnvoll!

Ich weiss ja nicht, ob es auf allen Systemen problemlos läuft.
Eventuell ist die Abfrage der Plots auf schwachen Systemen zu langsam.

Bei mir läuft FHEM halt auf einem NUC.

HCS

Zitat von: raman am 03 April 2018, 22:44:09
Also teste mal lieber, ob für die Addon-Funktionen noch alles geht!
Ja, geht noch alles.

Hast Du das zip in post #1 gerade nochmal erneuert?

Alles was ich hatte funktioniert noch wie gehabt.
Nur habe ich es nicht hinbekommen, einen plot aus einem filelog zu bekommen.

ich habe ein FileLog
Internals:
   DEF        ./log/Temperature_Bathroom-%Y.log Temperature_Bathroom:values.*
   NAME       FileLog_Temperature_Bathroom
   NOTIFYDEV  Temperature_Bathroom
   NR         118
   NTFY_ORDER 50-FileLog_Temperature_Bathroom
   REGEXP     Temperature_Bathroom:values.*
   STATE      active
   TYPE       FileLog
   currentlogfile ./log/Temperature_Bathroom-2018.log
   logfile    ./log/Temperature_Bathroom-%Y.log
   READINGS:
     2018-04-03 21:58:36   linesInTheFile  26214
   pos:
Attributes:
   logtype    text


Mit (halt etwas mehr) so einem Inhalt

      2018-04-03_21:18:11 Temperature_Bathroom values: T: 19.4 H: 52
      2018-04-03_21:23:11 Temperature_Bathroom values: T: 19.4 H: 52
      2018-04-03_21:28:21 Temperature_Bathroom values: T: 19.4 H: 52
      2018-04-03_21:33:21 Temperature_Bathroom values: T: 19.4 H: 52
      2018-04-03_21:38:21 Temperature_Bathroom values: T: 19.4 H: 52.3
      2018-04-03_21:43:31 Temperature_Bathroom values: T: 19.4 H: 53
      2018-04-03_21:48:31 Temperature_Bathroom values: T: 19.4 H: 53
      2018-04-03_21:53:36 Temperature_Bathroom values: T: 19.5 H: 53
      2018-04-03_21:58:36 Temperature_Bathroom values: T: 19.6 H: 53
      2018-04-03_22:03:41 Temperature_Bathroom values: T: 19.6 H: 53
      2018-04-03_22:08:41 Temperature_Bathroom values: T: 19.6 H: 54
      2018-04-03_22:13:51 Temperature_Bathroom values: T: 19.7 H: 55
      2018-04-03_22:18:51 Temperature_Bathroom values: T: 19.8 H: 54.8
      2018-04-03_22:23:51 Temperature_Bathroom values: T: 19.8 H: 55
      2018-04-03_22:28:56 Temperature_Bathroom values: T: 19.8 H: 54


Das plot widget so definiert:

  <div class="block">
    <div class="set-2" data-role="collapsible-set" data-theme="c" data-content-theme="a" data-mini="true">
      <div data-role="collapsible" data-collapsed="false" >
        <h3>plot.period</h3>
        <div class="hcs-test">
          {{ plot.period( "id.PlotTest.1",
            ["PlotTest.1"],
            raw,
            "3d",
            "0d",
            0,
            30,
            100,
            ["Bad"],
            ["#0000FF"],
            ["line"]) }}
        </div>
      </div>
    </div>
  </div>


Im Item-Editor:
Item: PlotTest.1
mode: plot
device: FileLog_Temperature_Bathroom
reading: linesInTheFile
converter: Plotfile FileLog_Temperature_Bathroom

ergebnis siehe Anhang

raman

#8
Du musst unter device das device angeben, von dem die Daten stammen.
Bei dir denke ich Temperature_Bathroom

Ich habe nur noch was in der 99_fronthemUtils.pm für UZSU geändert. Deswegen das Update.

Edit:
Mir fällt grad auf, dass bei mir der FileLog anders ausschaut

2018-04-03_11:16:35 HM_3C92F7_Climate desired-temp: 18.0
2018-04-03_11:16:35 HM_3C92F7_Climate humidity: 57
2018-04-03_11:16:35 HM_3C92F7_Climate measured-temp: 19.3


Wenn die Form so ist, funktioniert meine Abfragemethode nicht. Da bräuchte man ne Regex.

2018-04-03_21:18:11 Temperature_Bathroom values: T: 19.4 H: 52


Man kann aber dem Converter weitere Werte übergeben. Die Position (Standard ist 4), wo gesucht werden soll und einen String für die Regex
(Aufruf ist wie in der Commandref für FileLog)
converter: Plotfile Temperature_Bathroom <column> <regex>

herrmannj


raman

Ich habe die FileLog-Funktion überarbeitet und hoffe es funktiniert jetzt!

Es reicht die 31_fronthemDevice.pm und 99_fronthemUtils.pm auszutaschen.

Wie die Einstellungen vorzunehmen sind steht im ersten Beitrag!

HCS

Super, funktioniert.

Habe meine komplette Abhandlung, die ich gerade abschicken wollte, bezüglich des get auf das logfile, wie das konstruiert wird und wie es für den Fall konstruiert werden müsste, in die Tonne geworfen.  :)

Mit dieser Version funtioniert beides.

Der linke plot bekommt seine Daten von so einem log
2018-04-04_12:38:01 Temperature_Bathroom values: T: 20.3 H: 64
2018-04-04_12:43:16 Temperature_Bathroom values: T: 20.3 H: 63
2018-04-04_12:48:36 Temperature_Bathroom values: T: 20.3 H: 63
2018-04-04_12:53:56 Temperature_Bathroom values: T: 20.3 H: 63
2018-04-04_12:59:16 Temperature_Bathroom values: T: 20.3 H: 63
2018-04-04_13:04:36 Temperature_Bathroom values: T: 20.3 H: 63
2018-04-04_13:09:56 Temperature_Bathroom values: T: 20.3 H: 63
2018-04-04_13:15:16 Temperature_Bathroom values: T: 20.3 H: 63
2018-04-04_13:20:41 Temperature_Bathroom values: T: 20.3 H: 62.8
2018-04-04_13:25:56 Temperature_Bathroom values: T: 20.3 H: 63
2018-04-04_13:31:16 Temperature_Bathroom values: T: 20.3 H: 62.3
2018-04-04_13:36:36 Temperature_Bathroom values: T: 20.2 H: 62
2018-04-04_13:41:56 Temperature_Bathroom values: T: 20.2 H: 62
2018-04-04_13:47:16 Temperature_Bathroom values: T: 20.2 H: 62
2018-04-04_13:52:36 Temperature_Bathroom values: T: 20.2 H: 62


Der rechte plot bekommt seine Daten von so einem log
2018-04-04_13:34:17 LevelBarnEast temperature: 22
2018-04-04_13:34:17 LevelBarnEast voltage: 5.6
2018-04-04_13:39:48 LevelBarnEast distance: 115
2018-04-04_13:39:48 LevelBarnEast level: 25
2018-04-04_13:39:48 LevelBarnEast liters: 253
2018-04-04_13:39:48 LevelBarnEast temperature: 22
2018-04-04_13:39:48 LevelBarnEast voltage: 5.6
2018-04-04_13:45:19 LevelBarnEast distance: 114
2018-04-04_13:45:19 LevelBarnEast level: 26
2018-04-04_13:45:19 LevelBarnEast liters: 255
2018-04-04_13:45:19 LevelBarnEast temperature: 21.5
2018-04-04_13:45:19 LevelBarnEast voltage: 5.6



Das ist echt super, wie einfach man die plots damit an den Start bekommt  8)

Werde mal einige einbauen und beobachten, wie es sich verhält.


cruser1800

#12
Wow!

Habe es auch gerade probiert und hat auf anhieb geklappt!

Große KLasse! Danke

cruser1800

#13
Ein Frage habe ich noch!

Ich benutze dblog und plot.period.

Nach meinem empfinden werden hier nur max 1 Wert pro Stunde angezeigt, obwohl ich den Wert für 'count' auf 100 festgelegt habe. Ist das So oder habe ich eine Einstellung falsch? Einstellung des Zeitbereiches auf 1 Tag.

Ich habe mal parrallel ein Filelog mitlaufen lassen. Hier kommen alle Daten rüber. Nur bei dblog nur eine begrenzte Anzahl je nach eingestelltem Zeitbereich für die x-Achse!

Danke

blue

Hallo raman,

ich bin neu im Forum und dabei mein FHEM mit SV Stück für Stück aufzusetzen. Dein Beitrag kam mir wie gerufen, da ich mich gerade an die Plots in SV machen wollte. Deinen Code habe ich installiert: Er läuft einwandfrei, auf Anhieb und ohne jegliche Schwierigkeiten. status.log habe ich allerdings (noch) nicht ausprobiert. Ich habe hier einen Raspberry 3 am Laufen und nutze aktuell nur FileLogs. Ich finde die Geschwindigkeit übrigens voll und ganz in Ordnung, wobei das sicherlich von der Größe der Logfiles abhängt (bei mir sind es zur Zeit ca. 6000 Zeilen).

Einziger kleiner Punkt war, dass ich ein wenig hantierten musste, bis ich die Syntax für Logfiles heraus hatte, in denen nur das state-Reading in der 3. Spalte geloggt wird. In diesem Fall muss das Feld reading freibleiben, was mich irritierte, weil ich mit "state" gerechnet hätte.

2018-04-01_00:03:27 heizung_verbraucherkreis_temp_vl 25.10

Ansonsten großes Lob und Dankeschön meinerseits! - Sollte mir noch mehr auffallen, werde ich mich melden.