Was bedeutet folgendes: Undefined subroutine &main::param

Begonnen von Rince, 14 Mai 2013, 18:10:46

Vorheriges Thema - Nächstes Thema

Rince

Hi,

vermutlich ist es eine der dümmsten Fragen, die man stellen kann *schäm*

Ich habe versucht von Armink das Skript aus den Google Groups "Samsung TV - neues Modul" zu benutzen.
https://groups.google.com/d/msg/fhem-users/CKAHUqniUVs/-xN1liOLA7gJ
(Hey, war schon aufregend genug, dass ein COpy&Paste aus dem Forum nicht klappt wegen der Zeilenumbrüche, in den Google Groups passt das aber dann :) )


Die IP Adressen habe ich angepasst.
 
Beim ersten Aufruf fragte mein TV mich auch glatt, ob ich eine neue Fernbedienung zulassen will :) => logisch

Jetzt mein Problem:
Wenn ich versuche, den Dummy auf AUS zu setzen

ZitatSo jetzt zur fhem.cfg:
Hier ein Dummy-Device um die Power-Off-Taste zu senden:
Hier Auszug aus fhem.cfg

#TV Fernbedienung
#POWEROFF
define wz_tv1_poweroff dummy
attr wz_tv1_poweroff alias Power off
attr wz_tv1_poweroff eventMap on:an off:aus
attr wz_tv1_poweroff group TV
attr wz_tv1_poweroff room Wohnzimmer
define act_on_wz_tv1_poweroff notify wz_tv1_poweroff {\
   {samsungremote('POWEROFF')} \
}

passiert nix, bis auf den Eintrag:

act_on_wz_tv1_poweroff return value: Undefined subroutine &main::param called at ./FHEM/99_Utils.pm line 189.


Der entsprechende Eintrag lautet:
if (defined(param("text"))) {
       # Send text, e.g. in YouTube app's search, N.B. NOT BBC iPlayer app.
       my $text = param("text");
       my $messagepart3 = chr(0x01) . chr(0x00) . chr(length(encode_base64($text, ""))) . chr(0x00) . encode_base64($text, "");
       my $part3 = chr(0x01) . chr(length($appstring)) . chr(0x00) . $appstring . chr(length($messagepart3)) . chr(0x00) . $messagepart3;
       print $sock $part3;
    }


Google befragt, die meinten man bräuchte ein use CGI;


Daher habe ich den Anfang meiner 99_Utils geändert:
Zitat##############################################
# $Id: 99_Utils.pm 1932 2012-10-06 20:15:33Z ulimaass $
package main;

use strict;
use warnings;
use POSIX;
use CGI;


Leider ändert das nix am Verhalten.

Fehlermeldung bleibt gleich :(


Hat jemand zufällig eine Idee was da schief läuft?


Besten Dank,

Rince
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Icebear

Raspberry PI mod B (Wheezy), Fhem 5.4, CUL868, CUL433 , RfxTrx, HM-USB-CFG2, Wlan, HomeEasy, IT, FS20, TFA, HomeMatic, Oregon Scientific, HMLand auf Fritzbox
Raspberry PI mod B (RaspBMC)

Rince

Ja.
Auch fhem neu gestartet, und den ganzen Raspberry hinterher auch nochmal :-)

Ich kann dir auch gerne das Startlog posten :-)
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

MisterEltako

Also was mir auffällt:

Zitatsub samsungremote {
{
#### Konfiguration
....

hat keinen Parameter, wird aber bei dir mit: {samsungremote('POWEROFF')} also mit Parameter aufgerufen in der 99_Utils.pm.

d.h. entweder sub samsungremote($) {....
oder ohne Parameter samsungremote() {...
oder {samsungremote()} als Aufruf

wäre komisch m.E., wenn das so wie bisher definiert funktioniert.

MfG, MisterEltako



HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

Rince

Danke für die Antwort Mister :)

Habe den Eintrag in der 99_Utils.pm geändert.

Hier ist mal die ganze Datei:
######### TV fernbedienen #########
sub samsungremote($) {
{
#### Konfiguration
    my $tv = "UE55ES8090"; # Bezeichnung des Geräts (weiß nicht ob man das braucht)
    my $tvip = "192.168.10.27"; # IP Addresse TV
    my $myip = "192.168.10.37"; # wird wohl nicht benutzt
    my $mymac = "AB-CD-E1-23-45-67"; # wird anscheinend einmalig zur Zulassung der virtuellen FB gebraucht, Adresse ist egal    
    ####

    my $appstring = "iphone..iapp.samsung"; # What the iPhone app reports
    my $tvappstring = "iphone.".$tv.".iapp.samsung"; # TV type
    my $remotename = "Perl Samsung Remote"; # What gets reported when it asks for permission/also shows in General->Wireless Remote Control menu
   
    my $tvcmd = shift;
  Log 1, "samsungremote cmd: $tvcmd";

    my $sock = new IO::Socket::INET (
    PeerAddr => $tvip,
    PeerPort => '55000',
    Proto => 'tcp',
    );
    die "Could not create socket: $!\n" unless $sock;

    my $messagepart1 = chr(0x64) . chr(0x00) . chr(length(encode_base64($myip, ""))) . chr(0x00) . encode_base64($myip, "") . chr(length(encode_base64($mymac, ""))) . chr(0x00) . encode_base64($mymac, "") . chr(length(encode_base64($remotename, ""))) . chr(0x00) . encode_base64($remotename, "");
    my $part1 = chr(0x00) . chr(length($appstring)) . chr(0x00) . $appstring . chr(length($messagepart1)) . chr(0x00) . $messagepart1;
    print $sock $part1;

    my $messagepart2 = chr(0xc8) . chr(0x00);
    my $part2 = chr(0x00) . chr(length($appstring)) . chr(0x00) . $appstring . chr(length($messagepart2)) . chr(0x00) . $messagepart2;
    print $sock $part2;

    # Preceding sections all first time only

    if (defined(param("text"))) {
       # Send text, e.g. in YouTube app's search, N.B. NOT BBC iPlayer app.
       my $text = param("text");
       my $messagepart3 = chr(0x01) . chr(0x00) . chr(length(encode_base64($text, ""))) . chr(0x00) . encode_base64($text, "");
       my $part3 = chr(0x01) . chr(length($appstring)) . chr(0x00) . $appstring . chr(length($messagepart3)) . chr(0x00) . $messagepart3;
       print $sock $part3;
    }
    else {
        # Send remote key(s)
        my $key = "KEY_" . $tvcmd;
        my $messagepart3 = chr(0x00) . chr(0x00) . chr(0x00) . chr(length(encode_base64($key, ""))) . chr(0x00) . encode_base64($key, "");
        my $part3 = chr(0x00) . chr(length($tvappstring)) . chr(0x00) . $tvappstring . chr(length($messagepart3)) . chr(0x00) . $messagepart3;
        print $sock $part3;
        select(undef, undef, undef, 0.5);
    }

    close($sock);
}
}


Leider hat das am Fehlverhalten nix geändert. Gleiche Fehlermeldung im Logfile :(

Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

MisterEltako

Zitatsub samsungremote($) {
{

Das ist eine "{" zuviel!

Es müsste so lauten:
sub samsungremote($)
{


MfG, MisterEltako
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

Rince

Kommt die Fehlermeldung, dass diebrackets nicht stimmen beim speichern.


Habe ganz unten noch eine weitere Klammer gelöscht.


Alles wie gehabt :-(

Gleicher Fehler, gleiche Zeile :-(



PS
Danke für deine Versuche :-)
Kann ich mehr Daten bereit stellen?
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)