HM-Dis-EP-WM55

Begonnen von OliWee, 14 Mai 2016, 16:48:43

Vorheriges Thema - Nächstes Thema

peterk_de

Eigentlich ganz simpel, was ich möchte: Das Ding soll dauerhaft z.B. die aktuelle Temperatur anzeigen, ohne dass ich erst was drücke. Denn dazu ist das Display zu lahm - solange will ich für nen flüchtigen Blick nicht warten. Dazu muss ich halt in irgendwelchen sinnvollen Abständen Updaten ... was sinnvoll ist, muss man sicher ausknobeln. Alle 20 min neue Messwerte reicht dann offenbar nur für nen Monat Betrieb ...
FHEM auf Ubuntu-VM / 2xNUC Proxmox Cluster
UI: HomeKit, TabletUI, Grafana
IOdevs: 2xHueBridge, RaspiMatic-CCU, CUL868, 2xHarmonyHub, 6xRaspi-Roomnode mit CO2, VOC und lepresenced
Devices: 107xHomematic(IP), 96xPhilips Hue, 17xTECHEM, 12xBTLE, 8xSONOS, 2xHomeConnect, 1xShelly 3em, 1xNanoleaf ...

martinp876

ja, da bin ich schon fast drauf gekommen.
was ich zum Sparen machen würde ist:
- Nachts die refresh-rate reduzieren
- nur erneuern wenn die temperatur sich geändert hat. Das kann man evtl auf ganze Grad abstimmen. Oder eine Hysterese einbauen.

Ich bastle mir da auch einmal.

iamandy

Ich zeige auch die Temp. an, aber nur ganze Zahlen und ich "merke" mir den Wert den ich gerade anzeige in nem Dummy und dazu habe ich das Toggeln zwischen zwei Werten "abgefangen" in dem ich nur wechsle wenn min 0,9 Grad (es langt vermutlich auch 0,3) zwischen den Werten liegen. Um dem ganzen noch einen drauf zu setzen muss dazu auch noch jemand in der letzten Zeit an einem Bewegungsmelder in der Nähe vorbei gelaufen sein. In Summe konnte ich die Updates dadurch extrem minimieren. Ich übertrage auch nur 1 und nicht 3 Mal wie teilweise empfohlen wird...

martinp876

hier mein Vorschlag. Erst ein update mache! epDis ist leicht verändert.
Erst ein Notify um die beiden Buttons zu fangen
define ntfy_epBtnBat notify ep_Btn_0.*:trigger:.* {myEpDisplay($NAME,$EVENT)}

und in myUtils die Anzeigen frisieren. Ich denke/hoffe ihr kommt da mit zurecht
sub myEpDisplay($$){#set display readings
  my ($name,$event) = @_;
  my $disH = $defs{InternalVal(InternalVal($name,"device",""),"channel_03","")};
  $name  = substr ($name,length($name)-1,1);
  $event =~ s/.* //;
  my ($typ,$cnt) = split("_",$event);
    #my %disp_icons = (
    #   off    => '80', on => '81', open => '82', closed => '83'
    #  ,error  => '84', ok => '85', info => '86', newmsg => '87'
    #  ,svcmsg => '88'
    #  ,none   => ''
    #);

  if ($name == 1){#System Info
    if($typ eq "Long"){
      HMinfo_SetFn($defs{hm},"hm","clearG","msgEvents");
      CUL_HM_Set  ($defs{hm},"ActionDetector","update");
      HMinfo_SetFn($defs{hm},"hm","update");
    }
    CUL_HM_UpdtReadBulk($disH,0
                        ,"line1_text:bat " .ReadingsVal("hm"            ,"ERR_battery"  ,"hallo?")
                        ,"line2_text:prot ".ReadingsVal("hm"            ,"ERR__protocol","hallo?")
                        ,"line3_text:"     .ReadingsVal("ActionDetector","statdis"      ,"hallo?")
                        ,"line1_icon:info"
                        ,"line2_icon:"     .(ReadingsVal("hm","ERR__protocol","")=~m/(-|CmdDel:0,)/ ?"ok":"error")
                        ,"line3_icon:"     .(ReadingsVal("hm","I_actTotal"   ,"")=~m/dead:0,unkn:3,/?"ok":"error")
                        );
  }
  elsif ($name == 2 && $typ eq "Short"){#wetter
    myEpDisplayWeather($disH);
    InternalTimer(gettimeofday()+ 20*60,"myEpDisplayWeatherTimer","myDis:$disH->{NAME}", 0);
  }
  elsif ($name == 1 && $typ eq "Long"){## unused - muss noch gemacht werden.
    CUL_HM_UpdtReadBulk($disH,0
                        ,"line1_text:$name-$typ-$cnt"
                        ,"line2_text:".ReadingsVal("ActionDetector","statdis","hallo?")
                        ,"line3_text:".ReadingsVal("hm","I_actTotal","hallo?")
                        ,"line1_icon:newmsg"
                        ,"line2_icon:".(ReadingsVal("hm","ERR__protocol","")=~m/(-|CmdDel:0,)/?"ok":"error")
                        ,"line3_icon:".(ReadingsVal("hm","I_actTotal"   ,"")=~m/dead:0,unkn:3,/?"ok":"error")
                        );
  }
  return;
}
sub myEpDisplayWeatherTimer($){#set display readings
  my($in ) = @_;
  my(undef,$name) = split(':',$in);
  myEpDisplayWeather($defs{$name});
  RemoveInternalTimer("myEpDisplayWeatherTimer");
  InternalTimer(gettimeofday()+ 20*60,"myEpDisplayWeatherTimer","myDis:$name", 0);#respin timer
  CUL_HM_Set($defs{$name},$name,"displayEP",":::");#force update
}
sub myEpDisplayWeather($){#set display readings
  my ($disH) = @_;
  my $name = $disH->{NAME};
  $disH->{helper}{disp}{active} = 1;
  my $disHdisp = $disH->{helper}{disp};
 
  my $at = ReadingsVal("h_s_aussen"        ,"temperature","?");
  my $ap = ReadingsVal("h_s_aussen"        ,"pressure"   ,"?");
  my $ew = ReadingsVal("haEss_Weather"     ,"state"      ,"?");
  my $gw = ReadingsVal("hwGertrude_Weather","state"      ,"?");
  my $dt = ReadingsVal("hdCtr_Weather"     ,"temperature","?");
  my $dh = ReadingsVal("hdCtr_Weather"     ,"humidity"   ,"?");
  my $ia = ReadingsVal("h_s_aussen"        ,"Activity","") eq "alive" ? "ok" : "error";
  my $ig = ReadingsVal("hwGertrude"        ,"Activity","") eq "alive" ? "ok" : "error";
  my $id = ReadingsVal("hdCtr"             ,"Activity","") eq "alive" ? "ok" : "error";

  my $chnge = 0;
  if ($at ne $disHdisp->{at}){$chnge = 1;$disHdisp->{at} = $at}
  if ($ap ne $disHdisp->{ap}){$chnge = 1;$disHdisp->{ap} = $ap}
  if ($ew ne $disHdisp->{ew}){$chnge = 1;$disHdisp->{ew} = $ew}
  if ($gw ne $disHdisp->{gw}){$chnge = 1;$disHdisp->{gw} = $gw}
  if ($dt ne $disHdisp->{dt}){$chnge = 1;$disHdisp->{dt} = $dt}
  if ($dh ne $disHdisp->{dh}){$chnge = 1;$disHdisp->{dh} = $dh}
  if ($ia ne $disHdisp->{ia}){$chnge = 1;$disHdisp->{ia} = $ia}
  if ($ig ne $disHdisp->{ig}){$chnge = 1;$disHdisp->{ig} = $ig}
  if ($id ne $disHdisp->{id}){$chnge = 1;$disHdisp->{id} = $id}

  if ($chnge){
    CUL_HM_UpdtReadBulk($disH,0
                      ,"line1_text:T:".$disHdisp->{at}
                                ." p:".$disHdisp->{ap}
                      ,"line2_text:A:".$disHdisp->{ew}
                                ." W:".$disHdisp->{gw}
                      ,"line3_text:D:".$disHdisp->{dt}
                                ." h:".$disHdisp->{dh}
                      ,"line1_icon:"  .$disHdisp->{ia}
                      ,"line2_icon:"  .$disHdisp->{ig}
                      ,"line3_icon:"  .$disHdisp->{id}
                      );
  }
}

zap

Zitat von: peterk_de am 13 August 2016, 20:23:18
Hui ... nach knapp 3 Wochen ist nun der erste Satz Eneloops leer ... das Display war heute morgen schwarz, die Taster funktionierten aber noch. Nach dem ersten Drücken kam dann die LowBat Warnung ... naaaja.

Das ist seltsam. Bei mir bleibt der letzte Text stehen auch wenn ich die Batterien entferne.
2xCCU3 mit ca. 100 Aktoren, Sensoren
Entwicklung: FHEM auf Proxmox Debian VM
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: HMCCU, (Fully, AndroidDB)

martinp876

#110
das letzte sollte stehen bleiben  - sonst klappt das mit der Lebensdauer nicht. Die Anzeige ist zumindest nahezu "Leistungsfrei".

Bei meinem Beispiel fehlt das entfernen des Timers! Korrektur:
sub myEpDisplay($$){#set display readings
  my ($name,$event) = @_;
  my $disH = $defs{InternalVal(InternalVal($name,"device",""),"channel_03","")};
  $name  = substr ($name,length($name)-1,1);
  $event =~ s/.* //;
  RemoveInternalTimer("myEpDisplayWeatherTimer");
  my ($typ,$cnt) = split("_",$event);
    #my %disp_icons = (


noch ein Nachtrag - die Hysterese war nicht drin. Also besser:
  if (abs($at - $disHdisp->{at}) > 0.9){$chnge = 1;$disHdisp->{at} = $at}
  if (abs($ap - $disHdisp->{ap}) > 10 ){$chnge = 1;$disHdisp->{ap} = $ap}
  if (abs($ew - $disHdisp->{ew}) > 0.9){$chnge = 1;$disHdisp->{ew} = $ew}
  if (abs($gw - $disHdisp->{gw}) > 0.9){$chnge = 1;$disHdisp->{gw} = $gw}
  if (abs($dt - $disHdisp->{dt}) > 0.9){$chnge = 1;$disHdisp->{dt} = $dt}
  if (abs($dh - $disHdisp->{dh}) > 4  ){$chnge = 1;$disHdisp->{dh} = $dh}

die werte nach bedarf einstellen - klar

darkness

#111
Hallo,
habe gerade bei meinem Display festgestellt, dass Leerzeichen als "ß" dargestellt werden (fhem-update ist ca 60 sekunden her :) )

Per at-Befehl klappt auch alles. Leerzeichen werden angezeigt.

Internals:
   COMMAND    set fl.dis_Dis displayEP ::T\_{(ReadingsVal("aussen.th", "temperature", ""))}\_H\_{(ReadingsVal("aussen.th", "humidity", ""))},none off 2 5
   DEF        +*01:00 set fl.dis_Dis displayEP ::T\_{(ReadingsVal("aussen.th", "temperature", ""))}\_H\_{(ReadingsVal("aussen.th", "humidity", ""))},none off 2 5
   NAME       a_tmp_fl.dis
   NR         371
   NTM        14:26:22
   PERIODIC   yes
   RELATIVE   yes
   REP        -1
   STATE      Next: 14:26:22
   TIMESPEC   01:00
   TRIGGERTIME 1471609582.07561
   TRIGGERTIME_FMT 2016-08-19 14:26:22
   TYPE       at
   Readings:
     2016-08-19 13:26:22   state           Next: 14:26:22
Attributes:
   room       Flur


Beim Doif kommen aber die ß:

Internals:
   DEF        ([TFOpen.warn] eq "none")  ({fhem ("set fl.dis_Dis displayEP Fenster,ok:-,none: off 0 0 off");;fhem("set fl.dis_Dis displayEP ::T\_{(ReadingsVal("aussen.th", "temperature", ""))}\_H\_{(ReadingsVal("aussen.th", "humidity", ""))},none off 2 5") })
DOELSE
({ fhem ("set fl.dis_Dis displayEP Fenster,none:offen,info:,none off 2 5 off");;fhem("set fl.dis_Dis displayEP ::T\_{(ReadingsVal("aussen.th", "temperature", ""))}\_H\_{(ReadingsVal("aussen.th", "humidity", ""))},none off 2 5")})

   NAME       di_fl.dis
   NR         370
   NTFY_ORDER 50-di_fl.dis
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2016-08-19 13:29:34   Device          TFOpen.warn
     2016-08-19 13:29:34   cmd             1
     2016-08-19 13:29:34   cmd_event       TFOpen.warn
     2016-08-19 13:29:34   cmd_nr          1
     2016-08-19 13:29:34   e_TFOpen.warn_STATE none
     2016-08-19 13:29:34   state           cmd_1
   Condition:
     0          InternalDoIf($hash,'TFOpen.warn','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "none"
   Devices:
     0           TFOpen.warn
     all         TFOpen.warn
   Do:
     0:
       0          {fhem ("set fl.dis_Dis displayEP Fenster,ok:-,none: off 0 0 off");;fhem("set fl.dis_Dis displayEP ::T\_{(ReadingsVal("aussen.th", "temperature", ""))}\_H\_{(ReadingsVal("aussen.th", "humidity", ""))},none off 2 5") }
     1:
       0          { fhem ("set fl.dis_Dis displayEP Fenster,none:offen,info:,none off 2 5 off");;fhem("set fl.dis_Dis displayEP ::T\_{(ReadingsVal("aussen.th", "temperature", ""))}\_H\_{(ReadingsVal("aussen.th", "humidity", ""))},none off 2 5")}
   Helper:
     event      none
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   TFOpen.warn
     timerevent none
     triggerDev TFOpen.warn
     timerevents:
       none
     timereventsState:
       state: none
     triggerEvents:
       none
     triggerEventsState:
       state: none
   Internals:
     0           TFOpen.warn:STATE
     all         TFOpen.warn:STATE
   Itimer:
   Readings:
   Regexp:
     0:
     All:
   State:
   Trigger:
Attributes:
   room       Wohnung


Habe ich da was übersehen?

Edit:

Lässt sich auch hiermit reproduzieren:

{fhem ("set fl.dis_Dis displayEP Fenster,ok:-,none: off 0 0 off");;fhem("set fl.dis_Dis displayEP ::T\_12.3\_H\_45.6,none off 2 5") }

martinp876

ZitatHabe ich da was übersehen?
ja.
na ja, schlecht zu sehen. wenn du "fhem" nutzt wird das \ schon interpretiert - wird also nicht an CUL_HM weitergeleitet. also musst du es doppeln

{fhem ("set fl.dis_Dis displayEP Fenster,ok:-,none: off 0 0 off");;fhem("set fl.dis_Dis displayEP ::T\\_12.3\\_H\\_45.6,none off 2 5") }

darkness


juelich

Hallo, ich habe heute obiges Display erhalten. Beim Anlernen in FHEM wird dieses allerdings als unbekanntes Gerät erkannt. Ich habe sowohl ein Update FHEM als auch ein Update Force gemacht.
Was mache ich falsch?
Liebe Grüße

Markus

martinp876

poste ein List und ggf. sniffe das Anlernen.

juelich

Guten Morgen,

ich habe heute Nacht noch mehrfach ein Update gemacht und das System neu gestartet - und plötzlich ging es. Allerdings zunächst mit dem hier schon beschriebenen Syntax-Fehlern. Nach erneutem Update heute Morgen funktioniert jetzt auch die Textanzeige.
Also vielen Dank und einen schönen Sonntag

Markus

budy

Moin,

ich kriege aus meinem Device keinen Sound raus - kann es das überhaupt? Steht zwar in der Hilfe zu dispayEP drin, macht aber bei mir nix.
Außerdem scheine ich die LED immer nur einmal blinken lassen zu können - geht das evtl. auch anders?

Gruß,
Stephan


Debian stretch, FHEM 5.9.
HM-CC-RT-DN, HM-ES-PMSw1-Pl, HM-LC-Dim1TPBU-FM, HMUARTLGW, HMLAN, HM-SEC-KEY, HM-SEC-RHS, HM-SEC-SC-2, HM-SEC-SCo, HM-SEC-SD-2, HM-OU-CFM-TW, div. HUEs, Wifilight, Ring Video Pro

zap

Zitat von: budy am 31 August 2016, 12:36:29
Moin,

ich kriege aus meinem Device keinen Sound raus - kann es das überhaupt? Steht zwar in der Hilfe zu dispayEP drin, macht aber bei mir nix.
Außerdem scheine ich die LED immer nur einmal blinken lassen zu können - geht das evtl. auch anders?

Gruß,
Stephan

Ton geht und mehrfaches Blinken auch.

2xCCU3 mit ca. 100 Aktoren, Sensoren
Entwicklung: FHEM auf Proxmox Debian VM
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: HMCCU, (Fully, AndroidDB)

budy

Wie machst du das?

Gruß,
Stephan
Debian stretch, FHEM 5.9.
HM-CC-RT-DN, HM-ES-PMSw1-Pl, HM-LC-Dim1TPBU-FM, HMUARTLGW, HMLAN, HM-SEC-KEY, HM-SEC-RHS, HM-SEC-SC-2, HM-SEC-SCo, HM-SEC-SD-2, HM-OU-CFM-TW, div. HUEs, Wifilight, Ring Video Pro