HomeMatic Funk-Statusanzeige - HM-Dis-WM55

Begonnen von Roaster, 14 November 2014, 20:33:48

Vorheriges Thema - Nächstes Thema

martinp876

Das notify ist zu langsam. Du musst es einbinden wie beschrieben. Da ist kein notify dabei.

martinp876

Das notify wird schlecht funktionieren. Nutze die funktion wie beschrieben, dann sollte es klappen

flashman

#302
Hallo dann hab ich es falsch verstanden. Ich dachte man ruft die sub myLineA mit dem wert der Temperatur des 1wire  auf und der wird dann ans display über die funktion der 99_myUtil übergeben? Wie kommt den nu mein wert ins display. Sorry bin halt ein gelerner Bäcker und Dachklempner  :D   Danke für die Hilfe
So hab mein fehler erkannt denk ich . hab natürlich die
my %lineArr = (0 =>{#============Btn Type 0: Btn1 short
                     0 =>{#-------itteration 0
                           1=>'{myTh("wz:","h_s_s2",'    #  line 1   (was ist wz und h_s_s2 für werte???? )
                                                                                         wz als Text der angezeigt wird       
                                                                                              und h_s_s2 als Device??
                          ,2=>'{myTh("os:","h_s_s1",'   
                          ,3=>'{myTh("op:","h_s_aussen",'
                          ,4=>'{myPr("p:" ,"h_s_aussen",'
                          ,5=>'{myTx("","","",'             
                          ,6=>'{myTx("","","",'     
                         }

nicht angepast.

martinp876

Ueber das set displayWM ist es zu setzen

traxanos

Hallo,

ich habe mir dieses Display als Bausatz bestellt und sitze nun davor und überlege wie ich es einbinde. Wenn ich das aktuell richtig verstanden habe,
kann ich momentan nur Channel 01 und 02 verwenden? Ein Wechsel zu den anderen Channels ist nicht möglich. Korrekt?
Das heißt das man aktuell nur 4 Events zur Steuerung hat (2x Short, 2x Long)

Ich hatte ursprünglich vor, mit der unteren Taste, durch ein Menü zu springen. Und mit der oberen zu toggeln. Mein Problem ist,
dass wenn ich auf ein Event reagiere und den Text anpasse, die Änderung zu spät ist. Somit sehe ich erst auf den 2ten Tastendruck
was geändert wurde.

Gibt es eine Möglichkeit im Text einen Funktionsaufruf zu hinterlegt, welches erst beim Anfragen durch eine Taste aufgerufen wird?
So könnte ich mir doch noch ein Perlscript schreiben, welches dieses Menü realisiert.

Leider klappen das aktuell myUtils Beispiel nicht. Es kommen u.a Perl-Warnings:

2015.07.29 22:18:19 1: PERL WARNING: Use of uninitialized value within @cnt in hash element at ./FHEM/99_myUtils.pm line 159.
2015.07.29 22:18:19 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at ./FHEM/99_myUtils.pm line 159.


Dann bekomme ich wie viele andere auch:
define eval must return 3 values:
Dabei habe ich die myUtils eingebungen und sogar mit reload mehrfach neugeladen.

Dann wird im Wiki gesagt man muss das Modul einbinden:
define mu myUtils
Unknown module myUtils


Was meiner Meinung nach Blödsinn ist, da die 99er Module automatisch gelanden werden.

Auch das laden per
define userCfg notify global:INITIALIZED include fhem_user.cfg
brachte nichts und warf nur die o.g. Fehler.
Im Einsatz:
FHEM: Latest auf RPi2
HM: vCCU, HMLAN, HMUSB2, HM-CC-RD-DN, HM-TC-IT-WM-W-EU, HM-SEC-SC-2, HM-ES-PMWs1-Pl, HM-LC-Sw1PBU-FM, HM-PB-2-WM55-2, HM-RC-8, HM-BP-6-WM55
CUL: ESA2000, Intertechno

traxanos

So hab jetzt das Handling hinbekommen. Ich bekomme nun sauber alle 4 Events getrennt und kann so viele Screens anlegen wie ich möchte. Außerdem werden Screens nun in einer eigenen Funktion definiert. Hier mal das Beispiel:

/opt/fhem/init.cfg
set HM_374A31_Dis_01 displayWM short line1 e:{HMDisp55WMStatus('HM_374A31_Dis_01','short',1)}
set HM_374A31_Dis_01 displayWM short line2 e:{HMDisp55WMStatus('HM_374A31_Dis_01','short',2)}
set HM_374A31_Dis_01 displayWM short line3 e:{HMDisp55WMStatus('HM_374A31_Dis_01','short',3)}
set HM_374A31_Dis_01 displayWM short line4 e:{HMDisp55WMStatus('HM_374A31_Dis_01','short',4)}
set HM_374A31_Dis_01 displayWM short line5 e:{HMDisp55WMStatus('HM_374A31_Dis_01','short',5)}
set HM_374A31_Dis_01 displayWM short line6 e:{HMDisp55WMStatus('HM_374A31_Dis_01','short',6)}

set HM_374A31_Dis_02 displayWM short line1 e:{HMDisp55WMStatus('HM_374A31_Dis_02','short',1)}
set HM_374A31_Dis_02 displayWM short line2 e:{HMDisp55WMStatus('HM_374A31_Dis_02','short',2)}
set HM_374A31_Dis_02 displayWM short line3 e:{HMDisp55WMStatus('HM_374A31_Dis_02','short',3)}
set HM_374A31_Dis_02 displayWM short line4 e:{HMDisp55WMStatus('HM_374A31_Dis_02','short',4)}
set HM_374A31_Dis_02 displayWM short line5 e:{HMDisp55WMStatus('HM_374A31_Dis_02','short',5)}
set HM_374A31_Dis_02 displayWM short line6 e:{HMDisp55WMStatus('HM_374A31_Dis_02','short',6)}

set HM_374A31_Dis_01 displayWM long line1 e:{HMDisp55WMStatus('HM_374A31_Dis_01','long',1)}
set HM_374A31_Dis_01 displayWM long line2 e:{HMDisp55WMStatus('HM_374A31_Dis_01','long',2)}
set HM_374A31_Dis_01 displayWM long line3 e:{HMDisp55WMStatus('HM_374A31_Dis_01','long',3)}
set HM_374A31_Dis_01 displayWM long line4 e:{HMDisp55WMStatus('HM_374A31_Dis_01','long',4)}
set HM_374A31_Dis_01 displayWM long line5 e:{HMDisp55WMStatus('HM_374A31_Dis_01','long',5)}
set HM_374A31_Dis_01 displayWM long line6 e:{HMDisp55WMStatus('HM_374A31_Dis_01','long',6)}

set HM_374A31_Dis_02 displayWM long line1 e:{HMDisp55WMStatus('HM_374A31_Dis_02','long',1)}
set HM_374A31_Dis_02 displayWM long line2 e:{HMDisp55WMStatus('HM_374A31_Dis_02','long',2)}
set HM_374A31_Dis_02 displayWM long line3 e:{HMDisp55WMStatus('HM_374A31_Dis_02','long',3)}
set HM_374A31_Dis_02 displayWM long line4 e:{HMDisp55WMStatus('HM_374A31_Dis_02','long',4)}
set HM_374A31_Dis_02 displayWM long line5 e:{HMDisp55WMStatus('HM_374A31_Dis_02','long',5)}
set HM_374A31_Dis_02 displayWM long line6 e:{HMDisp55WMStatus('HM_374A31_Dis_02','long',6)}


/opt/fhem/FHEM/99_myUtils.pm
##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;
use POSIX;

sub myUtils_Initialize($$)
{
  my ($hash) = @_;
}

my %rendered_screen;

sub HMDisp55WMScreenTemp($)
{
  my ($line) = @_;

  if($line == 2) {
    return ('Temperatur', 'red');
  } elsif($line == 3) {
    return ('Innen', 'orange');
  } elsif($line == 4) {
    my $temp = sprintf("%.1f", ReadingsVal('Wohnzimmer.Thermostat_Weather', 'temperature', 0));
    return ($temp." *C", 'white');
  } elsif($line == 5) {
    return ('Aussen', 'orange');
  } elsif($line == 6) {
    my $temp = sprintf("%.1f", ReadingsVal('Wohnzimmer.Thermostat_Weather', 'temperature', 0));
    return ($temp." *C", 'white');
  }
}

sub HMDisp55WMScreenLicht1($)
{
  my ($line) = @_;

  if($line == 2) {
    return ('Licht 1/2', 'red');
  } elsif($line == 3) {
    return HMDisp55WMStatusLicht('Wohnzimmer.Licht_Sw','Wohnzimmer');
  } elsif($line == 4) {
    return HMDisp55WMStatusLicht('Schalfzimmer.Licht_Sw','Schlafzimmer');
  } elsif($line == 5) {
    return HMDisp55WMStatusLicht('Buero.Licht','Buero');
  } elsif($line == 6) {
    return HMDisp55WMStatusLicht('Kueche.Licht','Kueche');
  }
}

sub HMDisp55WMScreenLicht2($)
{
  my ($line) = @_;

  if($line == 2) {
    return ('Licht 2/2', 'red');
  } elsif($line == 3) {
    return HMDisp55WMStatusLicht('Kueche.Licht','Kueche');
  } elsif($line == 4) {
    return HMDisp55WMStatusLicht('Esszimmer.Licht','Esszimmer');
  } elsif($line == 5) {
    return HMDisp55WMStatusLicht('Vorratsraum.Licht','Vorratsraum');
  } elsif($line == 6) {
    return ('---', 'white', 'ok');
  }
}


sub HMDisp55WMScreenWetter($)
{
  my ($line) = @_;

  if($line == 2) {
    return ('Wetter', 'red');
  } elsif($line == 3) {
    my $temp = sprintf("%.1f", ReadingsVal('Wetter', 'temp_c', 0));
    return ($temp.' *C', 'yellow');
  } elsif($line == 4) {
    my $humidity = ReadingsVal('Wetter', 'humidity', '0');
    return ($humidity.' %', 'yellow');
  } elsif($line == 5) {
    my $minTemp = sprintf("%.1f", ReadingsVal('Wetter', 'fc1_low_c', 0));
    return ('Min: '.$minTemp.' *C', 'orange');
  } elsif($line == 6) {
    my $maxTemp = sprintf("%.1f", ReadingsVal('Wetter', 'fc1_high_c', 0));
    return ('Max: '.$maxTemp.' *C', 'orange');
  }
}

sub HMDisp55WMScreenFenster($)
{
  my ($line) = @_;

  if($line == 2) {
    return ('Fenster', 'red');
  } elsif($line == 3) {
    return ('Wohnzimmer', 'orange');
  } elsif($line == 4) {
    my $open = (ReadingsVal('Wohnzimmer.Fenster', 'state', '-') eq 'open');
    return ($open ? 'offen' : 'geschlossen', $open ? 'red' : 'green');
  } elsif($line == 5) {
    return ('Wohnzimmer', 'orange');
  } elsif($line == 6) {
    my $open = (ReadingsVal('Buero.Fenster', 'state', '-') eq 'open');
    return ($open ? 'offen' : 'geschlossen', $open ? 'red' : 'green');
  }
}

sub HMDisp55WMStatusLicht($$)
{
  my ($device, $name) = @_;

  if(!$defs{$device}) {
    return "device $device does not exists. Please define it first!";
  }

  my $icon;
  my $color;
  my $hash = $defs{$device};

  if(ReadingsVal($device, 'level', 0) > 0 || ReadingsVal($device, 'state', 'off') eq 'on') {
    $icon = 'on';
    $color = 'yellow';
  } else {
    $icon = 'off';
    $color = 'white';
  }
  return ($name, $color, $icon);
}

sub HMDisp55WMStatus($$$)
{
  my ($device, $type, $line) = @_;

  if(!$defs{$device}) {
    return "device $device does not exists. Please define it first!";
  }

  my $hash = $defs{$device};
  my $parentDevice = $hash->{device};
  my $parentHash = $defs{$parentDevice};

  my $channel = $hash->{chanNo};
  my $screen = ReadingsVal($parentDevice, "screen", -1);
  my $screens = 5;

  if($line == 1) {
    if($channel eq '01' && $type eq 'long') {
      $screen = 0;
    } elsif($channel eq '02' && $type eq 'long') {
      $screen = 3;
    } elsif($screen == -1) {
      $screen = 0; # first screen 0
    } elsif($channel eq '01' && $type eq 'short') { # down
      if($screen == 0) {
        $screen = $screens - 1;
      } else {
        $screen = $screen - 1;
      }
    } elsif($channel eq '02' && $type eq 'short') { # up
      if($screen+1 >= $screens) {
        $screen = 0;
      } else {
        $screen = $screen + 1;
      }
    }

    readingsBeginUpdate($parentHash);
    readingsBulkUpdate($parentHash, "screen", $screen);
  }

  if($line == 1) {
    return ("Seite ".($screen+1)."/".$screens, 'blue', 'noIcon')
  } elsif($screen == 1) {
    return HMDisp55WMScreenLicht1($line);
  } elsif($screen == 2) {
    return HMDisp55WMScreenLicht2($line);
  } elsif($screen == 3) {
    return HMDisp55WMScreenFenster($line);
  } elsif($screen == 4) {
    return HMDisp55WMScreenTemp($line);
  } else {
    return HMDisp55WMScreenWetter($line);
  }
}

1;


define userCfg notify global:INITIALIZED include init.cfg

Das Ganze habe ich eben auf die schnelle zusammen geschustert, daher ist das Ganze noch nicht super schon vom Source.

Und da SourceCode immer so theoretisch ist, hier noch eine Video:
https://www.youtube.com/watch?v=4I0ZgwjMWx0
Im Einsatz:
FHEM: Latest auf RPi2
HM: vCCU, HMLAN, HMUSB2, HM-CC-RD-DN, HM-TC-IT-WM-W-EU, HM-SEC-SC-2, HM-ES-PMWs1-Pl, HM-LC-Sw1PBU-FM, HM-PB-2-WM55-2, HM-RC-8, HM-BP-6-WM55
CUL: ESA2000, Intertechno

martinp876

Prima.
Im prinzip wie der vorhandene vorschlag.
Im aelteren beispiel kann man noch unterschiedliche screens anzeigen, wenn man n-mal drueckt. Hast du einmal verglichen ?


mirgehtsgut

Die dynamische Statusanzeige ist super.  Danke!
Ich wollte mir nun auch die Türenkontakte anzeigen lassen. Funktioniert soweit, bis auf die Auswahl des richtigen Logos (closed oder open). Irgendwie kapiere ich es nicht, wie ich die Bedingung setzen muss. Status liefert die Werte open, closed und tiltled. Nachfolgend meine Routine für Kontakte.

sub myKO($$$){#Kontakt
   my ($p,$e,$t) = @_;
   if($t eq "t"){return $p.ReadingsVal($e,"state","xx");  }
   if($t eq "c"){return    ReadingsVal($e,"state",0) eq "closed" ? "green" : "red" }
   if($t eq "i"){return    ReadingsVal($e,ReadingsVal($e,"state","closed"),"0")    ? "closed"  : "open"  }
   return "nix";
}


martinp876

Readingsval hat 3 Parameter. Den Name der entity, den Namen des readings und den default falls das reading nicht da ist.
Jetzt überlege, warum in deinen geschachtelten readingsval der äußeres nur 2 Parameter hat und als readings Name den wert des inneren readings.

mirgehtsgut

#309
Hi martinp876,

Danke für den Hinweis. Jetzt funktionieren alle dynamischen Anzeigen wie gewollt.

Nun habe ich ein neues Problem. Ich möchte die langen Tastendrücke auch zu Schaltfunktionen nutzen. Ich habe z. B. folgendes notify definiert:

              define fo_FS_Dis_02.lg.N notify fo_FS_Dis_02:Long.* set SC_media scene Aufstehen

Das Notify funktionert zwar richtig, ich erhalte dann aber keine Anzeige mehr. Auf dem Display steht "keine Daten empfangen". Wenn ich das notify deaktiviere funktionieren die Anzeigen wieder.

Irgendwie scheint dieses notify mit dem notify zum Befüllen des Displays zu kollidieren. Hast du eine Idee, wie ich diese Kollision lösen kann? Kann ich die gewünschte Funktion  "set SC_media scene Aufstehen" vllt in den myUtils-Funktionen oder die fhem_user.cfg integrieren?

martinp876

Ich vermute das das 2. notify zuerst gesendet wird, damit das erste zu spät kommt. Das senden ist nicht priorisiert.
Logge einmal die messages, vielleicht fällt mir etwas ein. Ansonsten kannst du direkt peeren.

mirgehtsgut

#311
Der Ansatz mit dem direkten peering passt. Doch wie geht das genau?

martinp876

Der WM ist der Sender , steht also vorne im Kommando.
Set wmchan1 peerchan 0 actorchan single set

Config am WM drücken

Gerne auch erst alle peerings absetzen fuer chan 1 und 2, dann config drücken

Am aktor Kanal einstellen, was er machen soll. Bei kurz oder langen Druck.

mirgehtsgut

Zitat von: martinp876 am 19 Oktober 2015, 19:36:05
Der WM ist der Sender , steht also vorne im Kommando.
Set wmchan1 peerchan 0 actorchan single set

Config am WM drücken

Gerne auch erst alle peerings absetzen fuer chan 1 und 2, dann config drücken

Am aktor Kanal einstellen, was er machen soll. Bei kurz oder langen Druck.
Habe den WM mit einem virtuellen Taster gepeered. Jetz funktioniert alles richtig. Es gibt nur einen kleinen Schönheitsfleck: Nach Drücken des Tasters kommt zunächst richtigerweise das Wartesymbol, das sich dann in 0% bis 100% ändert. Woher das wohl kommt oder ob man diese Anzeige unterdrücken kann?

Danke für deine tolle Hilfe.


mirgehtsgut

Ich habe noch ein kleines Ausgaeproblem:

Ich hole mit die aktuellen Wetterdaten in myUtils über

    ,5=>'{myTx(ReadingsVal("Wetter","condition",""),"white","noIcon",'

Funktoniert soweit gut. Wenn aber das readingsVal z. B. "überwiegend wolkig" liefert, fehltdas "ü" und der Text wird abgeschnitten.

hr habr sicherlich einen Tipp, wie ich die Ausgabe in 2 Textteile aufsplitten und in 2 Zeilen darstellen kann, also
   in Zeile 5: "überwiegend"
   in Zeile 6: "wolkig"

Habe schon alles mögliche versucht, aber ich stehe mit der Stringverarbeitung irgendwie auf Kriegsfuß.