Abbildung eines Stromstoßrelais

Begonnen von Oliver Vallant, 19 Februar 2017, 14:33:08

Vorheriges Thema - Nächstes Thema

viegener

Zitat von: Thorsten Pferdekaemper am 20 Februar 2017, 07:39:09
...außerdem geht mit sleep auch 300ms:Ich glaube, dass am Ende "return undef" das richtige wäre. Die setFn handelt ja schon alles ab und laut Commandref scheint mir das zu sagen "tue (ansonsten) nichts".
Gruß,
   Thorsten

Ja das ist auch im Modulcode so implementiert, mich hatte nur verwundert, dass es ohne return nicht funktioniert. Ich hätte angenommen, dass das einem "return undef" entspricht.

Also soillte die setfn eigentlich so aussehen


setFn      {
       my $cur = ReadingsVal("Sensor","sensed.0",0);
       if ((($CMD eq "on") && ($cur == 0)) || (($CMD eq "off") && ($cur == 1)) || ($CMD eq "toggle") ) {
           fhem("set Relais PIO.0 11; sleep 1; set Relais PIO.0 10");
      }
      return undef;
}

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Thorsten Pferdekaemper

Hi,
aus http://perldoc.perl.org/functions/return.html:
Zitat
(In the absence of an explicit return, a subroutine, eval, or do FILE  automatically returns the value of the last expression evaluated.)
Gruß,
   Thorsten
FUIP

viegener

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Oliver Vallant

Hallo viegener und Thorsten,

mit "return undef" funktioniert's perfekt. Ich werde den eigentlichen Umschaltimpuls noch in eine Schleife packen, falls die Stromstoßrelais beim ersten Impuls nicht umsetzen (kann sein, wenn länger nicht benutzt kleben diese leicht fest).
Gibt es eine Möglichkeit in fhem den Code in eine Funktion zu abstrahieren, sodass bei einem weiteren Gerät nur mehr der Sensor-Kanal und Relais-Kanal angegeben werden muss, sowie bei Änderungen am Code, diese für alle Geräte durchschlagen?

Vielen vielen Dank für eure Hilfe!!
LG Oliver

viegener

Zitat von: Oliver Vallant am 20 Februar 2017, 14:10:09
Hallo viegener und Thorsten,

mit "return undef" funktioniert's perfekt. Ich werde den eigentlichen Umschaltimpuls noch in eine Schleife packen, falls die Stromstoßrelais beim ersten Impuls nicht umsetzen (kann sein, wenn länger nicht benutzt kleben diese leicht fest).
Gibt es eine Möglichkeit in fhem den Code in eine Funktion zu abstrahieren, sodass bei einem weiteren Gerät nur mehr der Sensor-Kanal und Relais-Kanal angegeben werden muss, sowie bei Änderungen am Code, diese für alle Geräte durchschlagen?

Vielen vielen Dank für eure Hilfe!!
LG Oliver


Schön das es geht.
Um den Code wiederverwendbar zu machen setze ich meist Subroutinen in 99_myUtils.pm ein (https://wiki.fhem.de/wiki/99_myUtils_anlegen) und dann kannst Du eine sub definieren, die als Parameter den Wert von $CMD, etc annimmt.
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Thorsten Pferdekaemper

Zitat von: Oliver Vallant am 20 Februar 2017, 14:10:09Ich werde den eigentlichen Umschaltimpuls noch in eine Schleife packen, falls die Stromstoßrelais beim ersten Impuls nicht umsetzen
Das ist aber u.U. gar nicht so einfach. Das Konstrukt fhem("tuwas;sleep 1;tuwasanderes") kommt ja zurück, bevor es ganz abgearbeitet ist. Da wirst Du Dir was einfallen lassen müssen.

Zitat
Gibt es eine Möglichkeit in fhem den Code in eine Funktion zu abstrahieren, sodass bei einem weiteren Gerät nur mehr der Sensor-Kanal und Relais-Kanal angegeben werden muss, sowie bei Änderungen am Code, diese für alle Geräte durchschlagen?
Klar, Unterprogramm (Funktion) schreiben und in die 99_myUtils.pm packen.

Gruß,
   Thorsten
FUIP

Oliver Vallant

Falls jemand die Funktionen benötigt:

Für normale Spulen/Thyrister/MosFET-Relais:

DEF=<Relais DS2408>:sensed.<Channel 0..7>
TYPE=readingsProxy
setFn={switchRelais($CMD, $READING)}


Funktion in der 99:myUtils.pm

sub switchRelais($$) {
   my ($cmd, $relCh) = @_;
   $relCh = (split(/\./, $relCh))[1];
   $cmd = ($cmd eq "on")?owON:owOFF;
   return ("PIO." . $relCh . " " . $cmd);
}


Für 2-Kanal-Stromstoß-Relais (1xRückmeldung,1xLast):
Zusätzliches globales userattr angelegt: "relaisDevCh"

DEF=<Sensor DS2408>:sensed.<Channel 0..7>
TYPE=readingsProxy
setFn={switchSSRelais($CMD, $DEVICE, $READING, AttrVal($name,"relaisDevCh",undef) )}
relaisDevCh=<Relais DS2408> PIO.<Channel 0..7>


Funktion in der 99:myUtils.pm

sub switchSSRelais($$$$) {
   my ($CMD, $senDev, $senCh, $relDevCh) = @_;
   my $cur = ReadingsVal($senDev,$senCh,0);
   if ((($CMD eq "on") && ($cur == 1)) || (($CMD eq "off") && ($cur == 0)) || ($CMD eq "toggle") ) {
    fhem("set " . $relDevCh . " " . owON . "; sleep 0.2; set " . $relDevCh . " " . owOFF); }
return undef
}


Taster am Sensor:


DEF=<Sensor DS2408>:latch.<channel 0..7>
TYPE=readingsProxy
setFn={ if ($CMD eq "reset") { "$READING 10" } }
setList=reset



Das Notify für den Taster, sowie rücksetzen des Alarming:

DEF=<TasterDevice>.on set <Relais oder SSRelais> toggle ; set <TasterDevice> reset
TYPE=notify


@Thorsten: Dein Bedenken ist korrekt. Das wird dann wohl ohne "at" nicht funktionieren.