Autor Thema: Motorisierte TV-Wandhalterung einigermaßen winkelgenau einstellen  (Gelesen 349 mal)

Offline Prof. Dr. Peter Henning

  • Developer
  • Hero Member
  • ****
  • Beiträge: 5727
Ich habe mir diese schwenkbare Wandhalterung geleistet: https://www.amazon.de/RICOO-Wandhalterung-SE2544-Fernsehhalterung-Fernsteuerung/dp/B00IAM45KQ

Mit etwas Mühe habe ich meine Harmony-Fernbedienung dazu gebracht, das Teil zu steuern (Kommandos Links, Rechts,OK).

Nächster Schritt: einigermaßen winkelgenau Ansteuerung mit FHEM. Dazu ein einfaches Modell:
- Beim Anlauf dauert es einen Moment, bis die volle Schwenkgeschwindigkeit erreicht wird, und beim Abstoppen dauert es auch einen Moment, bis das Ding steht. Die Summe dieser beiden Zeiten ist startstoptime. Die Schwenkgeschwindigkeit beträgt velocity Grad pro Sekunde.

Diese Werte, so wie die gegenwärtige Position position stecken als Readings in einem Dummy,
Internals:
   NAME       Wandhalterung
   NR         199
   STATE      0°
   TYPE       dummy
   READINGS:
     2018-06-15 17:49:02   oldposition     0
     2018-06-15 17:49:02   position        0
     2018-06-15 17:47:12   startstoptime   4.0
     2018-06-15 17:48:08   state           reset
     2018-06-15 17:46:24   velocity        3.8
Attributes:
   group      Harmony
   readingList position oldposition startstoptime velocity
   room       Multimedia
   setList    reset:noArg position startstoptime velocity
   stateFormat position°

Zusätzlich gibt es ein notify:
Internals:
   CFGFN     
   DEF        Wandhalterung:(position|reset).* {setWHposition($EVENT)}
   NAME       Wandhalterung_IF
   NR         2888
   NTFY_ORDER 50-Wandhalterung_IF
   REGEXP     Wandhalterung:(position|reset).*
   STATE      2018-06-15 17:49:02
   TYPE       notify
   READINGS:
     2018-06-15 17:08:13   state           active
Attributes:
   group      Harmony
   room       Multimedia
durch das ein Codeschnipsel in der zugehörigen myUtils aufgerufen wird.
##############################################################################
#
#  Wandhalterung
#
##############################################################################

sub setWHposition($){
  my ($event) = @_;
  my ($dummy,$target) = split(" ",$event);
 
  #-- hash of position dummy
  my $name     = "Wandhalterung";
  my $hash     = $defs{$name};
  my $current  = ReadingsVal($name,"oldposition",0);
 
  #-- reset
  if( $dummy eq "reset"){
    fhem("set harmony_55193254 command Rechts");
    readingsSingleUpdate( $hash, "position", 0, 0 );
    readingsSingleUpdate( $hash, "oldposition", 0, 0 );
    return
  }

  #-- parameters
  my $velo     = ReadingsVal($name,"velocity",0);
  my $stime    = ReadingsVal($name,"startstoptime",0);
 
  my $dir  = "";
  my $time = 0;
  if( $target > $current){
    $dir  = "Links";
    $time = ($target-$current)/$velo - $stime/2;
  }elsif( $target < $current){
    $dir = "Rechts";
    $time = ($current-$target)/$velo - $stime/2;
  }else{
    Log 1,"[SetWHposition] cannot determine current=$current / target=$target";
    return
  }
 
  Log 1,"[SetWHposition] current=$current target=$target dir=$dir time=$time";
 
  #-- execute
  RemoveInternalTimer($hash);
  fhem("set harmony_55193254 command ".$dir);
  InternalTimer(gettimeofday()+ $time, "setWHstop",$hash,0);
  readingsSingleUpdate( $hash, "oldposition", $target, 0 );
  return
}

sub setWHstop(){
  fhem("set harmony_55193254 command OK");
}

Funktioniert nach einigem Spielen mit den Parametern bis auf 5 Grad genau aus der Ruheposition. Zum Verfahren zwischen Positionen muss ich das Modell noch etwas verbessern.

LG

pah