Übernahme aus der TVPro Merkliste als Timer für Enigma2 Receiver

Begonnen von lcnfrosch, 02 Januar 2016, 17:55:54

Vorheriges Thema - Nächstes Thema

lcnfrosch

Ich habe heute mal etwas gebaut, dass ich schon länger haben wollte. Wenn ich in meiner App "TVPro" Sendungen in die Merkliste lege, möchte ich diese als Timer in meinem Enigma2 basierten Receiver eingetragen haben. Egal ob der Receiver im Standby, an oder aus ist.

Hier also die Kombination:

1. Calendar von TVPro abonnieren (muss in der App aktiviert sein, ich habe den iCloud-Kalender auf dem iPhone freigegeben und die URL kopiert.)
2. Notify Device für neue Einträge: (SATReceiver ist ein ENIGMA2-Modul)
TVProCal:modeUpcoming.* {

my @EVTPART = split(" ", $EVENT);
  my $events = scalar(@EVTPART)-1;
Log 3, "Debug: Name: $NAME, Event: $EVENT count:$events"; 


if ($events == 1) {
   
my $refID = $EVTPART1;
$refID =~ s/;/;;/g;

if (ReadingsVal("SATReceiver","power","off") ne "on") {
fhem("attr TVPower comment $refID");
fhem("attr TVPower disable 0");
fhem("set SATReceiver on");
} else {
fhem("set SATAddRecording $refID");
}
}


}
   
3. Power-Reading des Receivers überwachen:
SATReceiver:.* {

if ($EVTPART0 eq "power:" && $EVTPART1 eq "on") {
   fhem("attr TVPower disable 1");
   my $calID = AttrVal( "TVPower", "comment", "");
   fhem("set SATAddRecording $calID");
}
}

4. dummy device SATAddRecording anlegen
5. Das "Herzstück":
SATAddRecording:.* {

fhem("attr TVPower disable 1");

my @refIDs = split(";",$EVTPART0);
for my $refID (@refIDs) {

my $title = fhem("get TVProCal summary $refID");
my $start = KalenderStartDatum("TVProCal",$refID);
my $end = KalenderEndDatum("TVProCal",$refID);
my $location = fhem("get TVProCal location $refID");

my $ref = urlEncode(SenderName2Ref($location));

Log3 "CAL",3,"SAT: $EVTPART0 , $location, $ref, ".KalenderStartDatum("TVProCal",$refID);

  my $url = "http://192.168.20.43:81/web/timeradd?&sRef=$ref&begin=$start&end=$end&name=".urlEncode($title);


  my $param = {
url        => $url,
timeout    => 5,
method     => "GET",                                                                                  # Lesen von Inhalten
header     => "Accept: text/xml"  # Den Header gemäss abzufragender Daten ändern
};
  my ($err, $data) = HttpUtils_BlockingGet($param);

}


  if (AttrVal("TVPower","comment","") ne "") {
    fhem("deleteattr TVPower comment");
fhem("set SATReceiver off");
  }

}


Leider muss man die Sender aus TVPro in die Info für den Receiver umsetzen, das macht SenderName2Ref.
Ich suche noch eine bessere Möglichkeit, aber im Moment funktioniert das so - ich habe natürlich mehr als nur 2 Sender eingetragen...

Hier also die Funktionen in meiner xx_Utils.pm:


sub SenderName2Ref($) {
my ($string) = @_;

if ($string eq "Discovery HD") {
  return "1:0:19:82:6:85:C00000:0:0:0:";
}

if ($string eq "ZDFneo") {
  return "1:0:19:2B7A:3F3:1:C00000:0:0:0:";
}
return "not found";
}


sub
KalenderStartDatum($$)
{
my ($KalenderName, $KalenderUid) = @_;
my $dt = fhem("get $KalenderName start $KalenderUid");
my @SplitDt = split(/ /,$dt);
my @SplitDate = split(/\./,$SplitDt[0]);
my @SplitTime = split(/\:/,$SplitDt[1]);
my $ret = timelocal($SplitTime[2],$SplitTime[1],$SplitTime[0],$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);

return $ret;
}

sub
KalenderEndDatum($$)
{
my ($KalenderName, $KalenderUid) = @_;
my $dt = fhem("get $KalenderName end $KalenderUid");
my @SplitDt = split(/ /,$dt);
my @SplitDate = split(/\./,$SplitDt[0]);
my @SplitTime = split(/\:/,$SplitDt[1]);
my $ret = timelocal($SplitTime[2],$SplitTime[1],$SplitTime[0],$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);

return $ret;
}





Wenn ich was vergessen habe, einfach fragen.

Gruß,
Stefan