Aktuelles TV-Programm in FHEM

Begonnen von Kuzl, 20 Oktober 2014, 20:41:43

Vorheriges Thema - Nächstes Thema

Kusselin

#960
Hi Joachim,

wenn ich {tvDownload()} eingebe in die WEb zeile von Fhem kommt:

Undefined subroutine &main::tvDownload called at (eval 6624) line 1.

Gruss

EDIT: dann stimmt doch aber das Wiki nicht!! Ich gehe genauso vor!!

MadMax-FHEM

Hast du die Sub auch in der myUtils!?

Wie hast du sie in die myUtils rein?

reload myUtils.pm gemacht?
(Name nat. anpassen!)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Kusselin

Hallo Joachim..ich habe das Hier so in die 99_myUtils reinkopiert

######################TV Programm ####################################

sub rgUnfold($$)
{
  my ($device, $reading) = @_;
  my $title = ReadingsVal($device, $reading.'title', 'na');
  my $desc = ReadingsVal($device, $reading.'stitle', 'na')."\n\n".
             ReadingsVal($device, $reading.'desc', 'na');

  $title =~ s/(.{1,45}|\S{46,})(?:\s[^\S\r\n]*|\Z)/$1<br>/g;
  $desc =~ s/<br>/\n/g;
  $desc =~ s/(.{1,65}|\S{66,})(?:\s[^\S\r\n]*|\Z)/$1<br>/g;
  $desc =~ s/[\r\'\"]/ /g;
  $desc =~ s/[\n]|\\n/<br>/g;
  return "<a href=\"#!\" onclick=\"FW_okDialog('".$desc."')\">".$title."</a>";
}


wie im wiki beschrieben

Gruss

MadMax-FHEM

Ah die Funktion kommt in eine eigene pm-Datei...

Aber auch die muss "geladen" werden...

Ah, ok, sorry.

Aber die pm-Datei hast du angelegt:


/opt/fhem/tv/tv.pl


Weil dann hiermit der download erfolgt:


perl /opt/fhem/tv/tv.pl dmy_TV download


Hab das Wiki etc. nur auf dem Handy "überflogen"... ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Kusselin

Ja wie jetzt??? muss ich eine eigene Datei anlegen????

ja habe mit Notepad++ eine tv.pl Datei gemacht und abgespeichert als text.file dann habe ich die in den Ordner

/opt/fhem/tv/ kopiert...dann in cd /opt/fhem/tv und dann

sudo chown fhem:dialout /opt/fhem/tv über Konsole....

darin die .pngs auch noch mit rechten versetzt...werden auch angezeigt..aber die verflixte datei die noch im tv ordner drin sein muss bzw. die sich ergibt wenn man downloaded die geht nicht bzw der download funzt net :-(

Gruss

MadMax-FHEM

#965
Warum machst du (immer) nur so ähnlich wie geschrieben!? ;)

Und ja: steht doch im Wiki

Zitat
Perl Script einrichten:
Den folgenden Code in die Datei tv.pl kopieren und in den Ordner /opt/fhem/tv/tv.pl kopieren:

Und dann kommt das Script...

Warum Notepad++!?
(Gut besser als wie Notepad etc. ;)  )

Warum "txt-Datei"?

Es soll eine .pl-Datei sein und ausführbar...

Was sagt denn:


ls- la /opt/fhem/tv/


EDIT: Und egal wie, kann ich nicht glauben, dass bei "perl /opt/fhem/tv/tv.pl dmy_TV download" kein Fehler kam...

EDIT2: du machst aber schon Variante 2!?

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Kusselin

dann kommt:
pi@raspberrypi:~ $ ls- la /opt/fhem/tv/
-bash: ls-: Kommando nicht gefunden.


und ich mach das mit dem Script so, weil ich mir noch nicht so sicher bin mit den Linux befehlen auf der Konsole.....

und dann kommt bei perl /opt/fhem/tv/tv.pl dmy_TV download

pi@raspberrypi:~ $ perl /opt/fhem/tv/tv.pl dmy_TV download
pi@raspberrypi:~ $


der prompt wieder.....

kann man mit Notepad++ eine .pl speichern?

MadMax-FHEM

Oh entschuldige!

Mann, langsam könntest du schon mal etwas Linux können, ist ja nicht das erste Mal dass du einen Verzeichnisanzeige-Befehl benutzt! ;)

Und wie immer: bevor du etwas in die Console kloppfst darfst du schon mitdenken...

Der Befehl lautet natürlich:


ls -la /opt/fhem/tv/


Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Kusselin

pi@raspberrypi:~ $ ls -la /opt/fhem/tv/
insgesamt 16
drwxr-xr-x  2 fhem dialout 4096 Jan 19 13:48 .
drwxr-xr-x 14 fhem dialout 4096 Jan 19 15:02 ..
-rwxr--r--  1 fhem dialout 7878 Jan 19 13:48 tv.pl

MadMax-FHEM

Zitat von: Kusselin am 19 Januar 2019, 19:58:14
und ich mach das mit dem Script so, weil ich mir noch nicht so sicher bin mit den Linux befehlen auf der Konsole.....

Wird aber schon langsam Zeit ;)


Zitat von: Kusselin am 19 Januar 2019, 19:58:14
und dann kommt bei perl /opt/fhem/tv/tv.pl dmy_TV download

pi@raspberrypi:~ $ perl /opt/fhem/tv/tv.pl dmy_TV download
pi@raspberrypi:~ $


der prompt wieder.....

Hm, eigenartig...
Weil es sind ja (theoretisch) schon ein paar Ausgaben eingebaut..


Zitat von: Kusselin am 19 Januar 2019, 19:58:14
kann man mit Notepad++ eine .pl speichern?

Wenn man es richtig macht: bestimmt ;)

Wie machst du es denn?
Wichtig ist halt, dass es mit Linux/Unix Zeilenumbrüchen abgespeichert wird...
Wie kommt die Notepad++ Datei den auf den PI?
Wie bist du verbunden?
WinSCP o.ä.?

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

MadMax-FHEM

Ok, die Datei ist schon mal da...

Was bringt denn:


cat /opt/fhem/tv/tv.pl


Und wenn es hier weiterhin NICHT um das eigentliche Code-Schnipsel sondern um LINUX etc. Zeugs geht, sollten wir wohl (mal wieder ;)  ) "auslagern"...

Bevor das hier den ganzen Thread "zerschießt"...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Kusselin

pi@raspberrypi:~ $ cat /opt/fhem/tv/tv.pl
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Date::Parse;
use Encode qw(encode_utf8 decode_utf8);
use XML::Bare 0.53 qw(forcearray);
use Data::Dumper;

my $channelFilter = qr/^(?:ARD|ZDF|Sat1|RTL|RTL2|Pro7|DMax|Vox|Kabel)/;
my $timeAdjust = 0;
#my $channelFilter = qr/^(?:ARD|ZDF|SAT\.1|RTL$|RTL II|PRO 7|DMAX|VOX|KABEL 1)/;
#my $timeAdjust = 86400;


my $redt = qr/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(?:\s+([+-]\d{4}))?$/;


sub xmltv2epoch($)
{
  my $dt = shift;

  if ($dt =~ $redt)
  {
    if (defined($7))
    {
      return $1.'-'.$2.'-'.$3.' '.$4.':'.$5.':'.$6.' '.$7;
    }
    else
    {
      return $1.'-'.$2.'-'.$3.' '.$4.':'.$5.':'.$6;
    }
  }

  return '2000-01-01 00:00:00';
}

sub FmtDateTime($)
{
  my @t = localtime(shift);
  return sprintf("%04d-%02d-%02d %02d:%02d:%02d", $t[5]+1900, $t[4]+1, $t[3], $t[2], $t[1], $t[0]);
}

sub filterText($)
{
  my $text = shift;

  $text =~ s/["`;'\r]//g;
  $text =~ s/[\n]/<br>/g;

  return $text;
}

sub tvParse($)
{
  my $device = shift;
  my $obj = XML::Bare->new(file => '/opt/fhem/tv/rytecDE_Basic');
  my $xml = $obj->parse();
  my $lastChannel = '';
  my $reading = '';
  my $i = 0;
  my $n = 0;
  my $primeTime = substr(FmtDateTime(time() - $timeAdjust), 0, 11).'20:14:00';
  my $sendTelnet = '';

  if (!$@)
  {
    foreach (@{forcearray($xml->{'tv'}{'programme'})})
    {
      if ($_->{'channel'}{'value'} =~ $channelFilter)
      {
        my $stop = str2time(xmltv2epoch($_->{'stop'}{'value'}));

        # filter old stuff
        if (($stop + $timeAdjust) >= time())
        {
          if ($lastChannel ne $_->{'channel'}{'value'})
          {
            $lastChannel = $_->{'channel'}{'value'};
            $reading = $_->{'channel'}{'value'};
            $reading =~ s/[\.\s]//g;
            $reading =~ s/de$//;
            $i = 0;
            $n = 0;
          }

          if ($i < 3)
          {
            my $fi = sprintf("%03d", $i);
            my $start = str2time(xmltv2epoch($_->{'start'}{'value'}));
            my $readingName;
            my $readingValue;

            $readingName = 'next_'.$reading.'_'.$fi.'_bdate';
            $readingValue = substr(FmtDateTime($start), 0, 10);
            $sendTelnet = "setreading $device $readingName $readingValue";

            $readingName = 'next_'.$reading.'_'.$fi.'_btime';
            $readingValue = substr(FmtDateTime($start), 11, 8);
            $sendTelnet .= ";setreading $device $readingName $readingValue";

            $readingName = 'next_'.$reading.'_'.$fi.'_edate';
            $readingValue = substr(FmtDateTime($stop), 0, 10);
            $sendTelnet .= ";setreading $device $readingName $readingValue";

            $readingName = 'next_'.$reading.'_'.$fi.'_etime';
            $readingValue = substr(FmtDateTime($stop), 11, 8);
            $sendTelnet .= ";setreading $device $readingName $readingValue";

            $readingName = 'next_'.$reading.'_'.$fi.'_title';
            $readingValue = filterText(@{forcearray($_->{'title'})}[0]->{'value'});
            $sendTelnet .= ";setreading $device $readingName $readingValue";

            $readingName = 'next_'.$reading.'_'.$fi.'_stitle';
            if (exists($_->{'sub-title'}{'value'}))
            {
              $readingValue = filterText($_->{'sub-title'}{'value'});
            }
            else
            {
              $readingValue = 'na';
            }
            $sendTelnet .= ";setreading $device $readingName $readingValue";

            $readingName = 'next_'.$reading.'_'.$fi.'_desc';
            if (exists($_->{'desc'}{'value'}))
            {
              $readingValue = filterText($_->{'desc'}{'value'});
            }
            else
            {
              $readingValue = 'na';
            }
            $sendTelnet .= ";setreading $device $readingName $readingValue";

            my $result = `perl /opt/fhem/fhem.pl 7072 "$sendTelnet"`;

            $i++;
          }

          if ($n < 3)
          {
            my $start = str2time(xmltv2epoch($_->{'start'}{'value'}));
            my $fmtStart = FmtDateTime($start);
            my $bdate = substr($fmtStart, 0, 10);
            my $btime = substr($fmtStart, 11, 8);

            if ($bdate.' '.$btime gt $primeTime)
            {
              my $fn = sprintf("%03d", $n);
              my $readingName;
              my $readingValue;

              $readingName = 'prime_'.$reading.'_'.$fn.'_bdate';
              $readingValue = substr(FmtDateTime($start), 0, 10);
              $sendTelnet = "setreading $device $readingName $readingValue";

              $readingName = 'prime_'.$reading.'_'.$fn.'_btime';
              $readingValue = substr(FmtDateTime($start), 11, 8);
              $sendTelnet .= ";setreading $device $readingName $readingValue";

              $readingName = 'prime_'.$reading.'_'.$fn.'_edate';
              $readingValue = substr(FmtDateTime($stop), 0, 10);
              $sendTelnet .= ";setreading $device $readingName $readingValue";

              $readingName = 'prime_'.$reading.'_'.$fn.'_etime';
              $readingValue = substr(FmtDateTime($stop), 11, 8);
              $sendTelnet .= ";setreading $device $readingName $readingValue";

              $readingName = 'prime_'.$reading.'_'.$fn.'_title';
              $readingValue = filterText(@{forcearray($_->{'title'})}[0]->{'value'});
              $sendTelnet .= ";setreading $device $readingName $readingValue";

              #print $readingValue."\n";

              $readingName = 'prime_'.$reading.'_'.$fn.'_stitle';
              if (exists($_->{'sub-title'}{'value'}))
              {
                $readingValue = filterText($_->{'sub-title'}{'value'});
              }
              else
              {
                $readingValue = 'na';
              }
              $sendTelnet .= ";setreading $device $readingName $readingValue";

              $readingName = 'prime_'.$reading.'_'.$fn.'_desc';
              if (exists($_->{'desc'}{'value'}))
              {
                $readingValue = filterText($_->{'desc'}{'value'});
              }
              else
              {
                $readingValue = 'na';
              }
              $sendTelnet .= ";setreading $device $readingName $readingValue";

              my $result = `perl /opt/fhem/fhem.pl 7072 "$sendTelnet"`;

              $n++;
            }
          }
        }
      }
    }

    system('/opt/fhem/fhem.pl 7072 "'.$sendTelnet.'"');
  }
}

sub tvDownload()
{
  # other server
  # http://www.xmltvepg.nl/rytecDE_Basic.xz
  # http://91.121.106.172/~rytecepg/epg_data/rytecDE_Basic.xz
  # http://www.vuplus-community.net/rytec/rytecDE_Common.xz
  # http://www.xmltvepg.nl/rytecDE_Common.xz
  # http://91.121.106.172/~rytecepg/epg_data/rytecDE_Common.xz
  # http://www.vuplus-community.net/rytec/rytecDE_SportMovies.xz
  # http://www.xmltvepg.nl/rytecDE_SportMovies.xz
  # http://91.121.106.172/~rytecepg/epg_data/rytecDE_SportMovies.xz
  my $output = qx(wget http://www.vuplus-community.net/rytec/rytecDE_Basic.xz -O /opt/fhem/tv/rytecDE_Basic.xz 2>&1);
  #print $output;
  $output = qx(xz -df /opt/fhem/tv/rytecDE_Basic.xz 2>&1);
  #print $output;
}


my $d = shift || die "Need a device!\n";
my $m = shift || die "Need a mode!\n";

if ('download' eq $m)
{
  tvDownload();
}
elsif ('parse' eq $m)
{
  tvParse($d);
}

exit;pi@raspberrypi:~ $

MadMax-FHEM

#972
Hmm, eigenartig.

Sieht erst mal ok aus.

Allerdings führst du das Script als User pi aus.
Es darf aber laut Berechtigung nur von fhem ausgeführt werden.
Machst auch Sinn, weil ja auch später die Dateien etc. von fhem gebraucht werden...

Das "perl" vorne dran sollte eigentlich auch unnötig sein, das wird ja schon hierdurch "#!/usr/bin/perl" gefordert...


EDIT: und BITTE! vor dem Absetzen der Befehle mal drüberschauen und auch nachdenken, Verschreibsler nicht ausgeschlossen! ;)


Versuch doch mal:


sudo -su fhem bash


Und dann das Kommando:


cd /opt/fhem/tv


Und dann:


./tv.pl dmy_TV download


Bzw. (aber wie geschrieben eigentlich unnötig):


perl /opt/fhem/tv/tv.pl dmy_TV download


Wenn es dann nicht geht, dann weiß ich auch nicht...

Bzw. dann mal echt auslagern, vielleicht "stolpern" dann noch mal ein paar Linuxer drüber...
...wie letztes Mal ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Kusselin

Tja Joachim..bei mir läufts nie rund....

schau:
pi@raspberrypi:~ $ sudo -su fhem bash
fhem@raspberrypi:/home/pi$ cd /opt/fhem/tv
fhem@raspberrypi:~/tv$ ./tv.pl
bash: ./tv.pl: /usr/bin/perl^M: Defekter Interpreter: Datei oder Verzeichnis nicht gefunden
fhem@raspberrypi:~/tv$



MadMax-FHEM

#974
Gut, wieder nicht gemacht: also drüber geschaut und nachgedacht! ;)


Weil der Befehl heißt:


./tv.pl dmy_TV download


Habe ich eben korrigiert...


Hmmm, also doch irgendwas mit der Datei...

Kannst du dich per putty etc. verbinden?

Dann mal einloggen (also als pi) und dann:


sudo -su fhem bash



mv /opt/fhem/tv/tv.pl /opt/fhem/tv/tv.pl.sav



nano /opt/fhem/tv/tv.pl


dann aus dem Wiki den Code kopieren und dann per rechte Maus plus Einfügen in das "nano-Editor-Fenster" einfügen.
dann: "ctrl + o" (oder auch strg + o) und dann "ctrl + x" (strg + x)

Dann:


sudo chown fhem:dialout /opt/fhem/tv/tv.pl

(unnötig eigentlich aber schadet nicht ;)  )


sudo chmod +x /opt/fhem/tv/tv.pl


Und dann noch mal ausführen...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)