Text auf LCDd server ausgeben

Begonnen von Klaus Heynen, 05 August 2021, 14:21:47

Vorheriges Thema - Nächstes Thema

Klaus Heynen

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) 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

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Klaus Heynen

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);

Otto123

#3
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Klaus Heynen

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

Klaus Heynen

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

Otto123

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
Daten aus FHEM an diese sub zu übergeben ist relativ simpel.

Kannst ja probieren und fragen :)

Gruß Otto
P.S. funktioniert das Perl Script?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Klaus Heynen

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

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Klaus Heynen

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.

Otto123

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.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Klaus Heynen

super hat geklappt, nun mach ich mich an die 99_MyUtls.pm

Klaus Heynen

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.

Klaus Heynen

gefunden,es lag an exit 1;
Nochmals vielen Dank für Deine Hilfe.
Klaus

Otto123

 :)
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Klaus Heynen

besser aber jetzt scheint es wie eine Endlosschleife zu sein.
Es wiederholt sich wieder und wieder

Klaus Heynen

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?

Otto123

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?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Klaus Heynen

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;