Benötige Hilfe beim kürzen von einem Code

Begonnen von dogexan, 31 Mai 2014, 14:52:59

Vorheriges Thema - Nächstes Thema

Puschel74

Hallo,

das
ZitatAufruf durch: define nmanRasen notify manRasen {manuellRasen()}
sollte sich so
ZitatAufruf durch: define nmanRasen notify manRasen {manuellRasen($EVENT)}
vereinfachen lassen.
Damit wir nur das Event an die sub übergeben - wenn ich das richtig im Kopf habe.

Dann muss das
Zitatsub manuellRasen(){
noch so
sub manuellRasen($){
aussehen und du könntest dir das ReadingsVal vermutlich sparen.

my $manRasen = $_;
sollte dann an $manRasen ein, aus oder die Zahlen übergeben.
Ob das mit $_; klappt kann ich aber grad nicht ausprobieren - ich bin hier auch selbst noch am lernen (und spick bei dir ab  ;D ).

ZitatEdit: Hab den Code von "Rasen" in "Vorgarten" geändert
Welchen Code und wo hast du Anpassungen vorgenommen?

Den Code mal neu in Code-Tags stellen würde einige Nachfragen erübrigen  8)

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

dogexan

@ Puschel74

define nmanVorgarten notify manVorgarten {
  if ($EVENT ne "an" || $EVENT ne "aus") {
    fhem("set Vorgarten on-for-timer ".(Value("manVorgarten")*60));
  }
  else {
    fhem("set Vorgarten $EVENT");
  }
}


Bekomme bei speichern folgenden fehler:
syntax error at ./FHEM/99_myUtils.pm line 119, near "if" Global symbol "$EVENT" requires explicit package name at ./FHEM/99_myUtils.pm line 119. Global symbol "$EVENT" requires explicit package name at ./FHEM/99_myUtils.pm line 119.

line 119 ist die "if" Zeile

Gruß Alex

dogexan

So hab jetzt völlig Orientierung verlorern

epsrw1

#18
neuer versuch ;) vom "Fachidioten" ;)
###########################################################
# Timer für Dropdown Menü Rasen
# Aufruf durch: define manRasen notify manRasen {manuellDummySchalten("manRasen","Rasen")}
# Aufruf durch: define manVorgarten notify manVorgarten {manuellDummySchalten("manVorgarten","Vorgarten")}
#               define manRasen dummy
sub manuellDummySchalten($@){
my ($dummy,$aktor) = @_;
my $manRasen = ReadingsVal($dummy,"state",$dummy." kann nicht gelesen werden");
if($manRasen eq "an"){
fhem("set ".$aktor." on");
}elsif($manRasen eq "aus"){
fhem("set ".$aktor." off");
}elsif($manRasen=~/^[+-]?\d+$/){ #$manRasen enthält nichts anderes als eine ganze zahl
fhem("set ".$aktor." on-for-timer ".($manRasen*60));
}else{ #in allen anderen fällen ist $manRasen nicht lesbar oder ungültiger wert
Log3("99_myUtils", 3, "manuellDummySchalten: Error detected, \$dummy".$dummy." \$aktor".$aktor." value ".$manRasen);
}
}
Ich habe keine Ahnung, aber davon wenigstens ganz viel

Puschel74

Hallo,

Zitatals die notifys mit copy/paste in ewig lange config zu verwandeln
Wenn mehr dieser Codes notwendig sind hast du recht - dann ist deine Variante (der TE hat das im Eingangspost ja auch schon so begonnen) die einfachere  ;)

Grüße

@dogexan
Mein Code war auch nie für die 99_MyUtils.pm gedacht  ;)
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

dogexan

#20
Also jetzt noch mal zum Code von Florian

###########################################################
# Timer für Dropdown Menü Vorgarten
# Aufruf durch: define nmanVorgarten notify manVorgarten {manuellDummySchalten("manVorgarten","Vorgarten")}
#               define manVorgarten dummy
sub manuellDummySchalten($@){
my ($dummy,$aktor) = @_;
my $manVorgarten = ReadingsVal($dummy,"state","manVorgarten kann nicht gelesen werden");
if($manVorgarten eq "an"){
fhem("set ".$aktor." on");
}elsif($manVorgarten eq "aus"){
fhem("set ".$aktor." off");
}elsif($manVorgarten=~/^[+-]?\d+$/){ #$manVorgarten enthält nichts anderes als eine ganze zahl
fhem("set ".$aktor." on-for-timer ".($manVorgarten*60));
}else{ #in allen anderen fällen ist $manVorgarten nicht lesbar oder ungültiger wert
Log3("99_myUtils", 3, "manuellVorgarten: Error detected, \$dummy".$dummy." \$aktor".$aktor." value ".$manVorgarten);
}
}


Den hab ich jetzt in der 99_myUtils Datei stehen
Mein notify heißt: define nmanVorgarten notify manVorgarten {manuellDummySchalten("manVorgarten","Vorgarten")}

Timer funktioniert on/off nicht

Log:
2014.06.01 10:50:56 3: CUL_HM set Vorgarten on-for-timer 60
2014.06.01 10:50:59 3: manuellVorgarten: Error detected, $dummymanVorgarten $aktorVorgarten value off
2014.06.01 10:53:59 3: manuellVorgarten: Error detected, $dummymanVorgarten $aktorVorgarten value on
2014.06.01 10:54:00 3: manuellVorgarten: Error detected, $dummymanVorgarten $aktorVorgarten value off

@ Puschel74

Ups, dachte das muss in myUtils Datei.
Ich werde das gleich mal notify ausprobieren (Einzeiler)

Edit: Timer funktioniert aber an bzw. aus nicht
Hier der Log:
2014.06.01 10:59:14 3: CUL_HM set Vorgarten on-for-timer 60
Argument "aus" isn't numeric in multiplication (*) at (eval 22326) line 3.
2014.06.01 10:59:18 3: set Vorgarten on-for-timer 0 : timer value to low
2014.06.01 10:59:18 3: nmanVorgarten return value: timer value to low

Gruß Alex

epsrw1

#21
fhem> define manRasenNotify notify manRasenDummy {manuellDummySchalten("manRasenDummy","Rasen")}
fhem> define manRasenDummy dummy
fhem> set manRasenDummy 3

bringt mir fehler:
2014.06.01 11:03:09 3: set Rasen on-for-timer 180 : Please define Rasen first
2014.06.01 11:03:09 3: manRasenNotify return value: Please define Rasen first
das sieht gut aus, alles funktioniert nur habe ich keinen rasen.

edit:
fhem> set manRasenDummy off
2014.06.01 11:06:45 3: manuellDummySchalten: Error detected, $dummymanRasenDummy $aktorRasen value off

fhem> set manRasenDummy aus
2014.06.01 11:07:39 3: set Rasen off : Please define Rasen first
2014.06.01 11:07:39 3: manRasenNotify return value: Please define Rasen first

(code auch geändert, log sah nicht schön aus)

###########################################################
# Timer für Dropdown Menü Rasen
# Aufruf durch: define manRasenNotify notify manRasenDummy {manuellDummySchalten("manRasenDummy","Rasen")}
# Aufruf durch: define manRasenNotify notify manRasenDummy {manuellDummySchalten("manVorgartenDummy","Vorgarten")}
#               define manRasenDummy dummy
sub manuellDummySchalten($$){
my ($dummy,$aktor) = @_;
my $manRasen = ReadingsVal($dummy,"state",$dummy." kann nicht gelesen werden");
if($manRasen eq "an"){
fhem("set ".$aktor." on");
}elsif($manRasen eq "set"){
fhem("set ".$aktor." off");
}elsif($manRasen=~/^[+-]?\d+$/){ #$manRasen enthält nichts anderes als eine ganze zahl
fhem("set ".$aktor." on-for-timer ".($manRasen*60));
}else{ #in allen anderen fällen ist $manRasen nicht lesbar oder ungültiger wert
Log3("99_myUtils", 3, "manuellDummySchalten: Error detected, \$dummy=".$dummy." \$aktor=".$aktor." value ".$manRasen);
}
}


Ich habe keine Ahnung, aber davon wenigstens ganz viel

dogexan

Ich fasse das jetzt nochmal zusammen:

Mein Aktor heißt: Vorgarten
der dummy: manVorgarten (Ein Screenshot hängt ein paar Posts vorher von mir mit dran)

mein notify heißt momentan: define nmanVorgarten notify manVorgarten {manuellmanVorgarten("manVorgarten","Vorgarten")}

Mir geht es nur um den Aktor "Vorgarten", für "Rasen" würde ich Routine dann anpassen.

Demnach hab ich den Code von Florian entsprechend angepasst:

###########################################################
# Timer für Dropdown Menü Vorgarten
#
#
sub manuellmanVorgarten($$){
my ($manVorgarten,$Vorgarten) = @_;
my $manVorgarten = ReadingsVal($manVorgarten,"state",$manVorgarten." kann nicht gelesen werden");
if($manVorgarten eq "an"){
fhem("set ".$Vorgarten." on");
}elsif($manVorgarten eq "aus"){
fhem("set ".$Vorgarten." off");
}elsif($manVorgarten=~/^[+-]?\d+$/){ #$manVorgarten enthält nichts anderes als eine ganze zahl
fhem("set ".$Vorgarten." on-for-timer ".($manVorgarten*60));
}else{ #in allen anderen fällen ist $manVorgarten nicht lesbar oder ungültiger wert
Log3("99_myUtils", 3, "manuellmanVorgarten: Error detected, \$manVorgarten".$manVorgarten." \$Vorgarten".$Vorgarten." value ".$manVorgarten);
}
}


Florian kannst du bitte noch einmal einen Blick drauf werfen?

Hab fast völlig den Überblick verloren.

Wie gesagt Timer funktioniert "an" oder "aus" nicht. Eventuell hab ich was vergessen umzubenennen.
Können wir bitte beim "Vorgarten" bleiben, sonst bekomme ich das nicht gebacken ;)

Gruß Alex

epsrw1

#23
Zitatmein notify heißt momentan:
Code:
define nmanVorgarten notify manVorgarten {manuellmanVorgarten("manVorgarten","Vorgarten")}
[/s]

der code für die 99_myUtils aus meinem letzten posting kann ohne änderung für alle Deine dummies gleichermaßen verwendet werden und muß nciht kopiert oder dupliziert werden.
da die device-namen von dummy und aktor im ($$) mit übergeben werden mußt Du den nicht mehrfach anlegen.
am anfang, in meinem comment im code, stehen 2 beispiele für Rasen und Vorgarten, nur diese zeile in fhem.cfg mußt Du für jeden Deiner dummies einzeln anpassen.
hab den code nochmal ein wenig angepaßt damit der leichter lesbar/verständlich ist
gruß, florian


###########################################################
# Timer für Dropdown Menü Universell
# Aufruf durch: define manRasenNotify notify manRasenDummy {manuellDummySchalten("manRasenDummy","Rasen")}
#               define manRasen dummy
# Aufruf durch: define manVorgartenNotify notify manVorgartenDummy {manuellDummySchalten("manVorgartenDummy","Vorgarten")}
#               define manVorgarten dummy
sub manuellDummySchalten($$){
my ($dummy,$aktor) = @_;
my $dummyValue = ReadingsVal($dummy,"state",$dummy." kann nicht gelesen werden");
if($dummyValue eq "an"){
fhem("set ".$aktor." on");
}elsif($dummyValue eq "set"){
fhem("set ".$aktor." off");
}elsif($dummyValue=~/^[+-]?\d+$/){ #$dummyValue enthält nichts anderes als eine ganze zahl
fhem("set ".$aktor." on-for-timer ".($dummyValue*60));
}else{ #in allen anderen fällen ist $dummyValue nicht lesbar oder ungültiger wert
Log3("99_myUtils", 3, "manuellDummySchalten: Error detected, \$dummy=".$dummy." \$aktor=".$aktor." value ".$dummyValue);
}
}


define nmanRasen notify manRasen {manuellDummySchalten("manRasen","Rasen")}
define manRasen dummy
define nmanVorgarten notify manVorgarten {manuellDummySchalten("manVorgarten","Vorgarten")}
define manVorgarten dummy
Ich habe keine Ahnung, aber davon wenigstens ganz viel

dogexan

#24
Okay,

danke für die Erklärung.

Hab jetzt den Code in der 99_,myUtils Datei kopiert und den notify momentan nur vom Vorgarten angepasst.

Timer funktioniert "on" oder "off" leider immer noch nicht

Ich hab kein Plan warum?

Hier noch der Log:
2014.06.01 13:01:11 3: CUL_HM set Vorgarten on-for-timer 60
2014.06.01 13:01:30 3: manuellDummySchalten: Error detected, $dummy=manVorgarten $aktor=Vorgarten value on
2014.06.01 13:01:31 3: manuellDummySchalten: Error detected, $dummy=manVorgarten $aktor=Vorgarten value off

Danke für deine Geduld

Gruß Alex

epsrw1

ich hatte im hinterkopf daß die schaltung mit den kommandos "an" und "aus" gehen sollte .... hier nochmal ein update das sowohl an/aus als auch on/off als command annimmt:

###########################################################
# Timer für Dropdown Menü Rasen
# Aufruf durch: define manRasenNotify notify manRasenDummy {manuellDummySchalten("manRasenDummy","Rasen")}
#               define manRasen dummy
# Aufruf durch: define manVorgartenNotify notify manVorgartenDummy {manuellDummySchalten("manVorgartenDummy","Vorgarten")}
#               define manVorgarten dummy
sub manuellDummySchalten($$){
my ($dummy,$aktor) = @_;
my $dummyValue = ReadingsVal($dummy,"state",$dummy." kann nicht gelesen werden");
if(($dummyValue eq "an") or ($dummyValue eq "on")){
fhem("set ".$aktor." on");
}elsif(($dummyValue eq "aus") or ($dummyValue eq "off")){
fhem("set ".$aktor." off");
}elsif($dummyValue=~/^[+-]?\d+$/){ #$dummyValue enthält nichts anderes als eine ganze zahl
fhem("set ".$aktor." on-for-timer ".($dummyValue*60));
}else{ #in allen anderen fällen ist $dummyValue nicht lesbar oder ungültiger wert
Log3("99_myUtils", 3, "manuellDummySchalten: Error detected, \$dummy=".$dummy." \$aktor=".$aktor." value ".$dummyValue);
}
}


PS: war übrigens eh noch ein fehler beim "aus"-schalten drin den ich gerade erst gesehen habe
Ich habe keine Ahnung, aber davon wenigstens ganz viel

dogexan

Es klappt  ;D ;D ;D

Beim Vorgarten funktioniert schon mal alles, dann werde ich das jetzt beim "Rasen" auch mal einstellen und noch ein dummy und ein notify für "Beete" erstellen.

Ich melde mich dann gleich noch mal ob alles funktioniert hat

Gruß Alex

dogexan

Also funktioniert alles 8)

Danke an alle, besonderes an Florian

mit diesem Code passt alles perfekt ;D

###########################################################
# Timer für Dropdown Menü Rasen
# Aufruf durch: define nmanRasen notify manRasen {manuellDummySchalten("manRasen","Rasen")}
#               define manRasen dummy
# Aufruf durch: define nmanVorgarten notify manVorgarten {manuellDummySchalten("manVorgarten","Vorgarten")}
#               define manVorgarten dummy
# Aufruf durch: define nmanBeete notify manBeete {manuellDummySchalten("manBeete","Beete")}
#               define manBeete dummy
sub manuellDummySchalten($$){
my ($dummy,$aktor) = @_;
my $dummyValue = ReadingsVal($dummy,"state",$dummy." kann nicht gelesen werden");
if(($dummyValue eq "an") or ($dummyValue eq "on")){
fhem("set ".$aktor." on");
}elsif(($dummyValue eq "aus") or ($dummyValue eq "off")){
fhem("set ".$aktor." off");
}elsif($dummyValue=~/^[+-]?\d+$/){ #$dummyValue enthält nichts anderes als eine ganze zahl
fhem("set ".$aktor." on-for-timer ".($dummyValue*60));
}else{ #in allen anderen fällen ist $dummyValue nicht lesbar oder ungültiger wert
Log3("99_myUtils", 3, "manuellDummySchalten: Error detected, \$dummy=".$dummy." \$aktor=".$aktor." value ".$dummyValue);
}
}


Gruß Alex

dogexan

Hallo,

ich hatte jetzt genügend Zeit zu testen.

Funktioniert auch alles, allerdings eine Kleinigkeit stört mich noch.

Wenn ich aus dem Dropdown Menü z.B. die 5 auswähle wird auch für 5 min bewässert. Soweit so gut. Problem nach dem die 5 Minuten abgelaufen sind bleibt das Dropdown Menü auf der 5 stehen. Das heißt ich muss wenn ich wieder bewässern eine andere Zeit nehmen z.B. 4 min. oder ich wähle erst "Minuten" aus dem Dropdown Menü aus und danach wieder 5 Minuten.

Wie ist es Möglich dass wenn ich ein Zahl aus dem Dropdown Menü auswähle, nach der selben Anzahl an Minuten der Dummy den State "Minuten" wieder annimmt.

siehe noch Anhang

Gruß Alex

Puschel74

Hallo,

indem du die Anweisung das der Dummy nach x Minuten auf Minuten stehen soll einfach in den Code mit einbaust  ;)

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.