Hallo,
ich übergeben einen Device-Namen an eine (sub-)Routine. Name: Schalter.Wohnzimmer.
Mein Code sieht so aus :
my $dev=shift(@_);
my ($art,$sensor_ort)=split(/\./,$dev);
Das funktioniert auch wunderbar. Allerdings brauche ich die variable $art nicht. Ich möchte nur in der Variablen $sensor das "Wohnzimmer" haben.
Wie bekomme ich den ersten Teil bis zum .(Punkt) weg ?
Kannst $art auch $trash nennen und einfach nicht verwenden. Split muß ja die teile variablen zuweisen. Wenn du split einem @arr zuweist steht dein ort in $arr[1]. Ist prinzipiell das gleiche...
my @arr=split(/\./,$dev);
Gesendet von meinem SM-J510FN mit Tapatalk
my $dev=shift(@_);
ist rigendwie doppelt gemoppelt :D
Du kannst auch bei split nur einen bestimmten Teil zurück geben lassen.
my $sensor_ort = (split(/\./, shift, 2))[1];
Die 2 sorgt noch dafür, dass der String auch nur in zwei Teile aufgeteilt wird. die ()[1] gibt das zweite Element aus dem array des split zurück.
Zitat von: igami am 15 Juni 2017, 10:10:21
my $dev=shift(@_);
ist rigendwie doppelt gemoppelt :D
Dann habe ich es DOCH richtig verstanden :-) (@_) bedeutet doch, dass die Argumente nacheinander übergeben werden ? Es reicht demnach auch my $dev = @_ ?
Zitat von: igami am 15 Juni 2017, 10:10:21
Du kannst auch bei split nur einen bestimmten Teil zurück geben lassen.
my $sensor_ort = (split(/\./, shift, 2))[1];
Die 2 sorgt noch dafür, dass der String auch nur in zwei Teile aufgeteilt wird. die ()[1] gibt das zweite Element aus dem array des split zurück.
Super ! Vielen Dank !
Fein. Viele Wege gehen nach Rom[emoji106]
Gesendet von meinem SM-J510FN mit Tapatalk
Zitat von: derHeimwerker am 15 Juni 2017, 10:18:42
Dann habe ich es DOCH richtig verstanden :-) (@_) bedeutet doch, dass die Argumente nacheinander übergeben werden ? Es reicht demnach auch my $dev = @_ ?
@_ sind alle Elemente die übergeben werden und mit shift kann man das erste Element aus einem Array rausziehen. Bentzt du shift einfach nur so, wird automatisch @_ genommen. Bei nur einem Parameter geht als sowohl @_ wie auch shift. Bei mehreren ist @_ meist einfacher.
Beispiel:
sub highlander($) {
my $param = shift;
}
sub my cyberman($$$) {
my ($one, $two, $three) = @_;
}
Du kannst auch die ursprüngliche Variante verwenden und einfach keine Variable erzeugen:
my $dev=shift(@_);
my (undef,$sensor_ort)=split(/\./,$dev);
Stehe mal wieder auf meiner Leitung.
ich habe ein Gerät, das die Readings für eine RGBW auf einem Mysensors Node. Dieser möchte jedoch die einzelnen Readings getrennt haben
Internals:
CFGFN ./FHEM/Mysensors.cfg
DEF 107
IODev Homenode_gw
I_SKETCH_NAME RGBW
I_SKETCH_VERSION 2.0
NAME Homenode_107
NR 1153
STATE routingtable cleared
TYPE MYSENSORS_DEVICE
ack 1
protocol 2.1.1
radioId 107
repeater 1
READINGS:
2017-07-06 21:22:10 SKETCH_NAME RGBW
2017-07-06 21:22:10 SKETCH_VERSION 2.0
2017-07-06 21:22:10 parentId 0
2017-07-06 23:17:37 percentage3 0
2017-06-25 15:57:57 percentage5 0
2017-06-25 15:58:16 percentage6 0
2017-06-25 15:58:23 percentage9 10
2017-06-24 16:35:50 power3 0
2017-06-24 16:35:39 power5 0
2017-06-24 16:24:31 power6 0
2017-06-24 16:41:24 power9 2
2017-06-24 16:42:32 state routingtable cleared
2017-06-24 16:07:09 status3 on
2017-06-24 16:07:17 status5 on
2017-06-24 16:26:49 status6 on
2017-06-24 16:07:53 status9 on
readingMappings:
1:
24:
name value1
3:
17:
name power3
2:
name status3
3:
name percentage3
5:
17:
name power5
2:
name status5
3:
name percentage5
6:
17:
name power6
2:
name status6
3:
name percentage6
9:
17:
name power9
2:
name status9
3:
name percentage9
setcommands:
sets:
clear
percentage3 slider,0,1,100
percentage5 slider,0,1,100
percentage6 slider,0,1,100
percentage9 slider,0,1,100
power3 1
power5 1
power6 1
power9 1
reboot
status3 off,on
status5 off,on
status6 off,on
status9 off,on
time
value1 1
Attributes:
IODev Homenode_gw
alexaName Deckenlampe
alexaRoom Wohnzimmer
homebridgeMapping RGB=state,cmd=rgb
mapReading_percentage3 3 percentage
mapReading_percentage5 5 percentage
mapReading_percentage6 6 percentage
mapReading_percentage9 9 percentage
mapReading_power3 3 power
mapReading_power5 5 power
mapReading_power6 6 power
mapReading_power9 9 power
mapReading_status3 3 status
mapReading_status5 5 status
mapReading_status6 6 status
mapReading_status9 9 status
mapReading_value1 1 value1
mode repeater
requestAck 1
room Homenodes
setReading_percentage3 slider,0,1,100
setReading_percentage5 slider,0,1,100
setReading_percentage6 slider,0,1,100
setReading_percentage9 slider,0,1,100
setReading_power3 1
setReading_power5 1
setReading_power6 1
setReading_power9 1
setReading_status3 off,on
setReading_status5 off,on
setReading_status6 off,on
setReading_status9 off,on
setReading_value1 1
version 2.1.1
Im RGB_Light bekomme ich leider nur den RGB Wert von 000000 bis FFFFFF
Internals:
CFGFN ./FHEM/Mysensors.cfg
DEF RGB
DEVICE RGB
NAME RGB
NOTIFYDEV RGB,global
NR 1166
NTFY_ORDER 50-RGB
READING state
STATE on
TYPE readingsProxy
CONTENT:
RGB 1
READINGS:
2017-07-07 13:45:20 hue 0
2017-07-07 13:45:20 lastCmd rgb
2017-07-07 13:45:20 rgb ff0000
2017-07-07 13:45:20 state on
Attributes:
Light AllLights
alias RGB Licht
comment light with the ability to change RGB color
devStateIcon {Color::devStateIcon("RGB","rgb","rgb","state")}
group Beleuchtung_Innen
room Homenodes,Light
setFn {if( $CMD =~ m/on|off/ ) { $ARGS=$CMD;$CMD = "state" } else {fhem ("setreading $DEVICE state on");} if( $CMD =~ m/hue/ ) {my ($r,$g,$b) = Color::hsv2rgb($ARGS/360,1,1); my $rgb = Color::rgb2hex( $r*255, $g*255, $b*255 ); fhem ("setreading $DEVICE rgb $rgb");} if( $CMD =~ m/rgb/ && $ARGS =~ m/^(..)(..)(..)/ ) {my( $r, $g, $b ) = (hex($1)/255.0, hex($2)/255.0, hex($3)/255.0); my ($h,$s,$v) = Color::rgb2hsv($r,$g,$b); my $hue = int($h*359); fhem ("setreading $DEVICE hue $hue");} fhem ("setreading $DEVICE $CMD $ARGS");return undef;}
setList on:noArg off:noArg rgb:colorpicker,RGB hue:colorpicker,HUE,0,1,359
userattr Light Light_map structexclude
webCmd hue:rgb:rgb ff0000:rgb 00ff00:rgb 0000ff:rgb ffffff:on:off
Jetzt fehlt mir im Modul der "W" Wert, wobei ich das vermutlich getrennt hinbekommen würde.
Jedoch fehlt mir das Wissen um die "RGB" -> "R" "G" "B" zu splitten.
Weder GIDF.de noch die Sufu hat mir weiter geholfen.
Danke
Uli
Zitat
Jedoch fehlt mir das Wissen um die "RGB" -> "R" "G" "B" zu splitten.
Perldoc/sprintf hilft Dir auch nicht? Ich wüßte nicht, wie man es besser beschreiben könnte.
Zitat von: dev0 am 07 Juli 2017, 15:54:22
Perldoc/sprintf hilft Dir auch nicht? Ich wüßte nicht, wie man es besser beschreiben könnte.
Danke Dir.
Werde mich daran versuchen. Kenne mich nicht aus mit Perl. War mir immer zu Kryptisch.
Habe früher mal ein wenig mit Pascal und C gewerkelt. Aber lang ist es her.
Das ist auf jeden Fall mal ein Ansatz.
Gruß
Uli
Zitat von: hummeruli am 07 Juli 2017, 16:57:50
Kenne mich nicht aus mit Perl. War mir immer zu Kryptisch.
Habe früher mal ein wenig mit Pascal und C gewerkelt.
Perl's sprint hält sich an die kryptischen C Konventionen ;)
Alternativ capture groups einer regexp verwenden:
$rgb =~ m/^(..)(..)(..)$/;
Die Werte sind dann in den Variablen $1, $2, $3 verfügbar.