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

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

Vorheriges Thema - Nächstes Thema

basman21

#105
Hallo,

wir kommen bei einem Thema im folgenden Thread nicht weiter: https://forum.fhem.de/index.php/topic,120711.15.html
Fehler ist bei meinem Update auf 3.0.1 aufgetaucht. In der GAD Liste erscheinen die Plot Variablen nicht und Plot lässt sich nicht auswählen bzw. springt das Feld immer wieder auf Item zurück. Das Verhalten mal in einem GIF im Anhang dargestellt.

Ich hatte das gleiche Problem bereits zu Beginn meiner Installation von smartvisu (2.7). Hier hatte ich auf folgende Dateien irgendwie keine Schreibrechte (mehr).
01_fronthem
31_fronthemDevice
99_fronthemUtils
Damals lag das an meiner schlecht nachgezogenen Nutzerstruktur mit verminderter Rechtevergabe, aber dieses mal kann ich den Fehler ausschließen. Nachdem ich meinem User die Schreibrechte gegeben hatte, ging alles 1 Jahr lang gut und meine Plots liefen wie ne 1 :)

Ich bin mir eigentlich sehr sicher, dass es an fronthem liegt und ich bei der Installation irgendetwas übersehen habe. Hättet ihr vielleicht ein paar Tipps für mich, wo ich neben den drei aufgeführten Dateien und dem Editor noch gucken kann? Würde vielleicht jemand seine drei fronthem Dateien einmal mit mir teilen?

Update: Ich habe ganz sicher ein Problem in der 99_fronthemUtils.pm

2021.05.12 16:01:53 1: PERL WARNING: Use of uninitialized value in string eq at ./FHEM/31_fronthemDevice.pm line 263.
2021.05.12 16:01:53 1: PERL WARNING: Use of uninitialized value in string eq at ./FHEM/31_fronthemDevice.pm line 264.
2021.05.12 16:04:19 1: PERL WARNING: Subroutine fronthemUtils_Initialize redefined at ./FHEM/99_fronthemUtils.pm line 13.
2021.05.12 16:04:19 1: PERL WARNING: Subroutine fronthem_decodejson redefined at ./FHEM/99_fronthemUtils.pm line 17.
2021.05.12 16:04:19 1: PERL WARNING: Subroutine fronthem_encodejson redefined at ./FHEM/99_fronthemUtils.pm line 21.
2021.05.12 16:04:19 1: PERL WARNING: Subroutine fronthem_ActualTimeStamp redefined at ./FHEM/99_fronthemUtils.pm line 27.
2021.05.12 16:04:19 1: PERL WARNING: Subroutine fronthem_TimeStamp redefined at ./FHEM/99_fronthemUtils.pm line 35.
2021.05.12 16:04:19 1: PERL WARNING: Subroutine fronthem_Time redefined at ./FHEM/99_fronthemUtils.pm line 44.
2021.05.12 16:04:19 1: PERL WARNING: Subroutine fronthem_Duration redefined at ./FHEM/99_fronthemUtils.pm line 84.
2021.05.12 16:04:19 1: PERL WARNING: Subroutine UZSU_execute redefined at ./FHEM/99_fronthemUtils.pm line 150.
2021.05.12 16:04:19 1: PERL WARNING: Subroutine UZSU_getRrules redefined at ./FHEM/99_fronthemUtils.pm line 192.
2021.05.12 16:04:19 1: PERL WARNING: Subroutine UZSU_getCommand redefined at ./FHEM/99_fronthemUtils.pm line 204.
2021.05.12 16:04:19 1: PERL WARNING: Subroutine Log_SetList redefined at ./FHEM/99_fronthemUtils.pm line 278.
2021.05.12 16:04:19 1: PERL WARNING: Subroutine Log_GetList redefined at ./FHEM/99_fronthemUtils.pm line 342.
2021.05.12 16:04:19 1: PERL WARNING: Subroutine UZSU redefined at ./FHEM/99_fronthemUtils.pm line 399.
2021.05.12 16:04:19 1: PERL WARNING: Subroutine AnAus redefined at ./FHEM/99_fronthemUtils.pm line 444.
2021.05.12 16:04:19 1: PERL WARNING: Subroutine NumInvert redefined at ./FHEM/99_fronthemUtils.pm line 489.
2021.05.12 16:04:20 1: PERL WARNING: Subroutine Log redefined at ./FHEM/99_fronthemUtils.pm line 542.
2021.05.12 16:04:20 1: PERL WARNING: Subroutine Plot redefined at ./FHEM/99_fronthemUtils.pm line 594.
2021.05.12 16:04:20 1: PERL WARNING: Subroutine Plotfile redefined at ./FHEM/99_fronthemUtils.pm line 709.
2021.05.12 16:11:06 1: PERL WARNING: Use of uninitialized value $value in string eq at fhem.pl line 4905.


Erneutes Update, die PERL WARNUNGEN sind seitdem auch nicht mehr aufgetaucht. Hatte aus Seite 1 von raman die 99_fronthemUtils.pm genommen. Jedoch kann ich immer noch keine plots auswählen :(

Vielen Dank schonmal!

sxx128

Halllole

so ist es bei mir auch. Keine Chance. Ich weiss auch nicht was ich noch machen soll..

Grüssle
Steven
Hardware: Raspberryy PI 4
CC1101-USB-Lite 868MHz/Culfw-1.66
HM-MOD-RPI-PCB
Komponenten: Homematic/Homematic IP/Zigbee
PiVCCU

wvhn

Kann jemand erklären, was fronthem macht, um die Plots zu identifizieren? Dann könnte ich prüfen, ob ich an smartVISU irgendetwas geändert habe, was von Relevanz ist.

Größte Änderung bei den Plots in v3.0.1 war das Löschen der veralteten Widgets plot.minmaxavg und plot.multiaxis.

In v3.0.1 hatten wir für die Plots immer noch die seit v2.9 installierte Version von Highcharts (erst in v3.1 upgedated) und im FHEM-Treiber hatte ich in v3.0.1 eine (noch leere) Funktion "stopseries" eingebaut. Hier könnte man mal den alten Treiber aus v2.9 probieren. Dazu muss man aber die Zeile in der .lib/base/base.js auskommentieren, in der stopseries() aufgerufen wird.

Gruß
Wolfram

ReviloEgros

Ich denke nicht das es an einer deiner Änderungen liegt Wolfram, ich vermute eher das die fronthem Dateien bei einem FHEM Update überschrieben wurden. Da hilft es unter global das attr exclude_from_update mit 01_fronthem.pm 31_fronthemDevice.pm fronthemEditor.js zu setzen und die Dateien nochmal zu ersetzen. Ich habe ein tagesaktuelles FHEM mit smartVISU develop pull von gestern Abend am laufen ind meine Plots gehen nach wie vor.

GammaTwin

Zitat von: ReviloEgros am 18 Mai 2021, 09:14:08
Ich denke nicht das es an einer deiner Änderungen liegt Wolfram, ich vermute eher das die fronthem Dateien bei einem FHEM Update überschrieben wurden. Da hilft es unter global das attr exclude_from_update mit 01_fronthem.pm 31_fronthemDevice.pm fronthemEditor.js zu setzen und die Dateien nochmal zu ersetzen. Ich habe ein tagesaktuelles FHEM mit smartVISU develop pull von gestern Abend am laufen ind meine Plots gehen nach wie vor.

Grüße,

das ist nicht nötig. Das Update überschreibt die Dateien nicht.
Meiner Meinung nach installiert man mit update force https://raw.githubusercontent.com/herrmannj/fronthem/master/controls_fronthem.txt "einmalig" fronthem. Es ist dann nicht Teil des Update-Vorgangs.

Aber es bringt mich auf eine andere Idee:
Wiederhole doch mal update force https://raw.githubusercontent.com/herrmannj/fronthem/master/controls_fronthem.txt
So als sauberer Aufsatzpunkt. Dann ersetzt Du die 4 Dateien.

Dlay

Also ich habe force durchgeführt und kann keine Besserung erkennen. Ein auf SmartVisu 3.1 eingebundener Plot taucht im fronthem einfach nicht auf. :-(

Zitat von: GammaTwin am 19 Mai 2021, 07:53:03
Grüße,

das ist nicht nötig. Das Update überschreibt die Dateien nicht.
Meiner Meinung nach installiert man mit update force https://raw.githubusercontent.com/herrmannj/fronthem/master/controls_fronthem.txt "einmalig" fronthem. Es ist dann nicht Teil des Update-Vorgangs.

Aber es bringt mich auf eine andere Idee:
Wiederhole doch mal update force https://raw.githubusercontent.com/herrmannj/fronthem/master/controls_fronthem.txt
So als sauberer Aufsatzpunkt. Dann ersetzt Du die 4 Dateien.

Dlay

Also mit den Dateien aus dem 1. Post in diesem Thread werden die GADs angelegt.
Mal sehen ob ich sie auch bespielen kann.

Zitat von: Dlay am 20 Mai 2021, 13:43:47
Also ich habe force durchgeführt und kann keine Besserung erkennen. Ein auf SmartVisu 3.1 eingebundener Plot taucht im fronthem einfach nicht auf. :-(

wvhn

@Dlay hat das zugehörige Issue auf GitHub heute mit folgendem Kommentar geschlossen:

The problem can be solved by using the fronthem files in the first post here --> https://forum.fhem.de/index.php/topic,86584.0.html. (also dem ersten Post in diesem Thread hier)

Afterwards block any updates of fronthem in fhem with
attr global exclude_from_update 01_fronthem.pm 31_fronthemDevice.pm fronthemEditor.js 99_fronthemUtils.pm

Gruß
Wolfram

Kai-Alfonso

Moin,

vielleicht kann mir mal jemanden helfen, ggf verstehe ich die Einstellungen aber auch nicht ;-)

Also, ich möchte status.log nutzen in meiner Visu. Erstmal nur, um die Stati meiner Fenster + Rollladen zu erfassen. Dazu habe ich testweise ein Rollladen und ein Fensterdevice mit dem Attribut svReadings versehen. Danach werden automatisch Dummy Devices angelegt je Reading.

Beispiel


ZitatsvLog_ASC_ShuttersLastDrive
svLog_Activity
svLog_pct
svLog_state


Das status.log Device in SV soll kumuliert alle Events erfassen, die ich per svReadins definiert habe.

Allerdings scheint es nicht so gedacht zu sein, weil ja im Item Editor nur eine SV Item einem FHEM Device zuordnen kann.

Wie machte ich dass dann oder habe ich einen Denkfehler?

Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

wvhn

Moin Kai-Alfonso,

smartVISU kann mit dem Widget status.log Nachrichten darstellen, die das Backend in einem einzigen item im JSON-Format bereit stellt. Wenn Du die Stati mehrerer Devices in einem Log gemeinsam anzeigen willst, musst Du diese vorher in einem item sammeln.

Disclaimer: bis hierhin ist die Antwort gesichert. Den Rest reime ich mir zusammen, ohne wirklich Ahnung von Fronthem zu haben.

Zum Sammeln von Log-Einträgen brauchst Du eine readingsGroup, wie sie im ersten Post dieses Threads beschrieben ist. Zitat:
,, 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)"

Gruß
Wolfram

Kai-Alfonso

Hallo Wolfram,

der fronthem Converter "Log" scheint das irgendwie anders zu machen und rudimentär funktioniert das auch (siehe Anhang)

Aber, so müsste ich pro Reading ein GAD haben und Readings Changes erzeugen in status.plot keinen neuen Eintrag, sondern der Alter wird upgedatet mit dem neuen Status.

attr Rolllade_Arbeitszimmer svReadins  pct ASC_ShuttersLastDrive


Historie löschen
Internals:
   FUUID      62fe13ab-f33f-ce3b-a12c-1f2d3d5157673bf6
   NAME       svLog_ASC_ShuttersLastDrive
   NR         63607
   STATE      send
   TYPE       dummy
   eventCount 9
   READINGS:
     2022-08-18 15:58:55   Rolllade_Arbeitszimmer ASC_ShuttersLastDrive manual
     2022-08-18 15:58:55   state           send
Attributes:
   svEvents   info:alive,ok,online,[O|o]pened,[C|c]onnected,[C|c]losed,[G|g]eschlossen warning:low,[O|o]pen,[O|o]ffen,offline,overload,unreachable error:dead,[D|d]isconnected,unknown,IOerr


PS: ich kann irgendwie keine Bilder im Beitrag inline  posten, deswegen leider als Anhang
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

GammaTwin

Grüße,

es schon so, dass jeder Readingname einen Dummy anlegt. Du kannst also nur Readings mit gleichen Namen an ein status.log in die smartVISU übergeben.

Da macht das notify:
define Log notify .* { Log_SetList($NAME,$EVENT) }

Die Prozedur "Log_SetList" befindet sich in der "99_fronthemUtils.pm". Und dort wird der Dummy wie folgt angelegt:
fhem ("define" . " svLog_" . $list . " dummy");
Wobei $list aus dem userattr "Readins" genommen wird:
split(" ", AttrVal($device, "svReadins", ""));

Man müsste also diese Prozedur anders schreiben. Aber wie gibt man Info mit, was zusammen gehört und was nicht?

Kai-Alfonso

Hi - Grüß Dich.

Danke für Deine Antwort. Ich habe mal mehrere Device mit gleichen Reading getestet und die kommen jetzt auch in Status.log an. Leider aber sind die Einträge nicht chronologisch oder sortierbar. Außerdem wäre es nett, wenn alte Stati nicht gelöscht werden, dann hätte man so eine Art Eventlog.

Das mit den kumulierten Readings - da müsste man entweder die Prozedur umschreiben oder sich mit doif und setreading ggf behelfen.

Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

GammaTwin

#118
Grüße,

ich die 3 betroffen Prozeduren in der "99_fronthemUtils.pm" angepasst und als:

Log2 ergänzt
sub Log2(@)
{
  my ($param) = @_;
  my $cmd = $param->{cmd};
  my $gad = $param->{gad};
  my $gadval = $param->{gadval};

  my $device = $param->{device};
  my $reading = $param->{reading};
  my $event = $param->{event};
 
  my @args = @{$param->{args}};
  my $cache = $param->{cache};

  if ($param->{cmd} eq 'get')
  {
    $param->{cmd} = 'send';
  }
  if ($param->{cmd} eq 'log')
  {
    $param->{cmd} = 'send';
  }
  if ($param->{cmd} eq 'send')
  {
use Encode qw(decode encode);
my $list = main::Log_GetList2($device);
$list = encode("utf8", '[' . $list . ']');
    $param->{gad} = $gad;
$param->{gadval} = main::fronthem_decodejson($list);
$param->{gads} = [];

    return undef;
  }
  elsif ($param->{cmd} eq 'rcv')
  {
$param->{result} = $gadval;
$param->{results} = [];
    return undef;
  }
  elsif ($param->{cmd} eq '?')
  {
    return 'usage: log';
  }
  return undef;
}


Log_GetList2
sub
Log_GetList2($)
{
my ($name) = @_;
my $list = "";
my $level = "info"; # info = green, error = red,  warning = yellow (levels for smartvisu status.log)

my @info = split(" ", AttrVal($name, "svRegex", ""));
my @state = split(" ", AttrVal($name, "svEvents", ""));

my $i = 1;
foreach my $key (sort { $b cmp $a } keys %{$defs{$name}{READINGS}})
{
my $reading = $defs{$name}{READINGS}{$key}{VAL};

foreach (@state) {
if ($_ =~ qr/(.*):(.+)/p) {
my $newLevel = $1;
my $states = $2;
$states =~ s/,/|/g;

if($reading =~ /.*:?\s?($states)/)
{
$level = $newLevel;

foreach (@info) {
if ($_ =~ qr/(.*):(.+)/p) {
my $a = $1;
my $b = $2;
$reading =~ s/$a/$b/g;
}
}
}
}
}

my $timestring = $defs{$name}{READINGS}{$key}{TIME};

if ($key =~ qr/(.*)_(.+)/p) {
$key = $1;
} else {
#sollte nur bei state auftreten
}
my $device = AttrVal( $key , "alias", $key );
$timestring =~ s/\s/T/g; # Compatibility for older Browser "2018-03-10T18:34:53"
$list .= '{"message":"'. $device . " - " . $reading . '","time":"' . $timestring . '","level":"' . $level . '"}' . ($i == keys(%{$defs{$name}{READINGS}}) ? "" : ",") if ($key ne "state");

$i++;
}
return $list;
}


Log_SetList2
sub
Log_SetList2($$)
{
my ($device, $event) = @_;
my $reading = "";
    my $message = "";

if ($event =~ qr/(.*?):\s+(.*)/p) {
$reading = $1;
        $message = $2;
    } else {
        $reading = "state";
        $message = $event;
    }

my @info = split(" ", AttrVal($device, "svReadins", ""));
my $list = "";
my $newReading = "";
my $collector = "";
foreach (@info) {
$list = "";
$newReading = "";
$collector = "";

if ($_ =~ qr/(.*?):(.+)/p) {
$list = $1;
$newReading = $2;
if ($newReading =~ qr/(.*?):(.+)/p) {
$newReading = $list . " " . $1;
$list = $2;
$collector = $list
}
} else {
$list = $_;
}

if ($list eq $reading or $list eq $collector)
{
fhem ("set" . " svLog_" . $list . " block");

if ($newReading ne "") {
$reading = $newReading;
}

if(!$defs{"svLog_" . $list}) {
fhem ("define" . " svLog_" . $list . " dummy");
fhem("attr" . " svLog_" . $list . " svEvents info:alive,ok,online,[O|o]pened,[C|c]onnected,[C|c]losed,[G|g]eschlossen warning:low,[O|o]pen,[O|o]ffen,offline,overload,unreachable error:dead,[D|d]isconnected,unknown,IOerr");
}

my @state = split(" ", AttrVal("svLog_" . $list, "svEvents", ""));
foreach (@state) {
if ($_ =~ qr/(.*):(.+)/p) {
my $z = $2;
$z =~ s/,/|/g;

if($reading eq "state") {
fhem ("setreading" . " svLog_" . $list . " " . $device . "_" . $reading . " " . $message);
} elsif ($message =~ /.*:?\s?($z)/) {
fhem ("setreading" . " svLog_" . $list . " " . $device . "_" . $reading . " " . $reading . " " . $1);
} else {
fhem ("setreading" . " svLog_" . $list . " " . $device . "_" . $reading . " " . $message);
}
}
}
fhem ("set" . " svLog_" . $list . " send");
}
}
}


Du kannst alle 3 Prozeduren an die "99_fronthemUtils.pm" amhängen.

Dann musst Du den Conveter auf Log2 stellen.

Und das Wichtigste: Das Attr "svReadins" in den Devices wie folgt anpassen:
attr <device> svReadins <Variable1>:<Variable2>:<Veriabel3>
Variabel1: bleibt wie es ist, das anzuzeigende Reading
Variabel2: bleibt wie es ist, ein Zusatz, kann leer sein
Variable3: !Neu! ein Begriff, der den Dummy bildet unter dem die Readings gesammelt werden sollen. Optional, aber ohne bleibt alles beim alten :)

Probiere es mal aus.

Nachtrag: Das notify ändern
defmod Log notify .* { Log_SetList2($NAME,$EVENT) }

Kai-Alfonso

Hi,

erstmal vielen Dank das Du dich dem Thema angenommen hast.

Ich hab mal die 3 Sachen in die 99_fronthemUtils eingetragen.

Attribut ist wie folgt bei allen Rollladen und Fenster gesetzt

svReadins  pct:level:xyFenster <- Rollladen
svReadins state:Status:xyFenster <- Fenster

Wenn ich das richtig verstehe, wird jetzt ein Dummy xyFenster gebilder mit entsprechenden Readings, welche ich mit Log2 im Converter abfragen kann?

Es wird aber kein Dummy erstellt - evtl noch ein Fehler in der 99_fronthemUtils?







Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)