Benötige Hilfe beim kürzen von einem Code

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

Vorheriges Thema - Nächstes Thema

dogexan

Hallo zusammen,

Ich nehme Bezug auf ein anderes Thema von mir, hier der Link:http://forum.fhem.de/index.php/topic,24113.0.html

Ich habe es nun auch geschafft das Dropdown Menü ans laufen zu bringen.
Allerdings ist der Code nun ziemlich lang und irgendwie wenig elegant.

Hier erstmal der Code:

###########################################################
# Timer für Dropdown Menü Rasen
#
# Aufruf durch: define nmanRasen notify manRasen {manuellRasen("manRasen")}
#               define manRasen dummy
#
sub manuellRasen($) {
my ($Rasen) = "manRasen";
if (Value($Rasen) eq "1"){
    {fhem("set Rasen on-for-timer 60")}
}
  else {
   if (Value($Rasen) eq "2"){
    {fhem("set Rasen on-for-timer 120")}
}
  else {
   if (Value($Rasen) eq "3"){
    {fhem("set Rasen on-for-timer 180")}
}
  else {
   if (Value($Rasen) eq "4"){
    {fhem("set Rasen on-for-timer 240")}
}
  else {
   if (Value($Rasen) eq "5"){
    {fhem("set Rasen on-for-timer 300")}
}
  else {
   if (Value($Rasen) eq "7"){
    {fhem("set Rasen on-for-timer 480")}
}
   else {
    if (Value($Rasen) eq "10"){
    {fhem("set Rasen on-for-timer 600")}
}
   else {
    if (Value($Rasen) eq "15"){
    {fhem("set Rasen on-for-timer 900")}
}
   else {
    if (Value($Rasen) eq "20"){
    {fhem("set Rasen on-for-timer 1200")}
}
   else {
    if (Value($Rasen) eq "an"){
    {fhem("set Rasen on")}
}
   else {
    if (Value($Rasen) eq "aus"){
    {fhem("set Rasen off")}
}}}}}}}}}}}}


Ich habe bereits ein paar Ideen die theoretisch funktionieren könnten, allerdings scheitert es dann an der Umsetzung
Eine Idee wäre gewesen:
my ($Dauer) = ((Value($Rasen) eq "1")*60)
Um nachher:
{fhem("set Rasen on-for-timer ($Dauer)")}
zu verwenden

Hoffentlich kann jemand helfen, weil ich noch weitere Dropdown Menüs dieser Art brauche und die 99_myUtils Datei durch solche "Kleinigkeit" recht "voll" wird.

Gruß Alex

stromer-12

Hi,

als Einzeiler im notify sollte das gehen:

{fhem("set Rasen on-for-timer ".Value("%NAME")*60)}
FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL

dogexan

Schon mal Danke für deine Antwort.

Leider verstehe ich nicht genau was du mir damit sagen willst.

Ich hab jetzt folgenden notify angelegt:
define nmanVorgarten notify manVorgarten {fhem("set Rasen on-for-timer ".Value("%Vorgarten")*60)}

Nicht wundern der "Vorgarten" muss jetzt für meine Experimente herhalten (der Rasen steht schon Unterwasser) ;)

Klappt so aber nicht :(

Gruß Alex

Puschel74

Hallo,

ZitatKlappt so aber nicht
Und im Logfile müsste stehen was FHEM nicht mag  ;)

define nmanVorgarten notify manVorgarten {fhem("set Rasen on-for-timer ".(Value("Vorgarten")*60))}

Lieber mal eine Klammer zuviel - abspecken geht immer noch  ;D

Ohne Garantie da ich grad den Code nicht am System teste.

Warum hat Vorgarten nicht gleich den Wert den du verwenden willst?
Dann erübrigt sich das multiplizieren.

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.

stromer-12

#4
Zitat von: dogexan am 31 Mai 2014, 17:34:35
Schon mal Danke für deine Antwort.

Leider verstehe ich nicht genau was du mir damit sagen willst.

Ich hab jetzt folgenden notify angelegt:
define nmanVorgarten notify manVorgarten {fhem("set Rasen on-for-timer ".Value("%Vorgarten")*60)}

Nicht wundern der "Vorgarten" muss jetzt für meine Experimente herhalten (der Rasen steht schon Unterwasser) ;)

Klappt so aber nicht :(

Gruß Alex

Ich war nach dem Kommentar von deiner Routine ausgegangen.
%NAME enthält den Namen des auslösenden Devices, also deines Dummys "manVorgarten".
Wenn der Name direkt angegeben wird ist das "%" wegzulassen.
Du müsstes sicherlich "Rasen" nach "Vorgarten" ändern.
FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL

dogexan

Hallo ihr beiden,

ich hab jetzt den geänderten Code von Puschel74 ausprobiert (natürlich mit "Vorgarten").
Leider ohne Erfolg.

Ich habe beim dummy manVorgarten im Dropdown die 1 ausgewählt.

Folgendes sagt der Log:

Argument "aus" isn't numeric in multiplication (*) at (eval 21880) line 1.
2014.06.01 08:59:34 3: set Vorgarten on-for-timer 0 : timer value to low
2014.06.01 08:59:34 3: nmanVorgarten return value: timer value to low

Ich benutzte jetzt nur diesen notify:
define nmanVorgarten notify manVorgarten {fhem("set Vorgarten on-for-timer ".(Value("Vorgarten")*60))}

in der 99_myUtils Datei wird über den Vorgarten nicht erwähnt.
Ich denke mal spätestens wenn ich den STATE an oder aus verwende wird es auch wieder notwendig sein die 99_myUtils Datei zu verwenden.
(siehe die letzten Zeilen des ersten geposteten Code)

Was ich an dem Logfile nicht verstehe ist, dass das Argument "aus" bemängelt wird. Ist zwar schon klar dass man nicht "aus" * 60 multiplizieren kann, allerdings habe ich gar nicht auf "aus" geklickt. :o

Im Anhang ein Screenshot vom dummy "manVorgarten"

Gruß Alex

Puschel74

#6
Hallo,

define nmanVorgarten notify manVorgarten {fhem("set Vorgarten on-for-timer ".(Value("manVorgarten")*60))}

Ein alias greift nur bei der Anzeige aber nicht im Code  ;)

Und das Device Vorgarten, welches per Value abgefragt wurde, wird wohl auf aus stehen - daher die Fehlermeldung.

Grüße

Edith: Daher bitte ich ja im angepinnten Beitrag um die defines ALLER relevanten Geräte  8)
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

#7
Der Aktor heißt "Vorgarten"
Der dummy "manVorgarten" und alias "Vorgarten"

mit: set Vorgarten on-for-timer 60 wir der Vorgarten für eine Minute bewässert.

Ich hatte den dummy nur angelegt um ein Dropdown Menü zu erstellen und nachher alias Vorgarten benannt damit er genau so heißt wie der von autocreate angelegte "Schalter"

Gruß Alex

Puschel74

Hallo,

das ist ja alles schön und gut.

Deswegen willst du dennoch die Zeit aus manVorgarten auswerten und an Vorgarten übergeben.
Was mein letzter gepostet Code auch machen sollte.

Wenn nicht dann bitte die Fehlermeldung dazu.

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

Danke,
der Code funktioniert ;D

das war dann mal ordentlich gekürzt.

Kann man in den Einzeiler auch noch "an" und "aus" unterbringen?

Gruß Alex

Puschel74

Hallo,

ZitatKann man in den Einzeiler auch noch "an" und "aus" unterbringen?

Mit Sicherheit.
Aber für solche Einzeiler bin ich dann leider der falsche Ansprechpartner.
Ich hatte glaube ich schonmal im Forum erwähnt das ich mit Einzeiler mehr oder weniger auf Kriegsfuß stehe  ;)

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.

epsrw1

als fehlervermeidungs-fanatiker würde ich das eher so lösen:
###########################################################
# Timer für Dropdown Menü Rasen
# Aufruf durch: define nmanRasen notify manRasen {manuellRasen()}
#               define manRasen dummy
sub manuellRasen(){
my $manRasen = ReadingsVal("manRasen","state","manRasen kann nicht gelesen werden");
if($manRasen eq "an"){
fhem("set Rasen on");
}elsif($manRasen eq "aus"){
fhem("set Rasen off");
}elsif($manRasen=~/^[+-]?\d+$/){ #$manRasen enthält nichts anderes als eine ganze zahl
fhem("set Rasen on-for-timer ".($manRasen*60));
}else{ #in allen anderen fällen ist $manRasen nicht lesbar oder ungültiger wert
Log3("99_myUtils", 3, "manuellRasen: Error detected in value ".$manRasen);
}
}

LG, florian
Ich habe keine Ahnung, aber davon wenigstens ganz viel

Puschel74

Hallo,

@florian
Wir sind noch in keiner sub sondern erstmal nur in einem normalen notify  ;)
Aber du hast recht.

@dogexan
Als Nicht-Einzeiler würde ich das so versuchen:
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);
  }
}

Wenn manVorgarten Nicht-Gleich an ODER Nicht-Gleich aus ist gehe ich davon aus das manVorgarten eine Zahl enthält (das wird !nicht geprüft).
Dann wird ganz normal der on-for-timer berechnet und an Vorgarten gesendet.
Sonst wird $EVENT (was hoffentlich an oder aus ist) an Vorgarten gesendet.

Achtung:
an und aus muss noch per eventMap in Vorgarten auf on und off gemappt werden - ich hoffe das klappt dann so.
Achtung1: Meine Codes sind NICHT für die fhem.cfg gedacht!

Wie meine Codes per Befehlszeile eingegeben werden können ist in diversen Beiträge beschrieben - bitte einfach mal die Suche bemühen und ggf. nach Puschel* als Benutzer suchen.
Danke  ;)

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

#13
Ok, alles klar

Nochmal vielen Dank an euch beide.  :D

An epsrw1:

Der Timer über das Dropdown Menü funkioniert, aber "an" und "aus" funktioniert nicht

Log:
Prototype mismatch: sub main::manuellVorgarten ($) vs () at ./FHEM/99_myUtils.pm line 132.
2014.06.01 10:28:29 3: CUL_HM set Vorgarten on-for-timer 60
2014.06.01 10:28:36 3: manuellVorgarten: Error detected in value off
2014.06.01 10:29:41 3: manuellVorgarten: Error detected in value on

Edit: Hab den Code von "Rasen" in "Vorgarten" geändert
Edit2: line 132 ist bei mir die letzte Klammer

Gruß Alex

epsrw1

@Puschel, ja und auch nein ... im eröffnungsposting steht was von "brauche noch mehr davon" oder so ähnlich. aus diesem grund würde ich eher das ding in myUtils anlegen und den name des dummy und des zu schaltenden devices mit übergeben als die notifys mit copy/paste in ewig lange config zu verwandeln ... für einzelne anwendung hättest Du natürlich recht.
das ist mit sicherheit geschmackssache, und über geschmack kann man bekanntlich nicht sinnvoll streiten ;)
LG, florian
Ich habe keine Ahnung, aber davon wenigstens ganz viel