[Q] Hilfe gesucht: Loewe Connect ID DR+ Smart-TV mit FHEM steuern

Begonnen von der.einstein, 08 April 2017, 15:40:50

Vorheriges Thema - Nächstes Thema

der.einstein

Beim ersten Test des provisorischen Moduls bin ich gleich auf ein Problem gestoßen:
Ich verwende "use ..." zum Laden von Modulen zu Beginn des Scripts. Jedoch brauche ich die Funktionen dieser Module "at runtime" z. B. in der Get Funktion. Ein Tipp, den ich gelesen hatte das mit "require" und "Import" zu machen schlug fehl.

Gibt's hier ein bestimmtes Vorgehen, damit ich in einer Funktion des Moduls eine Funktion eines Perl Moduls nutzen kann?
Der Code funktioniert mit der Perl Instanz auf dem Rechner perfekt.

Danke

Gesendet von meinem LG-D855 mit Tapatalk


CoolTux

Also wenn Du das use am Anfang Deiner Moduldatei verwendest, sollte das zusätzliche Perlmodul geladen sein und deren Funktionen zur Verwendung stehen.
Hast Du irgendwas online von Deinem Code?

package main;

my $missingModul = "";

use strict;
use warnings;

use HttpUtils;
use Data::Dumper;   #debugging

eval "use Encode qw(encode encode_utf8 decode_utf8);1" or $missingModul .= "Encode ";
eval "use JSON;1" or $missingModul .= "JSON ";
eval "use IO::Socket::SSL;1" or $missingModul .= "IO::Socket::SSL ";


sub MODULNAME_Initialize($) {


}
...
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

der.einstein

Ich verwende Net::Address::Ethernet, um die MAC Addresse des FHEM Servers auszulesen, diese wird zum Handshake/Pairing mit dem TV benötigt.
Ich hatte angefangen mit einer Version, in der ich von Anfang an alle Funktionen reingepackt hab, die dann GAR NICHT funktioniert hatte  8)
Jetzt hab ich den umgekehrten Weg eingeschlagen und starte mit einem "minimal working example" und füge nach und nach alles hinzu. Unten die Version in der nur das Device "LoeweTV" angelegt und der Geräte-Hash populiert wird. Ein Schritt dabei ist das Platzieren der Server-MAC, was so scheinbar nicht funktioniert. Weder mit "use" noch mit "require". Auf der Kommandozeile klappt beides  :o
Gibt es einen anderen Weg die Server-MAC zu bekommen?

package main;

use strict;
use warnings;
#use LWP::UserAgent;
#use HTTP::Request::Common;
#use XML::Twig;
#use Net::Address::Ethernet;
#require Net::Address::Ethernet;
#Net::Address::Ethernet->import(get_address);
#use Net::Ping::External qw(ping);
#use Net::Wake;
#use Data::Dumper::Simple;

sub LoeweTV_Initialize($) {
    my ($hash) = @_;
    Log3 $hash, 5, "LoeweTV_Initialize: Entering";
    $hash->{GetFn}      = "LoeweTV_Get";
    $hash->{SetFn}      = "LoeweTV_Set";
    $hash->{DefFn}      = "LoeweTV_Define";

    $hash->{AttrList} =
    "ip " .
    "tvmac " .
    "action " .
    "RCkey " .
    "clientid " .
    "fcid:1234 " .
    "status " .
    "connectsuccess " .
    "pingresult:down " .
    "mac " .
    "lastersponse " .
    "lastchunk " .
    "volstate " .
    "mutstate " .
    "curlocator " .
    "curevent " .
    "nextevent " .
    "icon:it_television " ;
    #$readingsFnAttributes;

    }

sub LoeweTV_Define($$) {
    my ( $hash, $def ) = @_;
    my @a = split( "[ \t][ \t]*", $def );
    my $name = $hash->{NAME};
    my $ip = $a[2];
    my $tvmac = $a[3];
    my $fcid = $a[4];
    if ($fcid = undef){$fcid = 1234};
    require Net::Address::Ethernet;
    Net::Address::Ethernet->import(get_address);
    my $mac = &get_address;
    $hash->{ip} = $ip;
    $hash->{tvmac} = $tvmac;
    $hash->{fcid} = $fcid;
    $hash->{mac} = $mac;
    Log3 $name, 5, "LoeweTV $name: called function LoeweTV_Define()";
}

sub LoeweTV_Set($$) {
    my ($hash, $def ) = @_;
    my $name = $hash->{NAME};
    Log3 $name, 5, "LoeweTV $name: called function LoeweTV_Set()";
}

sub LoeweTV_Get($@) {
    my ( $hash, @a ) = @_;
    my $name = $hash->{NAME};

    Log3 $name, 5, "LoeweTV $name: called function LoeweTV_Get()";
}


1;


=pod
=item device
=item summary control for Loewe TV devices via network connection
=item summary_DE Steuerung von Loewe TV Geräten über das Netzwerk
=begin html

<a name="LoeweTV"></a>
<h3>LoeweTV</h3>

=end html

=begin html_DE

<a name="LoeweTV"></a>
<h3>LoeweTV</h3>

=end html_DE

=cut


Im FHEM-Log findet sich bei "use ..." Folgendes:

2017.09.04 19:42:39 1: PERL WARNING: Subroutine LoeweTV_Set redefined at ./FHEM/70_LoeweTV.pm line 57.
2017.09.04 19:42:39 1: PERL WARNING: Subroutine LoeweTV_Get redefined at ./FHEM/70_LoeweTV.pm line 63.
2017.09.04 19:42:48 1: PERL WARNING:  EEE Ifconfig failed: Command 'LC_ALL=C /sbin/ifconfig -a 2>&1', exit code '-1'eth0      Link encap:Ethernet  HWaddr 00:1e:06:33:95:c9 
          inet addr:192.168.0.4  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::21e:6ff:fe33:95c9/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:52078856 errors:0 dropped:0 overruns:0 frame:0
          TX packets:169668467 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:25116688987 (25.1 GB)  TX bytes:185791030866 (185.7 GB)
          Interrupt:40

lo        Link encap:Local Loopback 
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:4096  Metric:1
          RX packets:41281442 errors:0 dropped:0 overruns:0 frame:0
          TX packets:41281442 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:20875284539 (20.8 GB)  TX bytes:20875284539 (20.8 GB)

2017.09.04 19:42:48 1: PERL WARNING: Use of uninitialized value $sName in concatenation (.) or string at /usr/local/share/perl/5.22.1/Net/Address/Ethernet.pm line 102.


Und bei "require..."

2017.09.04 21:41:30 1: PERL WARNING:  EEE Ifconfig failed: Command 'LC_ALL=C /sbin/ifconfig -a 2>&1', exit code '-1'eth0      Link encap:Ethernet  HWaddr 00:1e:06:33:95:c9 
          inet addr:192.168.0.4  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::21e:6ff:fe33:95c9/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:52142910 errors:0 dropped:0 overruns:0 frame:0
          TX packets:169736329 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:25131501846 (25.1 GB)  TX bytes:185827789818 (185.8 GB)
          Interrupt:40

lo        Link encap:Local Loopback 
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:4096  Metric:1
          RX packets:41365015 errors:0 dropped:0 overruns:0 frame:0
          TX packets:41365015 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:20917464955 (20.9 GB)  TX bytes:20917464955 (20.9 GB)

DDD raw output from Ifconfig is $VAR1 = undef;
DDD in get_address, a is $VAR1 = [];
DDD inspecting interface ...
DDD   but it is not active.

CoolTux

Der Gedanke bezüglich MAC oder IP des FHEM Servers ist gut gemeint. Hatte ich bei meinem AMAD Modul auch. Schnell konnte man mich aber eines besseren belehren. Viele FHEM Server haben nicht nur ein Interface. Wie machst Du es da?

Jetzt mal ab von Deinem Problem würde meine Empfehlung da hin gehen das Du dem Anwender das eintragen der MAC über ein Attribut anbietest und bis dahin im state steht das er für ein Pairing die MAC eintragen muß.
Halte Dich erstmal nicht zu lange mit solchen kleinen Dingen auf. Sowas kann man später immer noch ausbauen. So kannst Du zum Beispiel dem User anbieten seine MAC per get Befehl zu erfahren.


Wenn es aber unbedingt die MAC sein muss dann schaue mal wie andere Module sowas machen. Gerade Module die Systeminfos sammeln. SYSMON zum Beispiel.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

der.einstein

#19
Ok, danke für die Info. Ich dacht eben, wenn schon Automatisierung, dann bitte auch die MAC  :P
Nun eben erstmal ohne Auto-MAC (SYSMON kann das meiner Ansicht nach nur bei Fritzboxen?).

Ich hab jetzt eine Modul-Datei, die ich laden kann und ich kann auch ein Device erstellen, ohne dass FHEM dabei abkackt.

Problem: Ich habe es so verstanden, dass Module beim "Laden" nur in den Speicher geholt werden, und die Funktionen erst ausgeführt werden, wenn sie benötigt werden. Außer natürlich LoeweTV_Define, die wird ja beim Erstellen des Device ausgeführt. Jetzt sieht es aber so aus, dass alle Funktionen bereits bei Device-Erstellung ausgeführt werden, zumindest suggerieren das die Debug-Meldungen. Jedenfalls soll der Funktion "LoeweTV_sendRequest" zur Runtime die $action übergeben werden (momentan z.B. "get MyLoewe GetDeviceData"). Das musste ich jetzt aber auskommentieren und sozusagen hardcoden (siehe Script Zeilen 81-84). Das macht natürlich keinen Sinn, aber wenn ich es schreibe, wie konzipiert meckert er (berechtigterweise) darüber, dass keine $action = "LoeweTV" definiert ist, somit bricht er ab ABER BEREITS BEIM DEFINE! Das macht doch keinen Sinn?  ::)
Auf der anderen Seite führt er den Befehl mit "GetDeviceData" brav aus und schreibt mir die Response ins Device Internal "lastresponse".

Hier das Script:

package main;

use strict;
use warnings;
use LWP::UserAgent;
use HTTP::Request::Common;
use XML::Twig;
#use Net::Address::Ethernet;
#require Net::Address::Ethernet;
#Net::Address::Ethernet->import(get_address);
use Net::Ping::External qw(ping);
use Net::Wake;
#use Data::Dumper::Simple;

# Declare functions
sub LoeweTV_Define($$);
sub LoeweTV_Initialize($);
sub LoeweTV_Get;
sub LoeweTV_Set($$);
sub LoeweTV_hostUp;
sub LoeweTV_checkAccess;
sub LoeweTV_sendRequest;

sub LoeweTV_Initialize($) {
    my ($hash) = @_;
    Log3 $hash, 5, "LoeweTV_Initialize: Entering";
    $hash->{GetFn}      = "LoeweTV_Get";
    $hash->{SetFn}      = "LoeweTV_Set";
    $hash->{DefFn}      = "LoeweTV_Define";

    $hash->{AttrList} =
    "ip " .
    "tvmac " .
    "action " .
    "RCkey " .
    "clientid " .
    "fcid " .
    "status:Accepted,Pending,Denied,undef " .
    "connectsuccess:true,false " .
    "pingresult:down,up " .
    "mac " .
    "lastersponse " .
    "lastchunk " .
    "volstate " .
    "mutstate:0,1 " .
    "curlocator " .
    "curevent " .
    "nextevent " .
    $readingFnAttributes;

    }

sub LoeweTV_Define($$) {
    my ( $hash, $def ) = @_;
    my @a = split( "[ \t][ \t]*", $def );
    my $name = $hash->{NAME};
    my $ip = $a[2];
    my $tvmac = $a[3];
    my $fcid = $a[4];
    if ($fcid = undef){$fcid = 1234};
    $hash->{ip} = $ip;
    $hash->{tvmac} = $tvmac;
    $hash->{fcid} = $fcid;
    $hash->{mac} = "";
    $hash->{clientid} = "?";
    $hash->{status} = "Denied";
    Log3 $name, 5, "LoeweTV $name: called function LoeweTV_Define()";
    return undef;
}

sub LoeweTV_Set($$) {
    my ($hash, $def ) = @_;
    my $name = $hash->{NAME};
    Log3 $name, 5, "LoeweTV $name: called function LoeweTV_Set()";
    return undef;
}

sub LoeweTV_Get {
    my ( $hash, @a ) = @_;
    my $name = $hash->{NAME};
    #$hash->{action} = $a[0];
    #$hash->{RCkey} = $a[1];
    $hash->{acion} = "GetDeviceData";
    $hash->{RCkey} = "";
    print "RUNNING SETKEY   \n";
    if (! defined $hash->{RCkey}){$hash->{RCkey} = ""};
    if (! defined $hash->{fcid}){$hash->{fcid} = "1234"};
    &LoeweTV_hostUp($hash,$hash->{ip},$hash->{tvmac},$hash->{mac});
    if (! defined $hash->{clientid}){$hash->{clientid} = "?"};
    &LoeweTV_checkAccess($hash,$hash->{clientid},$hash->{fcid});
    if ($hash->{status} eq "Accepted") {&LoeweTV_sendRequest($hash,$hash->{action},$hash->{RCkey});}
    Log3 $name, 5, "LoeweTV $name: called function LoeweTV_Get()";
    return undef,
}

sub LoeweTV_hostUp {
#my($hash{ip}, $hash{tvmac}, $hash{mac}) = @_;
my ( $hash, @a ) = @_;
my $ip = $a[0];
print "RUNNING PING: ";
if (ping(host=>$ip)) {$hash->{pingresult} = "up";print "ONLINE \n"}else{print "OFFLINE \n";Net::Wake::by_udp($hash->{ip},$hash->{tvmac});Net::Wake::by_udp($hash->{ip},$hash->{tvmac});Net::Wake::by_udp($hash->{ip},$hash->{tvmac});Net::Wake::by_udp($hash->{ip},$hash->{tvmac});Net::Wake::by_udp($hash->{ip},$hash->{tvmac});&LoeweTV_checkAccess($hash,$hash->{clientid},$hash->{fcid});&LoeweTV_sendRequest($hash,"InjectRCKey",22)};
return($hash->{pingresult});
}

sub LoeweTV_checkAccess {
print "RUNNING CHECKACCESS   \n";
#my($clientid,$fcid) = @_;
my ($hash,@a) = @_;
my $n = 1;
while (($hash->{status} ne "Accepted") and ($n<=3)) {$n=$n+1;&LoeweTV_sendRequest($hash,"RequestAccess",0,)};
print "RAN CHECKACCESS: $hash->{status}   \n";
return($hash->{status});
}

sub LoeweTV_sendRequest {
my($hash, $action, $RCkey) = @_;
print "STARTING SENDREQUEST: $action   \n";
if ( ! defined($action)){$action = "GetDeviceData"};
my ($message, $response, $request, $userAgent, $noob, $twig2, $content, $handlers);
our $result ="";
my $header = "<env:Envelope
xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'
xmlns:ltv='urn:loewe.de:RemoteTV:Tablet'>
<env:Body>\n";
my $action_xml1 = " <ltv:$action>\n";
my $header2 = " <ltv:fcid>".$hash->{fcid}."</ltv:fcid>
<ltv:ClientId>".$hash->{clientid}."</ltv:ClientId>\n";
my $action_xml2 = " \n </ltv:$action>";
my $footer = "\n</env:Body>
</env:Envelope>\n";
my %actions = (
        "RequestAccess" => [sub {$content='<ltv:DeviceType>Apple iPad</ltv:DeviceType>
<ltv:DeviceName>FHEM</ltv:DeviceName>
<ltv:DeviceUUID>'.$hash->{mac}.'</ltv:DeviceUUID>
<ltv:RequesterName>Assist Media App</ltv:RequesterName>'},
{'m:ClientId' => sub {$hash->{clientid} = $_->text_only('m:ClientId');},
'm:AccessStatus' => sub {$hash->{status} = $_->text_only('m:AccessStatus');},}
],
        "InjectRCKey",  => [sub {$content='<InputEventSequence>
<RCKeyEvent alphabet="l2700" value="'.$RCkey.'" mode="press"/>
<RCKeyEvent alphabet="l2700" value="'.$RCkey.'" mode="release"/>
</InputEventSequence>'}],
        "GetDeviceData"  => [sub {$content='';$result="m:MAC-Address"}],
        "GetChannelList"    => [sub {$content="<ltv:ChannelListView>".$RCkey."</ltv:ChannelListView>
<ltv:QueryParameters>
<ltv:Range startIndex='".$ARGV[4]."' maxItems='9999'/>
<ltv:OrderField field='userChannelNumber' type='ascending'/>
</ltv:QueryParameters>";$result="m:GetChannelListResponse"}],
"GetListOfChannelLists" => [sub {$content="<ltv:QueryParameters>
<ltv:Range startIndex='".$RCkey."' maxItems='9999'/>
<ltv:OrderField field='userChannelNumber' type='ascending'/>
</ltv:QueryParameters>";$result="m:ResultItemChannelLists"}],
"GetMediaItem"    => [sub {$content='<MediaItemReference mediaItemUuid="'.$RCkey.'"/>';$result="m:ShortInfo"}],
"GetMediaEvent"    => [sub {$content='<MediaEventReference mediaEventUuid="'.$RCkey.'"/>';$result="m:ShortInfo"}],
"GetChannelInfo" => [sub {$content=""}],
"GetCurrentPlayback"    => [sub {$content='';},
{"m:Locator" => sub {$hash->{lastchunk} = $_->text_only();},}
],
"GetCurrentEvent"    => [sub {$content="<ltv:Player>0</ltv:Player>";},
{"m:Name" => sub {$hash->{curevent}[0] = $_->text("m:Name");},
"m:ExtendedInfo" => sub {$hash->{curevent}[1] = $_->text("m:ExtendenInfo");},
"m:Locator" => sub {$hash->{curlocator} = $_->text_only("m:Locator");}},
],
"GetNextEvent"    => [sub {$content="<ltv:Player>0</ltv:Player>";$result="m:GetNextEventResponse"}],
"SetActionField"    => [sub {$content="<ltv:InputText>".$RCkey."</ltv:InputText>";$result="m:Result"}],
"SetVolume"    => [sub {$content="<Value>".$RCkey."</Value>";$result="m:Value"}],
"GetVolume"    => [sub {$content="";$result="m:Value"}],
"SetMute"    => [sub {$content="<Value>".$RCkey."</Value>";$result="m:Value"}],
"GetMute"    => [sub {$content="";$result="m:Value"}],
"GetDRPlusArchive" => [sub {$content="<ltv:QueryParameters>
<ltv:Range startIndex='".$RCkey."' maxItems='1000'/>
<ltv:OrderField field='userChannelNumber' type='ascending'/>
</ltv:QueryParameters>";$result="ltv:ResultItemDRPlusFragment"}],
    );
if ($actions{$action}[0]) {$actions{$action}[0]->();$handlers=$actions{$action}[1];} else {die "Unknown action: $action\n";};
$message = $header.$action_xml1.$header2.$content.$action_xml2.$footer;
$request = HTTP::Request->new(POST => 'http://'.$hash->{ip}.':905/loewe_tablet_0001');
$userAgent = LWP::UserAgent->new(agent => 'Assist Media/23 CFNetwork/808 Darwin/16.0.0');
$request->header('Accept' => '*/*');
$request->header('Accept-Encoding' => 'gzip, deflate');
$request->header('Accept-Language' => 'de-de');
$request->header('Connection' => 'keep-alive');
$request->header('SOAPAction' => $action);
$request->content_type("application/soap+xml; charset=utf-8");
$request->content($message);
$response = $userAgent->request($request);
$noob = $response->content;
$twig2 = XML::Twig->new(twig_handlers => $handlers,keep_encoding => 1)->parse($noob);
if($response->code == 200) {
$hash->{connectsuccess} = "true";
$hash->{lastresponse} = $response->content;
}
else {
$hash->{connectsuccess} = "false";
$hash->{lastresponse} = $response->error_as_HTML;
}
if($hash->{action} eq "RequestAccess"){return($hash->{status})}else{return($hash->{status})};
}

1;


=pod
=item device
=item summary control for Loewe TV devices via network connection
=item summary_DE Steuerung von Loewe TV Ger&auml;ten &uuml;ber das Netzwerk
=begin html

<a name="LoeweTV"></a>
<h3>LoeweTV</h3>

=end html

=begin html_DE

<a name="LoeweTV"></a>
<h3>LoeweTV</h3>

=end html_DE

=cut


Befehle in FHEM:

reload 70_LoeweTV
define MyLoewe LoeweTV 192.168.0.2 00:09:82:19:ab:58


Und das Ergebnis in FHEM:

Internals:
   CFGFN
   DEF        192.168.0.2 00:09:82:19:ab:58
   NAME       LoeweTV2
   NR         50
   RCkey
   STATE      ???
   TYPE       LoeweTV
   acion      GetDeviceData
   clientid   LRemoteClient-0-1504642556
   connectsuccess true
   fcid       1234
   ip         192.168.0.2
   lastresponse <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Header/> <SOAP-ENV:Body>  <m:GetDeviceDataResponse xmlns:m="urn:loewe.de:RemoteTV:Tablet">  <m:fcid>1234</m:fcid><m:ClientId>LRemoteClient-0-1504642556</m:ClientId><m:Chassis>SL220</m:Chassis><m:SW-Version>V2.4.55.0</m:SW-Version><m:MAC-Address>00:09:82:19:ab:58</m:MAC-Address><m:MAC-Address-LAN>00:09:82:19:ab:58</m:MAC-Address-LAN><m:MAC-Address-WLAN>f8:35:dd:97:9b:5a</m:MAC-Address-WLAN><m:Location>Germany</m:Location></m:GetDeviceDataResponse> </SOAP-ENV:Body></SOAP-ENV:Envelope>
   mac
   status     Accepted
   tvmac      00:09:82:19:ab:58
Attributes:
   icon       it_television
   mac        00:1e:06:33:95:c9
   room       Andreas


Es kann sein, dass ich die Funktionsweise der Module, v.a. was das AUfrufen der Funktionen angeht, überhaupt nicht verstanden habe  :o 8) ??? ::)

Das Gute ist aber, dass FHEM den SOAP-Request Platzieren und eine SOAP-Antwort erhalten kann.

CoolTux

Ich schaue mir Dein Modul heute mal in Ruhe an. Habe gerade bisschen überflogen.

Als generellen Tip schon mal folgendes. Stell Dir vor Du bist User und musst jetzt noch unendlich viele zusätzliche Pakete installieren. Das nervt und viele User werden kommen und sagen ich kann das nicht installieren weil ich eine Fritzbox oder ein NAS habe.

Daher mein Tip, versuche die von FHEM gegebenen Routinen/Module zu verwenden. In Deinem Fall, wenn ich das richtig gesehen habe wäre HttpUtils ein Ansatz. Zusammen mit der Funktion HttpUtils_NonblockingGet

Das was Du jetzt beschrieben hast, also Dein "Problem" muss ich erstmal begreifen. Deswegen teste ich mal Dein Modul.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

der.einstein

Das Problem ist, dass ich ja nicht einfach ein HTTP Get machen kann, z.B. mit HTTPMOD.
Ich brauche erstens eine SOAP-Message, die ich zweitens über POST absetzen und drittens bei der Rückantwort teils komplexes XML parsen muss:

my $channellists = '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Header/> <SOAP-ENV:Body>  <m:GetListOfChannelListsResponse xmlns:m="urn:loewe.de:RemoteTV:Tablet">  <m:fcid>0</m:fcid><m:ClientId>LRemoteClient-0-1504032928</m:ClientId><m:ResultItemChannelLists sequenceNumber="9076677" totalResults="5" returnedResults="5" startIndex="0"><m:ResultItemChannelList><m:View>favlist0</m:View><m:Name>Persönliche Liste 1</m:Name><m:TotalResults>38</m:TotalResults><m:Hash>817932246</m:Hash></m:ResultItemChannelList><m:ResultItemChannelList><m:View>favlist1</m:View><m:Name>Persönliche Liste 2</m:Name><m:TotalResults>29</m:TotalResults><m:Hash>236324662</m:Hash></m:ResultItemChannelList><m:ResultItemChannelList><m:View>fastscan0</m:View><m:Name>DVB-C</m:Name><m:TotalResults>391</m:TotalResults><m:Hash>4024613345</m:Hash></m:ResultItemChannelList><m:ResultItemChannelList><m:View>fastscan1</m:View><m:Name>Unitymedia</m:Name><m:TotalResults>0</m:TotalResults><m:Hash>509297849</m:Hash></m:ResultItemChannelList><m:ResultItemChannelList><m:View>avlist0</m:View><m:Name>#3051</m:Name><m:TotalResults>9</m:TotalResults><m:Hash>2242429194</m:Hash></m:ResultItemChannelList></m:ResultItemChannelLists><m:Result>OK</m:Result></m:GetListOfChannelListsResponse> </SOAP-ENV:Body></SOAP-ENV:Envelope>';

my $channellist = '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Header/> <SOAP-ENV:Body>  <m:GetChannelListResponse xmlns:m="urn:loewe.de:RemoteTV:Tablet">  <m:fcid>0</m:fcid><m:ClientId>LRemoteClient-0-1504032928</m:ClientId><m:ChannelListView>favlist0</m:ChannelListView><m:ChannelListName>Persönliche Liste 1</m:ChannelListName><m:ResultItemFragment sequenceNumber="9076676" totalResults="38" returnedResults="38" startIndex="0" hash="817932246"><m:ResultItemReference
mediaItemUuid="chl0:00-00030001ffff041b2b5c"/><m:ResultItemReference mediaItemUuid="chl0:00-00030001ffff04372b66"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff271fc35c"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff271fc362"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff271dc35d"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff271ec359"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff271dc35f"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff271fc35b"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff2716c36c"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff2719c37b"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff2716c363"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff2724c375"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff271e2b70"/><m:ResultItemReference mediaItemUuid="chl0:00-00030001ffff04312856"/><m:ResultItemReference mediaItemUuid="chl0:00-00030001ffff044d2859"/><m:ResultItemReference mediaItemUuid="chl0:00-00030001ffff041b6ea5"/><m:ResultItemReference mediaItemUuid="chl0:00-00030001ffff041b2840"/><m:ResultItemReference mediaItemUuid="chl0:00-00030001ffff0437286f"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff271e2873"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff27192b7a"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff27212b8e"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff2719285b"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff27192b98"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff271ac385"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff271ac381"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff2720c36f"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff2726d04c"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff271ec35a"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff2716c365"/><m:ResultItemReference mediaItemUuid="chl0:00-00030001ffff04316f46"/><m:ResultItemReference mediaItemUuid="chl0:00-00030001ffff044d2870"/><m:ResultItemReference mediaItemUuid="chl0:00-00030001ffff041b7033"/><m:ResultItemReference mediaItemUuid="chl0:00-00030001ffff04376d6b"/><m:ResultItemReference mediaItemUuid="chl0:00-00030001ffff04376d70"/><m:ResultItemReference mediaItemUuid="chl0:00-00030001ffff041b6f47"/><m:ResultItemReference mediaItemUuid="chl0:00-00030001ffff041b7031"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff2721cf11"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff2712cf76"/></m:ResultItemFragment></m:GetChannelListResponse> </SOAP-ENV:Body></SOAP-ENV:Envelope>';

my $curplayback = '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Header/> <SOAP-ENV:Body>  <m:GetCurrentPlaybackResponse xmlns:m="urn:loewe.de:RemoteTV:Tablet">  <m:fcid>1234</m:fcid><m:ClientId>LRemoteClient-0-1504032928</m:ClientId><m:Mode>tv</m:Mode><m:Locator>channel://9:fffca5971e530d32982</m:Locator></m:GetCurrentPlaybackResponse> </SOAP-ENV:Body></SOAP-ENV:Envelope>';

my $curevent = '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Header/> <SOAP-ENV:Body>  <m:GetCurrentEventResponse xmlns:m="urn:loewe.de:RemoteTV:Tablet">  <m:fcid>1234</m:fcid><m:ItemLocator>channel://9:fffca5971e530d32982</m:ItemLocator><m:Locator>channel://9:fffca5971e530d32982</m:Locator><m:LiveEvent><m:Name>Mrs. Doubtfire - Das stachelige Kindermädchen</m:Name><m:ExtendedInfo>Um seinen Kindern täglich nah sein zu können, schlüpft der geschiedene Schauspieler und Stimmenimitator Daniel Hillard kurzerhand in die Rolle des betagten Kindermädchens Mrs. Doubtfire. Der ständige Rollenwechsel hat jedoch seine Tücken - und verheerende Folgen...</m:ExtendedInfo><m:Availability><m:ScheduledTime startTime="1504030500" duration="9300"/></m:Availability></m:LiveEvent></m:GetCurrentEventResponse> </SOAP-ENV:Body></SOAP-ENV:Envelope>';

my $mediaitem = '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Header/> <SOAP-ENV:Body>  <m:GetMediaItemResponse xmlns:m="urn:loewe.de:RemoteTV:Tablet">  <m:fcid>1234</m:fcid><m:ClientId>LRemoteClient-0-1504032928</m:ClientId><m:ResultItem><m:MediaItem itemInfoClass="object.item.videoItem"><m:uuid>chl0:00-0003f001ffff2716c36c</m:uuid><m:Locator>channel://9:fffca5971e530d32982</m:Locator><m:Caption>9</m:Caption></m:MediaItem><m:MediaInformation><m:ShortInfo>SUPER RTL HD</m:ShortInfo><m:Attributes>13</m:Attributes><m:StreamingUrl>http://192.168.0.2:1543/lt0/0/$1$0$8</m:StreamingUrl></m:MediaInformation></m:ResultItem></m:GetMediaItemResponse> </SOAP-ENV:Body></SOAP-ENV:Envelope>';


Ich glaube nicht, dass das auf einfachem Wege mit den FHEM Modulen möglich ist. Aber ich bin ja lernwillig  8)
Außerdem bin ich dankbar für jede Hilfe!  ;D ;D

CoolTux

Zitat von: der.einstein am 06 September 2017, 20:18:31
Das Problem ist, dass ich ja nicht einfach ein HTTP Get machen kann, z.B. mit HTTPMOD.
Ich brauche erstens eine SOAP-Message, die ich zweitens über POST absetzen und drittens bei der Rückantwort teils komplexes XML parsen muss:

my $channellists = '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Header/> <SOAP-ENV:Body>  <m:GetListOfChannelListsResponse xmlns:m="urn:loewe.de:RemoteTV:Tablet">  <m:fcid>0</m:fcid><m:ClientId>LRemoteClient-0-1504032928</m:ClientId><m:ResultItemChannelLists sequenceNumber="9076677" totalResults="5" returnedResults="5" startIndex="0"><m:ResultItemChannelList><m:View>favlist0</m:View><m:Name>Persönliche Liste 1</m:Name><m:TotalResults>38</m:TotalResults><m:Hash>817932246</m:Hash></m:ResultItemChannelList><m:ResultItemChannelList><m:View>favlist1</m:View><m:Name>Persönliche Liste 2</m:Name><m:TotalResults>29</m:TotalResults><m:Hash>236324662</m:Hash></m:ResultItemChannelList><m:ResultItemChannelList><m:View>fastscan0</m:View><m:Name>DVB-C</m:Name><m:TotalResults>391</m:TotalResults><m:Hash>4024613345</m:Hash></m:ResultItemChannelList><m:ResultItemChannelList><m:View>fastscan1</m:View><m:Name>Unitymedia</m:Name><m:TotalResults>0</m:TotalResults><m:Hash>509297849</m:Hash></m:ResultItemChannelList><m:ResultItemChannelList><m:View>avlist0</m:View><m:Name>#3051</m:Name><m:TotalResults>9</m:TotalResults><m:Hash>2242429194</m:Hash></m:ResultItemChannelList></m:ResultItemChannelLists><m:Result>OK</m:Result></m:GetListOfChannelListsResponse> </SOAP-ENV:Body></SOAP-ENV:Envelope>';

my $channellist = '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Header/> <SOAP-ENV:Body>  <m:GetChannelListResponse xmlns:m="urn:loewe.de:RemoteTV:Tablet">  <m:fcid>0</m:fcid><m:ClientId>LRemoteClient-0-1504032928</m:ClientId><m:ChannelListView>favlist0</m:ChannelListView><m:ChannelListName>Persönliche Liste 1</m:ChannelListName><m:ResultItemFragment sequenceNumber="9076676" totalResults="38" returnedResults="38" startIndex="0" hash="817932246"><m:ResultItemReference
mediaItemUuid="chl0:00-00030001ffff041b2b5c"/><m:ResultItemReference mediaItemUuid="chl0:00-00030001ffff04372b66"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff271fc35c"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff271fc362"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff271dc35d"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff271ec359"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff271dc35f"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff271fc35b"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff2716c36c"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff2719c37b"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff2716c363"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff2724c375"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff271e2b70"/><m:ResultItemReference mediaItemUuid="chl0:00-00030001ffff04312856"/><m:ResultItemReference mediaItemUuid="chl0:00-00030001ffff044d2859"/><m:ResultItemReference mediaItemUuid="chl0:00-00030001ffff041b6ea5"/><m:ResultItemReference mediaItemUuid="chl0:00-00030001ffff041b2840"/><m:ResultItemReference mediaItemUuid="chl0:00-00030001ffff0437286f"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff271e2873"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff27192b7a"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff27212b8e"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff2719285b"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff27192b98"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff271ac385"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff271ac381"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff2720c36f"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff2726d04c"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff271ec35a"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff2716c365"/><m:ResultItemReference mediaItemUuid="chl0:00-00030001ffff04316f46"/><m:ResultItemReference mediaItemUuid="chl0:00-00030001ffff044d2870"/><m:ResultItemReference mediaItemUuid="chl0:00-00030001ffff041b7033"/><m:ResultItemReference mediaItemUuid="chl0:00-00030001ffff04376d6b"/><m:ResultItemReference mediaItemUuid="chl0:00-00030001ffff04376d70"/><m:ResultItemReference mediaItemUuid="chl0:00-00030001ffff041b6f47"/><m:ResultItemReference mediaItemUuid="chl0:00-00030001ffff041b7031"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff2721cf11"/><m:ResultItemReference mediaItemUuid="chl0:00-0003f001ffff2712cf76"/></m:ResultItemFragment></m:GetChannelListResponse> </SOAP-ENV:Body></SOAP-ENV:Envelope>';

my $curplayback = '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Header/> <SOAP-ENV:Body>  <m:GetCurrentPlaybackResponse xmlns:m="urn:loewe.de:RemoteTV:Tablet">  <m:fcid>1234</m:fcid><m:ClientId>LRemoteClient-0-1504032928</m:ClientId><m:Mode>tv</m:Mode><m:Locator>channel://9:fffca5971e530d32982</m:Locator></m:GetCurrentPlaybackResponse> </SOAP-ENV:Body></SOAP-ENV:Envelope>';

my $curevent = '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Header/> <SOAP-ENV:Body>  <m:GetCurrentEventResponse xmlns:m="urn:loewe.de:RemoteTV:Tablet">  <m:fcid>1234</m:fcid><m:ItemLocator>channel://9:fffca5971e530d32982</m:ItemLocator><m:Locator>channel://9:fffca5971e530d32982</m:Locator><m:LiveEvent><m:Name>Mrs. Doubtfire - Das stachelige Kindermädchen</m:Name><m:ExtendedInfo>Um seinen Kindern täglich nah sein zu können, schlüpft der geschiedene Schauspieler und Stimmenimitator Daniel Hillard kurzerhand in die Rolle des betagten Kindermädchens Mrs. Doubtfire. Der ständige Rollenwechsel hat jedoch seine Tücken - und verheerende Folgen...</m:ExtendedInfo><m:Availability><m:ScheduledTime startTime="1504030500" duration="9300"/></m:Availability></m:LiveEvent></m:GetCurrentEventResponse> </SOAP-ENV:Body></SOAP-ENV:Envelope>';

my $mediaitem = '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Header/> <SOAP-ENV:Body>  <m:GetMediaItemResponse xmlns:m="urn:loewe.de:RemoteTV:Tablet">  <m:fcid>1234</m:fcid><m:ClientId>LRemoteClient-0-1504032928</m:ClientId><m:ResultItem><m:MediaItem itemInfoClass="object.item.videoItem"><m:uuid>chl0:00-0003f001ffff2716c36c</m:uuid><m:Locator>channel://9:fffca5971e530d32982</m:Locator><m:Caption>9</m:Caption></m:MediaItem><m:MediaInformation><m:ShortInfo>SUPER RTL HD</m:ShortInfo><m:Attributes>13</m:Attributes><m:StreamingUrl>http://192.168.0.2:1543/lt0/0/$1$0$8</m:StreamingUrl></m:MediaInformation></m:ResultItem></m:GetMediaItemResponse> </SOAP-ENV:Body></SOAP-ENV:Envelope>';


Ich glaube nicht, dass das auf einfachem Wege mit den FHEM Modulen möglich ist. Aber ich bin ja lernwillig  8)
Außerdem bin ich dankbar für jede Hilfe!  ;D ;D

Ich fürchte Du hast Recht. Habe mal etwas gesucht und auch nichts einfacheres gefunden.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

der.einstein

Das Einzige, was noch gehen könnte, wäre die SOAP-Message mit SOAP::Lite zu schicken, aber für das Parsen braucht man vermutlich ein extra Modul.

Wie ist das nun mit dem Aufrufen der FHEM-Modul-Funktionen?  ;D

Und was bedeuten die "$" und "@" bei den Sub-Definitionen. z.B. hier (hab ich aus anderen Modulen so übernommen:

sub LoeweTV_Initialize($) {

Grüße und Danke für die Hilfe  :)

viegener

Wenn ich meine früheren Experimente mit dem Loewe-API richtig erinnere ist ja der SOAP-Request für jedese Kommand relativ stabil und es wird der eigentliche Befehl (also zum Beispiel Lautstärke erhöhen als Tastendruck) und eine Client-ID, die man einmalig erzeugen muss.

Für grundsätzliche Befehle  wie von einer Fernbedieung wäre das einfach und sollte mit HTTPMod gehen.

Wenn man auch auf Programmlisten / PVR etc zugreifen will, ist es sicher besser ein komplettes Modul zu haben
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

CoolTux

#25
Zitat von: der.einstein am 06 September 2017, 21:39:13
Wie ist das nun mit dem Aufrufen der FHEM-Modul-Funktionen?  ;D
Was soll damit noch mal genau sein?

Zitat
Und was bedeuten die "$" und "@" bei den Sub-Definitionen. z.B. hier (hab ich aus anderen Modulen so übernommen:

sub LoeweTV_Initialize($) {

Das gibt die Anzahl und/oder den Type des Übergabe oder Aufrufparameters der Routine an
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

der.einstein

Zitat von: viegener am 06 September 2017, 21:46:05
Wenn ich meine früheren Experimente mit dem Loewe-API richtig erinnere ist ja der SOAP-Request für jedese Kommand relativ stabil und es wird der eigentliche Befehl (also zum Beispiel Lautstärke erhöhen als Tastendruck) und eine Client-ID, die man einmalig erzeugen muss.

Für grundsätzliche Befehle  wie von einer Fernbedieung wäre das einfach und sollte mit HTTPMod gehen.

Wenn man auch auf Programmlisten / PVR etc zugreifen will, ist es sicher besser ein komplettes Modul zu haben

Mit den Tastendrücken der FB hast du recht. Das ist simpel und bleibt gleich (außer die Nummer der Taste).
Was ich auf jeden Fall brauche ist ein und ausschalten sowie Status abfragen, zudem klappt das Auslesen der Programmlisten mit den "stand-alone" Skript bereits.

der.einstein

Zitat von: CoolTux am 06 September 2017, 22:08:28
Das gibt die Anzahl und/oder den Type des Übergabe oder Aufrufparameters der Routine an

Sorry, hatte ich etwas knapp geschrieben.
Ich verstehe nicht, warum FHEM die Funktion LoeweTV_Set ausführt, wenn ich bloß den "define Myloewe LoeweTV ..." eingebe.
Dass FHEM das tut, sehe ich an der Ausgabe im Log. So, wie ich es verstanden habe, sollte die Funktion doch aber erst ausgeführt werden wenn jemand "set Myloewe ..." eingibt?

CoolTux

Das hat mit dem define nichts zu tun, sondern damit das die Detailseite des Devices ausgeführt wird und somit set und get ausgeführt werden damit die Drop Down Felder gefüllt werden können.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

der.einstein

Ok, das kann ich verstehen.
Wie kann ich regeln, welche Parameter dabei an diese Funktionen übergeben werden?
Oder kann man das Ausführen an dieser Stelle unterbinden?