FHEM Forum

FHEM - Hardware => Einplatinencomputer => Thema gestartet von: Klaus Heynen am 05 August 2021, 14:21:47

Titel: Text auf LCDd server ausgeben
Beitrag von: Klaus Heynen am 05 August 2021, 14:21:47
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
Titel: Antw:Text auf LCDd server ausgeben
Beitrag von: Otto123 am 05 August 2021, 15:34:04
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
Titel: Antw:Text auf LCDd server ausgeben
Beitrag von: Klaus Heynen am 05 August 2021, 15:57:31
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);
Titel: Antw:Text auf LCDd server ausgeben
Beitrag von: Otto123 am 05 August 2021, 17:05:25
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
Titel: Antw:Text auf LCDd server ausgeben
Beitrag von: Klaus Heynen am 05 August 2021, 17:20:27
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
Titel: Antw:Text auf LCDd server ausgeben
Beitrag von: Klaus Heynen am 05 August 2021, 17:26:30
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
Titel: Antw:Text auf LCDd server ausgeben
Beitrag von: Otto123 am 05 August 2021, 17:28:55
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?
Titel: Antw:Text auf LCDd server ausgeben
Beitrag von: Klaus Heynen am 05 August 2021, 19:39:12
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
Titel: Antw:Text auf LCDd server ausgeben
Beitrag von: Otto123 am 05 August 2021, 22:21:00
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
Titel: Antw:Text auf LCDd server ausgeben
Beitrag von: Klaus Heynen am 06 August 2021, 10:49:23
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.
Titel: Antw:Text auf LCDd server ausgeben
Beitrag von: Otto123 am 06 August 2021, 11:09:04
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.
Titel: Antw:Text auf LCDd server ausgeben
Beitrag von: Klaus Heynen am 06 August 2021, 12:04:39
super hat geklappt, nun mach ich mich an die 99_MyUtls.pm
Titel: Antw:Text auf LCDd server ausgeben
Beitrag von: Klaus Heynen am 06 August 2021, 18:14:19
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.
Titel: Antw:Text auf LCDd server ausgeben
Beitrag von: Klaus Heynen am 06 August 2021, 22:08:20
gefunden,es lag an exit 1;
Nochmals vielen Dank für Deine Hilfe.
Klaus
Titel: Antw:Text auf LCDd server ausgeben
Beitrag von: Otto123 am 06 August 2021, 22:09:22
 :)
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
Titel: Antw:Text auf LCDd server ausgeben
Beitrag von: Klaus Heynen am 06 August 2021, 22:29:04
besser aber jetzt scheint es wie eine Endlosschleife zu sein.
Es wiederholt sich wieder und wieder
Titel: Antw:Text auf LCDd server ausgeben
Beitrag von: Klaus Heynen am 06 August 2021, 22:42:46
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?
Titel: Antw:Text auf LCDd server ausgeben
Beitrag von: Otto123 am 06 August 2021, 23:08:14
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?
Titel: Antw:Text auf LCDd server ausgeben
Beitrag von: Klaus Heynen am 10 August 2021, 15:32:56
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;