hiho,
ich versuche gerade zahlen von 1 bis 29 aufzuteilen und scheiter wieder mal kläglich.
das problem:
zahlen unter 10 haben keine führende 0 und ich muß die zahlen einzeln weiter verarbeiten - also z.b.: 1 als 1, 10 als 1 und 0, 20 als 2 und 0, usw.
bei zahlen unter 10 hätte ich ja nur 1 set-befehl abzusetzen, bei zahlen darüber müßte ich 2 set-befehle absetzen.
wie krieg ich das in einem doif am einfachsten (und vorzugsweise für einen perl-noob verständlich) hin?
Nabend,
kannst du vll etwas ausführen, was du generell vor hast?
Meine Gedanken gehen gerade in Richtung Kanalwechsel oder so. Willst du aus einem "set xyz 1;set xyz 2"
"set xyz 12" machen?
Vll steigt ja auch jemand schneller dahinter,und kann was aus der Hüfte schießen!
Grüße
Vielleicht als erste Idee:
Als Perl-Ausdruck für die 1er - Modulo-Operator % gibt den Rest einer Division aus, hier den Rest von 12 geteilt durch 10:
my $result1 = 12 % 10; # Ergebnis ist 2
Und die 10er - der Integer einer Division durch 10:
my $result2 = int (12 / 10); # Ergebnis ist 1
@esay
geht schlicht und ergreifend darum, den tv kanal eines fernsehers an einen anderen zu übergeben.
ist ne kleine spielerei für den waf. meine schlechtere hälfte macht im wz den tv zu einer bestimmten zeitspanne aus, der aktuelle kanal wird in ein reading gelegt, der tv in ihrem schlafzimmer geht an und übernimmt den inhalt des readings für den dortigen tv.
@rubbertail - thx, wäre wohl die erste hälfte des problems ...
aber was passiert in dem fall, wenn es nur 1 zahl gibt - also von 1 bis 9 - mit meinem 2. set-befehl?
wobei ... ich könnte auch anders rum arbeiten: eine führende 0 an einstellige zahlen hängen und dann mit den 2 vars arbeiten. denke, ne 0 zu senden, wird den tv auch nicht zur explosion bringen. so müsste ich wenigstens nicht drauf achten, wie viele set-befehle abgesetzt werden müssten.
der weg wäre also intelligenter weise:
1) mach aus einstelligen zahlen zweistellige mit führender 0 <-- hilfe, die erste
2) mache das mit zweistelligen zahlen nicht <-- hilfe, die zweite
3) zerlege die zahlen in 2 readings rein <-- das wäre rubbertails teil, wohl in ein paar userreadings (wie falsch sind folgende? *g*)
zahl1 { my $zahl1 = (int (ReadingsVal ($name,"channel",0) /10))},
zahl2 { my $zahl2 = (ReadingsVal ($name,"channel",0) %10)}
4) sende den inhalt der 2 readings mit 2 befehlen <-- das schaff ich sogar alleine
RegEx match
jaja, springt von hinten im dunkeln aus nem busch und wirft mir meine größte schwächen an den kopf ...
du perl-taliban *lach*
btw - wennst schon da bist: wäre vielleicht ne idee, dein lg-tv modul so zu tunen, dass solcherlei daten getauscht werden können.
würd mir zwar in dem fall nix bringen, weil der andere tv ein alter samsung is und nur per ir zu erreichen ist, aber lg zu lg wäre echt lustig, wenn die miteinander reden könnten. quasi wie man das auch von musik kennt, die von raum zu raum folgt.
#!/usr/bin/perl
use warnings;
use strict;
my $num;
my $zahl1;
my $zahl2;
$num = 5; # hier kannst dann 23 oder 14 oder was auch immer setzen.
if ( $num =~ m#(\d)(\d?)# ) {
$zahl1 = $1;
$zahl2 = $2 if (defined($2) );
}
print('Zahl1: ' . $zahl1 . ' und Zahl2: ' . $zahl2 . "\n");
Das kannst Du erstmal in eine einfache Datei mit Namen test.pl einfügen.
Diese Datei führst Du dann mal aus.
/usr/bin/perl test.pl
könnte man das nicht auch gleich in eine 99myutils legen und permanent die zahlen in readings werfen?
hab ja sowieso wieder keinen schimmer, wie ich dann automatisch die $num in das file schreiben kann.
Das war doch nur zur Veranschaulichung.
Perl und Dein Anliegen hat ja erstmal nichts mit FHEM zu tun. So kannst Du aber Deine Perlausdrücke erstmal testen.
Und ja, natürlich kannst Du den Code in eine myUtils bringen.
Hier habe ich eine 99_myUtils
99_myUtils_Helper.pm
##############################################
# $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_Helper_Initialize($$)
{
my ($hash) = @_;
}
# Enter you functions below _this_ line.
sub splitNum($) {
my $num = shift;
my $zahl1;
my $zahl2;
if ( $num =~ m#(\d)(\d?)# ) {
$zahl1 = $1;
$zahl2 = $2 if (defined($2) );
}
return($zahl1,$zahl2);
}
1;
vielen thx ... veranschaulichen? du meinst, ich kapier diesen programm-kauderwelsch mal? da versteh ich vorher noch die verspätungsgründe der deutschen bahn *lach*
ne ernsthafte frage: was ist das "shift" in "my $num = shift;"?
jetzt müßt ich nur mehr wissen, wie ich eine zahl, z.b. aus deinen lgtv-readings (am besten voll automatisch) da rein krieg und automatisch meine 2 neuen readings damit fülle.
weißt ja - meinereiner is ne absolute nulpe in sachen perl (oder sonstiger programmiersprachen).
ich frag mich halt immer noch, ob man das ganze ned irgendwie in ein dummes doif kriegen könnte.
Kann man immer - für jede einzelne Möglichkeit einen eigenen DoIf-Zweig. Je nach Anzahl deiner ein- bis zweistelligen Readings werden das halt ggf. ein paar viele Zweige.
Oder sich halt (wie ich auch) langsam und qualvoll und fehlerträchtig und via trial and error doch mal mit Perl beschäftigen. :)
Zitatdoch mal mit Perl beschäftigen.
*lach* es haben schon ganz andere leute probiert, mir div. programmiersprachen beizubringen und sind kläglichst gescheitert. es würd nicht mal an unwillen meinerseits liegen, aber für mich is das zeug so derartig unlogisch, dass ich nie von selber auf was kommen würde.
aber das ist ne andere baustelle ...
Wenn du mit DOIF hantierst, dann kannst du es einfach auch über DOIF_Readings regeln:
attr <dein DOIF> DOIF_Readings erste_Stelle:[TV:quellReading:"^(\d)"], zweite_Stelle:[TV:quellReading:"^\d(\d)"]
[$SELF:erste_Stelle] und [$SELF:zweite_Stelle] kannst du im gleichen DOIF dann nutzen.
so einfach?
genial!
werds heut nachmittag ausprobieren - wenn das funzt, is es genau das, was ich gesucht hab
aber auch hier wieder die frage: was passiert, wenn die zahl nur 1 stelle hat? das auch, damit ich kapier, was da rennt
die 0 in die erste stelle zu kriegen sollte wohl so funzen? erste_Stelle:[TV:quellReading:"^(\d)",0]
Einfach ausprobieren:
https://regexr.com
^(\d) in den ersten Kasten, in den zweiten in eine Zeile "1", in eine zweite "12" - das, was unterlegt wird, entsprecht der Regex
Dasselbe dann mit der zweiten RegEx ^\d(\d)
"^" bezeichnet bei einer RegEx den Anfang, "\d" eine Ziffer :)
die sache rennt schon mal ganz gut.
bei 2-stelligen zahlen krieg ichs wunderbar aufgeteilt
bei 1-stelligen wird mein 1. reading gefüllt, das 2. bleibt dann leer
sobald ich zuhause bin, kann ich ja mal probieren, was passiert, wenn ich 2 set-befehle absetz und der 2. nichts sendet.
wenns dem tv egal ist, ist die sache schon gegessen, wenn nicht, hoffe ich, nochmal nerven zu dürfen.
Mach es als String, setz ne 0 davor und nimm die beiden rechten Zeichen.
Oder formatiere es als zweistellige Zahl mit führender 0
printf "%02d\n",$Kanal;
funzt alles schon mit damians lösung.
vielen dank für euer aller gehirnschmalz!