FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: the ratman am 27 März 2019, 22:05:13

Titel: [erledigt] einfache lösung für zahlen zerlegen im doif gesucht
Beitrag von: the ratman am 27 März 2019, 22:05:13
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?
Titel: Antw:einfache lösung für zahlen zerlegen im doif gesucht
Beitrag von: Esjay am 27 März 2019, 22:56:14
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
Titel: Antw:einfache lösung für zahlen zerlegen im doif gesucht
Beitrag von: rubbertail am 28 März 2019, 06:50:03
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



Titel: Antw:einfache lösung für zahlen zerlegen im doif gesucht
Beitrag von: the ratman am 28 März 2019, 07:17:25
@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

Titel: Antw:einfache lösung für zahlen zerlegen im doif gesucht
Beitrag von: CoolTux am 28 März 2019, 07:25:45
RegEx match
Titel: Antw:einfache lösung für zahlen zerlegen im doif gesucht
Beitrag von: the ratman am 28 März 2019, 07:45:53
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.
Titel: Antw:einfache lösung für zahlen zerlegen im doif gesucht
Beitrag von: CoolTux am 28 März 2019, 07:52:30
#!/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
Titel: Antw:einfache lösung für zahlen zerlegen im doif gesucht
Beitrag von: the ratman am 28 März 2019, 07:56:34
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.
Titel: Antw:einfache lösung für zahlen zerlegen im doif gesucht
Beitrag von: CoolTux am 28 März 2019, 08:08:42
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;
Titel: Antw:einfache lösung für zahlen zerlegen im doif gesucht
Beitrag von: the ratman am 28 März 2019, 08:42:37
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.
Titel: Antw:einfache lösung für zahlen zerlegen im doif gesucht
Beitrag von: rubbertail am 28 März 2019, 08:46:38
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. :)
Titel: Antw:einfache lösung für zahlen zerlegen im doif gesucht
Beitrag von: the ratman am 28 März 2019, 08:53:13
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 ...
Titel: Antw:einfache lösung für zahlen zerlegen im doif gesucht
Beitrag von: Damian am 28 März 2019, 08:55:08
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.
Titel: Antw:einfache lösung für zahlen zerlegen im doif gesucht
Beitrag von: the ratman am 28 März 2019, 09:21:23
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]
Titel: Antw:einfache lösung für zahlen zerlegen im doif gesucht
Beitrag von: rubbertail am 28 März 2019, 09:27:13
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 :)
Titel: Antw:einfache lösung für zahlen zerlegen im doif gesucht
Beitrag von: the ratman am 28 März 2019, 09:37:22
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.
Titel: Antw:einfache lösung für zahlen zerlegen im doif gesucht
Beitrag von: Per am 29 März 2019, 11:51:24
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;
Titel: Antw:[erledigt] einfache lösung für zahlen zerlegen im doif gesucht
Beitrag von: the ratman am 29 März 2019, 13:04:26
funzt alles schon mit damians lösung.

vielen dank für euer aller gehirnschmalz!