Ich habe einen funktionierenden LCDd server auf meinem Raspi3 laufen und möchte von fhem gesteuert Meldungen aus geben.
Wenn ich mit telnet auf den server localhost port 13666 gehe dann funktioniert das auch.
Um eine Anbindung an fhem zu bekommen habe ich die Perl extension IO::LCDproc (https://metacpan.org/pod/IO::LCDproc#SYNOPSIS (https://metacpan.org/pod/IO::LCDproc#SYNOPSIS)) installiert.
Wenn ich Demo skript mit oder ohne sudo mit perl "sudo perl LCDd_Test.pl" aufrufe passiert rein gar nichts, es werden auch keine Fehlermeldungen ausgegeben.
use IO::LCDproc;
my $client = IO::LCDproc::Client->new(name => "MYNAME");
my $screen = IO::LCDproc::Screen->new(name => "screen");
my $title = IO::LCDproc::Widget->new(
name => "date", type => "title"
);
my $first = IO::LCDproc::Widget->new(
name => "first", align => "center", xPos => 1, yPos => 2
);
my $second = IO::LCDproc::Widget->new(
name => "second", align => "center", xPos => 1, yPos => 3
);
my $third = IO::LCDproc::Widget->new(
name => "third", xPos => 1, yPos => 4
);
$client->add( $screen );
$screen->add( $title, $first, $second, $third );
$client->connect() or die "cannot connect: $!";
$client->initialize();
$title->set( data => "This is the title" );
$first->set( data => "First Line" );
$second->set( data => "Second line" );
$third->set( data => "Third Line" );
$client->flushAnswers();
Ich verstehe nicht wie ich die Argumente host, port etc. an das demo skript übergeben muss.
Tut mir leid auch nach stundenlangem goggeln bin ich nicht weiter gekommen. Ich brauche hier euer Nachhilfe!
Danke Klaus
Hallo Klaus,
so versuchen? Aus der Zeile:
my $client = IO::LCDproc::Client->new(name => "MYNAME");
die machen:
my $client = IO::LCDproc::Client->new(name => "MYNAME", host => $MYHOSTNAME, port => $MYPORTNUMBER);
Ich versteh die Doku und Beschreibung zumindestens so :-\
Wenn man sucht findet man noch das https://www.splunk.com/en_us/blog/tips-and-tricks/splunk2lcd-display-your-alerts-on-an-lcd.html ;) was meine Annahme bestätigt?
Gruß Otto
Hallo Otto123,
und wie dann das Skript aufrufen?
Oder meinst Du zB.
my $client = IO::LCDproc::Client->new(name => "fhem", host => 127.0.0.1, port => 13666);
Hallo Klaus,
ich habe ehrlich gesagt von Deiner Lösung keine Ahnung, ich habe nur aus Interesse reingelesen.
Ich habe verstanden, dass LCDd und LCDproc eine Client Server Applikation ist. Es gibt für LCDproc übrigens auch eine Kommandozeilen Version.
Mir ist nicht klar ob FHEM und dein LCDd auf der gleichen Maschine laufen.
Mir ist nicht klar wie name wirklich gewählt werden muss.
Aber klar: zum Test kannst Du doch alle Daten erstmal ins Script eintragen.
Später kannst Du alles per Parameter übergeben. Oder war Deine Frage nur darauf ausgerichtet?
Gruß Otto
Alles klar, mir reicht es erstmal "hard coded" was von FHEM auf das Display zubekommen.
Wenn es mit der LCDproc command line geht einen freiwählbaren Text auszugeben würde mir das sehr helfen, wo hast du das denn gefunden?
Der Weg ist mir egal, ich interessiert das Ergebnis.
Danke und viele Grüße
hab's gefunden aber es scheint als könne man keinen freien Text ausgeben.
fhem und LCDd laufen auf dem selben Raspi3.
Das mit dem Name ist mir auch ein Rätzel
Gefunden z.B. hier
http://manpages.ubuntu.com/manpages/trusty/man8/LCDd.8.html
http://manpages.ubuntu.com/manpages/trusty/man1/lcdproc.1.html
Aber per Perl aus FHEM heraus ist auf alle Fälle eleganter. In FHEM machst Du aus deinem Code eine sub { Code } in deine 99_myUtils.pm (https://wiki.fhem.de/wiki/99_myUtils_anlegen#Routinen_mit_mehreren_Parametern)
Daten aus FHEM an diese sub zu übergeben ist relativ simpel.
Kannst ja probieren und fragen :)
Gruß Otto
P.S. funktioniert das Perl Script?
habs nun zum laufen gebracht use IO::LCDproc;
use IO::Socket;
use strict;
&usage if (! $ARGV[0]);
my $client = IO::LCDproc::Client->new(host => "localhost", name => "MYNAME", port => "13666");
my $screen = IO::LCDproc::Screen->new(name => "screen");
my $title = IO::LCDproc::Widget->new( name => "date", type => "string");
my $first = IO::LCDproc::Widget->new(
name => "first", align => "center", type => "string", xPos => 1, yPos => 1
);
my $second = IO::LCDproc::Widget->new(
name => "second", align => "center", type => "string", xPos => 1, yPos => 2
);
my $third = IO::LCDproc::Widget->new(
name => "third", align => "center", type => "string", xPos => 1, yPos => 4
);
$client->add ( $screen );
$screen->add ( $title, $first, $second, $third);
$client->connect() or die "Cannot Connect: $!";
$client->initialize();
#$title->set( data => "$ARGV[1]" );
$first->set( data => "$ARGV[0]");
$second->set( data => "$ARGV[1]" );
#$third->set( data => "$ARGV[5]" );
sleep 5;
exit 1;
sub usage {
print <<USAGE;
LCDproc Client for Splunk
Mark Cohen
Usage: ./splunk2lcd2.pl ARGV0 ARGV1 ARGV2
USAGE
exit 1;
}
Wenn ich es nun von der command line mit "perl fhem2lcdd.pl "eins und" zwei" starte zeigt es zentriert:
eins und
zwei
Aber leider zus. in der ersten Zeile den Heartbeat habe schon einiges Versucht ich verstehe nicht wo und wie ich die "Option" heartbeat => 0 in das Skript einbauen muss.
Den Einbau in die 99_MyUtils.pm schaue ich mir erstmal im Wiki an.
Noch mal vielen Dank Klaus
Hi,
ich weiß jetzt nicht was Du mit Heartbeat meinst, aber Du bestückst die Variable $title, belässt sie und steckst am Ende keine Daten hinein.
Wenn Du $title konsequent auskommentierst?
Gruß Otto
hearbeat ist ein pulsierendes Herz Symbol am Ende der 1. Zeile
laut IO::LCDproc kann man das ausschalten:
Zitat_LCDproc__ScreenMETHODSnew( name =_ 'MYNAME')Constructor. Allowed options_heartbeat =_ 1 or 0_
habe versucht:
my $screen = IO::LCDproc::Screen->new(name => "screen", heartbeat => 0);
geht aber nicht, auch nicht mit
my $screen = IO::LCDproc::Screen->new(name => "screen", heartbeat => "0");
habe es auch mit =>1 und =>"1" versucht geht auch nicht.
Laut Beschreibung auch direkt auf dem Server deaktivierbar?
http://lcdproc.sourceforge.net/docs/current-user.html
ZitatHeartbeat = { off | open | on }
Set the master heartbeat, the oscillating icon in the top right corner of the display, setting. If set to the default value open, then the heartbeat setting of the display can be influenced by the clients. When set to off or on, the heartbeat is turned on or off without the clients being able to change the value.
super hat geklappt, nun mach ich mich an die 99_MyUtls.pm
Bin etwas weiter gekommen. Wenn ich nun aus FHEM "{ myLCDd("fuenf", "Sieben") }
" aufrufe wird das richtig angezeigt aber FHEM stürzt ab.
##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.
package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_Initialize($$)
{
my ($hash) = @_;
}
# Enter you functions below _this_ line.
sub
myLCDd($$) {
use IO::LCDproc;
use strict;
my ($ARGV0, $ARGV1) = @_;
my $client = IO::LCDproc::Client->new(host => "localhost", name => "MYNAME", port => "13666");
my $screen = IO::LCDproc::Screen->new(name => "screen");
my $first = IO::LCDproc::Widget->new(
name => "first", align => "center", type => "string", xPos => 1, yPos => 1
);
my $second = IO::LCDproc::Widget->new(
name => "second", align => "center", type => "string", xPos => 1, yPos => 2
);
$client->add ( $screen );
$screen->add ($first, $second);
$client->connect() or die "Cannot Connect: $!";
$client->initialize();
$first->set( data => "$ARGV0");
$second->set( data => "$ARGV1");
sleep 5;
exit 1;
}
1;
Hast Du eine Idee? Im log steht leider garnix.
gefunden,es lag an exit 1;
Nochmals vielen Dank für Deine Hilfe.
Klaus
:)
ich meine, das hier blockiert und beendet den Perl Prozess und damit FHEM
sleep 5;
exit 1;
Ersetz das mal durch
return 1;
Gruß Otto
besser aber jetzt scheint es wie eine Endlosschleife zu sein.
Es wiederholt sich wieder und wieder
ich versuche es morgen weiter.
Frage am Rande, ist es nicht besser doch anstelle der 99_myUtls.pm subroutine das Programm mit "perl fhem2lcdd.pl eins zwei" auf zurufen, denn dann läuft es im Hintergrund und blockiert nicht den Rest?
Ich wollte sagen: das sleep 5 blockiert für 5 sec. Ich wüsste nicht wozu das gut sein soll?
Aber ja, Du kannst auch ein Script aufrufen, ist für diese Anwendung vielleicht egal.
Das es als Schleife läuft ist mir nicht ergründlich? Du rufst einmal in der FHEM Kommandozeile
{ myLCDd("fuenf", "Sieben") }
Und dann läuft es in Schleife?
nur zur info falls mal jemand das gleiche Problem hat.
Es ist der LCDd service zyklisch er scrollt durch alle client Fenster und die Perl Library mach die Fenster nicht mehr zu (da hab ich bestimmt was falsch gemacht).
Am Ende habe ich mich für Perl über die command line Variante entschieden:
define Pin23_ESCAPE_notify_1 notify Pin23_ESCAPE:Pinlevel:.low "sudo perl /home/pi/LCDd_Perl/fhem2lcdd.pl Escape "Pin23 ist low""
fhem2lcdd.pl:
use IO::LCDproc;
use strict;
my $client = IO::LCDproc::Client->new(host => "localhost", name => "MYNAME", port => "13666");
my $screen = IO::LCDproc::Screen->new(name => "screen");
my $first = IO::LCDproc::Widget->new(
name => "first", align => "center", type => "string", xPos => 1, yPos => 1
);
my $second = IO::LCDproc::Widget->new(
name => "second", align => "center", type => "string", xPos => 1, yPos => 2
);
$client->add ( $screen );
$screen->add ($first, $second);
$client->connect() or die "Cannot Connect: $!";
$client->initialize();
$first->set( data => "$ARGV[0]");
$second->set( data => "$ARGV[1]" );
sleep 5;
exit 1;