Neuer Funkgong von Homematic HM-OU-CFM-TW

Begonnen von Pedali, 16 Januar 2016, 14:35:40

Vorheriges Thema - Nächstes Thema

StefanD

Danke für das Anpassen der 10_CULHM.pm, das Abspielen der MP3s funktioniert nun tadellos.

Da der MP3-Funkgong zum Abspielen der MP3s noch andere Parameter benötigt als HM-OU-CFM-PL bin ich meinen Ansatz mit dem Dummy je MP3 weiter nachgegangen und habe es so gelöst:

exemplarischer Dummy:
define dmy_MP3_010 dummy
attr dmy_MP3_010 room _MP3
attr dmy_MP3_010 userattr mp3_toneID mp3_duration
attr dmy_MP3_010 mp3_toneID 010
attr dmy_MP3_010 mp3_duration 3
set dmy_MP3_010 Bitte das Bad lueften


Den Status des Dummy habe ich mit dem ausgegebenen Text gesetzt. Dadurch sieht man direkt, hinter welchem Dummy welche Ausgabe steckt.


Funktion in der 99_myUtil.pm:
#############################################################
# MP3 auf MP3-Funkgong spielen
# Aufrufen mit {playMp3_Funkgong(MP3-Dummy,Volume)}   
# Aufrufen mit {playMp3_Funkgong(dmy_MP3_010,5)}                                             
#############################################################

my $playMp3_Funkgong;
sub playMp3_Funkgong($$)
{
my ($pMp3dummy, $pVolume) = @_;
my $_toneId = AttrVal($pMp3dummy,"mp3_toneID","0");
my $_duration = AttrVal($pMp3dummy,"mp3_duration","5");
fhem "set MP3DingDongOben_Mp3 playTone $_toneId 1 $pVolume $_duration";
}


Da ich aktuell nur bedarf für einen MP3-Funkgong habe, habe ich das Device nicht als Übergabeparameter definiert. Gleiches gilt für die Anzahl der Wiederholungen.
Da die abzuspielende Lautstärke durchaus variieren kann, z.B. nach der x-ten Wiederholung einer Aufforderung  ::), habe ich die lieber als Übergabeparameter.

Das Abspielen wird dann bei mir in einem DOIF mit {playMp3_Funkgong(dmy_MP3_010,5)} initiiert.

VG
Stefan
HW: Intel NUC8i5 mit ESXi7 mit Ubuntu Server 18.04 LTS und FHEM als DockerContainer

om

Hallo Martin

kannst Du bitte bei Gelegenheit die Codes von Andreas/hartwiga in CUL_10.pm integrieren?
Danke
Gruß
Oliver
FHEM 5.8 Odroid C2 : Homematic, FS20, Harmony, Alexa (alexa-fhem) IT, Max, LaCrosse, Hue, Sonos, ha-bridge, CO2, FRM, HMS, VCONTROL, 1-wire, FB7490

martinp876


MarcelK

Zitat von: hartwiga am 25 März 2016, 19:58:23

  • Die zusätzlichen Farben blueL, blueS, violettL, violettS, cyanL, cyanS, whiteL, und whiteS werde unterstützt
  • Den Farbwert orangeX ist geändert auf yellowX
  • Die max. Ausführungszeit kann optional auch angegeben werden 1...10800sek
z.B set DONGDONG led redL 4 20 10 # rote LED viermal lang blinken und das 20 mal wiederholen.  Nach 10s wird die Sequenz aber beendet
Ist das nur theoretisch so oder wird das wirklich nach 10 Sekunden beendet? Bei anderen MP3 Gongs war das eine Fließkomma-Zahl, allerdings passten die Angaben zu Exponent und Mantisse die ich bisher gefunden habe irgendwie nicht so ganz zusammen, daher hatte ich das damals noch weggelassen: https://forum.fhem.de/index.php?topic=45074.0

Gruß Marcel

MarcelK

#49
Eben nochmal gecheckt, beim HM-OU-CM-PCB ist der Duration Wert ein Float mit 5 bit Exponent und 11 Bit Mantisse, Exponent beginnt dabei bei Bit 0: 0bmmmmmmmmmmmeeeee und der Wert an sich ist in 1/10s. Das Maximum liegt bei 108000s, was eine Hex-Wert von 0x83CA entspricht. Da die Message beim HM-OU-CFM-TW komplett identisch zu sein scheint würde es mich sehr wundern wenn es hier anders wäre. Daher macht auch ein Special-Case für den HM-OU-CFM-TW im Code vermutlich keinen Sinn.

Mein Vorschlag:
  elsif($cmd eq "playTone") { #################################################
    my $msg;
    if ($a[2] eq 'replay'){
      $msg = ReadingsVal($chnHash->{NAME},".lastTone","");
    }
    else{
      my @itemList = split(',',$a[2]);
      my $repeat = (defined $a[3] && $a[3] =~ m/^(\d+)$/)?$a[3]:1;
      my $itemCnt = int(@itemList);
      my $volume = (defined $a[4] && $a[4] =~ m/^(\d+)$/)?$a[4]:10;
      my $duration = (defined $a[5] && $a[5] =~ m/^(\d+\.)?\d+$/)?$a[5]:108000;
      return "no more than 10 entries please"  if ($itemCnt>10);
      return "repetition $repeat out of range [1..255]"
            if($repeat < 1 || $repeat > 255);
      return "volume $volume out of range [0..10]"
            if($volume < 0 || $volume > 10);
      return "duration $duration out of range [0.1..108000]"
          if($duration < 0.1 || $duration > 108000);
      #<volume><multiply><MP3><MP3>
      my $msgBytes = sprintf("%02X%02X",$volume*20,$repeat);

      foreach my $mp3 (@itemList){
        return "input: $mp3 is not an integer below 255"
           if (!defined $mp3 || $mp3 !~ /^[+-]?\d+$/ || $mp3 > 255);
        $msgBytes .= sprintf("%02X",$mp3);
      }
      # need to fill up empty locations  for MP3 numbers
      $msgBytes = substr($msgBytes."00000000000000000000",0,(10+2)*2);

      # add duration as a float value
      my $exponent = 0;
      my $mantisse = $duration * 10;
      while ($mantisse >= 2048) {
        $mantisse = $mantisse >> 1;
        $exponent++;
      }
      $duration = $mantisse << 5 | $exponent;
      $msgBytes .= sprintf("%04X", $duration);
      $msg = '++'.$flag.'11'.$id.$dst.'80'.$chn.$msgBytes;
      CUL_HM_UpdtReadSingle($chnHash,".lastTone",$msg,0);
    }
    CUL_HM_PushCmdStack($hash,$msg) if ($msg);
  }


Dieser funktioniert mit HM-OU-CM-PCB und ich wette auch mit HM-OU-CFM-TW.

Gruß Marcel

martinp876


MarcelK

Bezüglich Deines Kommentars "#$duration = CUL_HM_decodeTime16($duration * 10);# need to be tested" im Source, man kann das tatsächlich folgendermaßen kürzen (getestet)
# add duration as a float value
$msgBytes .= CUL_HM_encodeTime16($duration);

Ich hab das nicht erkannt weil der Code von encodeTime16, nicht zuletzt durch das implizite *10, sagen wir mal etwas schwer zu interpretieren ist. Er hat außerdem einen kleinen Bug der im Grenzbereich unnormalisierte Zahlen generiert (Beispiel 204.7 ergibt 0x7FE1 statt 0xFFE0):

  for(my $i = 0; $i < 32; $i++) {
-    if($v*$mul < 0x7ff) {
+    if($v*$mul <= 0x7ff) {
      $ret=sprintf("%04X", ((($v*$mul)<<5)+$i));


Gruß Marcel

martinp876

Danke. Dann kann man diese Funktion als Standard nutzen. Bislang war sie nur der Vollständigkeit halber vorhanden.

Svnm

Hallo,

ich wollte in den nächsten Tagen den Funkgong bestellen und Frage mich nun, wie weit die Integration in Fhem fortgeschritten ist. Ist ein einfaches einbinden des Funkgongs und das Steuern von einzelnen Sounds bereits möglich?

hartwiga

Für mich funktioniert jetzt alles so wie ich es benötige... nur der Batteriestatus wird noch nicht ausgewertet.

Gruss Andreas

DerFrickler

Zitat von: MMeier67 am 12 April 2016, 12:00:22
Hallo,

ich wollte in den nächsten Tagen den Funkgong bestellen und Frage mich nun, wie weit die Integration in Fhem fortgeschritten ist. Ist ein einfaches einbinden des Funkgongs und das Steuern von einzelnen Sounds bereits möglich?

Ich habe das Teil heute bekommen, zusammen gebaut und getestet.
Einbindung in FHEM: o.k.
Ansteuern der LED: o.k.
Ansteuern der MP3s: o.k.

Lediglich der Batteriestatus fehlt, ansonsten ein klasse Teil.

Gruß!

DerFrickler

#56
Hallo zusammen,

wie gestalte ich es dass zwei MP3s auch nacheinander abgespielt werden?

          { fhem("set output.unit.Diele_Mp3 playTone 007,011 1 4 5") }

spielt nur 007 ab

          { fhem("set output.unit.Diele_Mp3 playTone 007 1 4 5") }
          { fhem("set output.unit.Diele_Mp3 playTone 011 1 4 5") }

spielt nur 011 ab

Gruß!

Nachtrag:

wie gestalte ich es dass eine MP3 öfter (nicht nur 1 X) abgespielt wird?
hat sich erledigt

martinp876

Logisch. Wenn er den ersten spielen soll schickst du den 2. der aktor schaltet um bevor er begonnen hat

DerFrickler

Es hätte ja auch sein können dass der Autor einen queue enthält und die MP3s der Reihe nach abspielt. Nun ja, dann muss ich halt noch etwas an der Logik rumbasteln, denn ein einfaches Verzögern des zweiten Sprachbefehls wird nicht ausreichen.

Gruß!

MarcelK

Zitat von: DerFrickler am 15 April 2016, 09:32:05
          { fhem("set output.unit.Diele_Mp3 playTone 007,011 1 4 5") }
Das ist die korrekte Syntax. Allerdings begrenzt zu die Spiel-Dauer auf 5s, kann das das Problem sein? Eigentlich können die mp3 Dinger problemlos mehrere mp3 hintereinander aufsagen, solange sie im selben Aufruf angegeben werden.