[erledigt] einfache lösung für zahlen zerlegen im doif gesucht

Begonnen von the ratman, 27 März 2019, 22:05:13

Vorheriges Thema - Nächstes Thema

the ratman

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?
→do↑p!dnʇs↓shit←

Esjay

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

rubbertail

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



FHEM auf Raspi, CUL433, CUL868, RFXTRX433e, CULCuBE
FRITZ: Fritzbox7590AX, 6xFritzDECT301, 10xFritzDECT200, FritzRepeater 6000
MAX!: Fensterkontakte
netatmo: Wetterstation & Thermostat
Milights, IT, Withings, HUE

the ratman

@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

→do↑p!dnʇs↓shit←

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

the ratman

#5
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.
→do↑p!dnʇs↓shit←

CoolTux

#!/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
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

the ratman

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.
→do↑p!dnʇs↓shit←

CoolTux

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;
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

the ratman

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.
→do↑p!dnʇs↓shit←

rubbertail

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. :)
FHEM auf Raspi, CUL433, CUL868, RFXTRX433e, CULCuBE
FRITZ: Fritzbox7590AX, 6xFritzDECT301, 10xFritzDECT200, FritzRepeater 6000
MAX!: Fensterkontakte
netatmo: Wetterstation & Thermostat
Milights, IT, Withings, HUE

the ratman

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 ...
→do↑p!dnʇs↓shit←

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

the ratman

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]
→do↑p!dnʇs↓shit←

rubbertail

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 :)
FHEM auf Raspi, CUL433, CUL868, RFXTRX433e, CULCuBE
FRITZ: Fritzbox7590AX, 6xFritzDECT301, 10xFritzDECT200, FritzRepeater 6000
MAX!: Fensterkontakte
netatmo: Wetterstation & Thermostat
Milights, IT, Withings, HUE