FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: blueberry63 am 22 April 2014, 14:04:07

Titel: Hilfe bei Perlcode: on-for-timer implementieren
Beitrag von: blueberry63 am 22 April 2014, 14:04:07
Hallo,

eigentlich geht es hier "nur" um eine Unterstützung bei der Perl-Programmierung, aber vielleicht interessiert ja auch jemand der Hintergrund:

Mein FHEM läuft auf einem Raspi und ich steuere von dort über einen Arduino+Ethernetshield+433Mhz-Modul (spez. Firmata-Version) Funksteckdosen von Pollin (3St. für 9.99 EUR). Als Device habe ich FS20-Dummies angelegt, über die ich die eigentlichen FRM-DEVICES triggere. FS20-Dummies habe ich genommen, weil ich dachte, "On-FOR-TIMER" würde damit funktionieren - geht aber nicht! Und deshalb wollte ich die Aufgabe folgendermassen lösen:

Zitat
STECKD_WERKR:on-for-timer.* {
set STECKD_WERKR on;
d1= value (STECKD_WERKR);  ### Bsp. "on-for-timer 4000"
d=<b<???Sekundenwert aus "on-for-timer xxx"  value ("STECK_WERKR" ???</b>;
dh = int($d / 3600);
dm = int($d / % 60);
ds = int($d) % 60;
df = {sprintf "%02d:%02d:502d", $dh, $dm, $ds};
define temp_timer_wr at +$df set STECKD_WERKR off;
}

Die Hilfe brauche ich bei Zeile 3. Wie bekomme ich den Sekunden-Wert extrahiert?

Gruß
Blueberry63



Titel: Antw:Hilfe bei Perlcode: on-for-timer implementieren
Beitrag von: justme1968 am 22 April 2014, 14:13:34
der fs20 dummy ist genau nicht geeignet weil bei fs20 der eigentliche timer zum abschalten im physikalischen aktor steckt.

eventuell geht es wenn du noch follow-on-for-timer setzt. das ist sowieso in fast allen fällen sinnvoll.

schau dir mal readingsProxy an. das ist eine art dummy der in-for-timer über die setExtentions unterstützt.

ansonsten frag mal norbert ob er nicht die setExtentions direkt im firmata modul unterstützen will.

gruss
  andre

Titel: Antw:Hilfe bei Perlcode: on-for-timer implementieren
Beitrag von: blueberry63 am 22 April 2014, 17:01:18
@Andre,

readingsProxy kannte ich noch nicht, ist aber genau das, was ich hier brauche. Da ich aber trotzdem noch ein "vergewaltigtes" FRM_SERV Modul ('tschuldigung an Wzut) triggern muß, komme ich um die o.g. Lösung nicht rum.

Gruß
Blueberry63
Titel: Antw:Hilfe bei Perlcode: on-for-timer implementieren
Beitrag von: justme1968 am 22 April 2014, 17:05:55
du kannst auch dazu readingsProxy verwenden.

du muss nur ein on und ein off commando für den readinsProxy implementieren in dem das FRM MODUL passend aufgerufen wird. das on-for-timer bekommst du umsonst dazu.

gruss
  andre
Titel: Antw:Hilfe bei Perlcode: on-for-timer implementieren
Beitrag von: blueberry63 am 22 April 2014, 17:38:19
@Andre
das habe ich leider nicht richtig kapiert. Könntest Du mir auf die Sprünge helfen?

Meine Konfig, um die Steckdosen AN und AUS zu schalten:
Zitat
define ARD433 FRM 3030 global
define STECKD_BAUHS FRM_SERVO 7
attr STECKD_BAUHS IODev ARD433

### STECKD Werkraum
define STECKD_WERKR FS20 55b2 00
attr STECKD_WERKR dummy 1
define n_steckd_werkrON notify STECKD_WERKR:on { fhem("set STECKD_BAUHS angle 3874") }
define n_steckd_werkrOFF notify STECKD_WERKR:off { fhem("set STECKD_BAUHS angle 3873") }

Wie würde dafür eine readingsProxy Definition aussehen? Welches Device nehme ich als Basis?

Gruß
Blueberry63
Titel: Antw:Hilfe bei Perlcode: on-for-timer implementieren
Beitrag von: justme1968 am 22 April 2014, 18:00:04
etwa so:define STECKD_WERKR readingsProxy STECKD_BAUHS  state
attr STECKD_WERKR setList on off
attr STECKD_WERKR setFn {($CMD eq "on")?"angle 3873":"angle 3874"}
attr STECKD_WERKR valueFn {($VALUE == 3873)?"on":"off"}


gruss
  andre
Titel: Antw:Hilfe bei Perlcode: on-for-timer implementieren
Beitrag von: blueberry63 am 22 April 2014, 19:32:37
@Andre

das ist ja genial. On-for-timer funktioniert auch automatisch.
  :)
Danke für den tollen Tip.

Hast Du eine Ahnung, warum die Werte für "State"  und "Reading" im Webinterface nicht aktualisiert werden? Im DBLog ist alles i.O.?!

Gruß
Blueberry

Titel: Antw:Hilfe bei Perlcode: on-for-timer implementieren
Beitrag von: justme1968 am 22 April 2014, 19:37:25
was genau hast du in state und STATE stehen?

eventuell passt die valueFn noch nicht genau. ich weiss nicht was dein FRM_SERVO in state stehen hat bzw. wo dort der aktuelle stand abzulesen ist.

gruss
  andre
Titel: Antw:Hilfe bei Perlcode: on-for-timer implementieren
Beitrag von: blueberry63 am 22 April 2014, 19:41:57
Hallo Andre,

ich habe mich doch etwas zu früh gefreut: da über das FRM-Device STECKD_BAUHS alle Steckdosen angesteuert werden, aber mit unterschiedlichen Werten für "Angel", enthält "Value" dieses Gerätes immer unterschiedliche Werte (jeweils für ON/OFF). Dadurch kann ich leider keine Regel für das Attribut "setFn" finden.

Trotzdem: nochmal vielen Dank für den Tip mit "readingProxy".

Gruß
Blueberry
Titel: Antw:Hilfe bei Perlcode: on-for-timer implementieren
Beitrag von: justme1968 am 22 April 2014, 19:49:21
das ist kein problem.

du kannst in der setFn noch einreadingsSingleUpdate($defs{$name}, "state", $CMD, 1);einbauen und valueFn auf{undef}setzen.

dann wird state für das proxy device direkt aus dem set kommando gesetzt und valueFn macht gar nichts mehr.

gruss
  andre

ps: ich bin mir gerade nicht sicher ob $state geht oder ob du "STECKD_WERKR" hart eintragen musst.
Titel: Antw:Hilfe bei Perlcode: on-for-timer implementieren
Beitrag von: blueberry63 am 22 April 2014, 20:09:00
readingsSingleUpdate($defs{$name}, "state" $CMD, 1);:

sorry, ich stehe auf dem Schlauch. Sollte das SO funktionieren:


define STECKD_TEST readingsProxy STECKD_BAUHS  state
attr STECKD_TEST setFn {($CMD eq "on")?"angle 3874":"angle 3873"; readingsSingleUpdate($defs{$name}, "state" $CMD, 1);}
attr STECKD_TEST setList on off
attr STECKD_TEST valueFn {undef}


Gruß
Blueberyy63
Titel: Antw:Hilfe bei Perlcode: on-for-timer implementieren
Beitrag von: justme1968 am 22 April 2014, 20:11:46
fast :). das readingSingleUpdate muss an den anfang der setFn vor das if. dann sollte es passen.

wie gesagt ich weiß gerade nicht ob $name geht oder du den namen des proxy device jeweils direkt hin schreiben musst.
Titel: Antw:Hilfe bei Perlcode: on-for-timer implementieren
Beitrag von: blueberry63 am 22 April 2014, 20:42:47
also noch ein Versuch  ;)

Wenn ich es so definiere:

define STECKD_TEST readingsProxy STECKD_BAUHS  state
attr STECKD_TEST setFn {readingsSingleUpdate($defs{STECK_BAUHS}, "state" $CMD, 1); ($CMD eq "on")?"angle 3874":"angle 3873";}
attr STECKD_TEST setList on off
attr STECKD_TEST valueFn {undef}


bekomme ich beim Neustart von FHEM folgende Fehlermeldung:

Zitat
Error messages while initializing FHEM:
configfile: Unknown command ($CMD, try help.
Unknown command }, try help.

Was mache ich jetzt falsch?
Titel: Antw:Hilfe bei Perlcode: on-for-timer implementieren
Beitrag von: justme1968 am 22 April 2014, 20:45:59
es fehlt ein komma.

attr STECKD_TEST setFn {readingsSingleUpdate($defs{STECK_BAUHS}, "state", $CMD, 1); ($CMD eq "on")?"angle 3874":"angle 3873";}

mein fehler. war auch im original falsch. sorry.

gruss
  andre
Titel: Antw:Hilfe bei Perlcode: on-for-timer implementieren
Beitrag von: blueberry63 am 22 April 2014, 21:03:30
 >:(

ich habe die Zeile über cut&paste übernommen, aber es kommt dieselbe Fehlermeldung
Titel: Antw:Hilfe bei Perlcode: on-for-timer implementieren
Beitrag von: betateilchen am 22 April 2014, 21:11:21
@Andre: schalte bitte Deine Autokorrektur aus, Deine Texte sind haarsträubend....
Titel: Antw:Hilfe bei Perlcode: on-for-timer implementieren
Beitrag von: justme1968 am 22 April 2014, 21:14:34
@blueberry63: je nach dem wo du die zeile eingibst musst du die ; verdoppeln. das einfachste ist es im web frontend in der detail ansicht einzugeben. dann kannst du es 1:1 übernehmen.

@betateilchen: arg. du hast recht. das habe ich so definitiv nicht geschrieben...
Titel: Antw:Hilfe bei Perlcode: on-for-timer implementieren
Beitrag von: blueberry63 am 22 April 2014, 21:36:39
nach der Eingabe im Webfrontend funktioniert es jetzt wieder, allerdings wird "state" nicht aktualisiert
Titel: Antw:Hilfe bei Perlcode: on-for-timer implementieren
Beitrag von: justme1968 am 22 April 2014, 21:39:24
ich sollte ins bett gehen...

du musst den namen des proxy device verwenden. in diesem willst du doch den state setzen:attr STECKD_TEST setFn {readingsSingleUpdate($defs{STECKD_TEST}, "state", $CMD, 1); ($CMD eq "on")?"angle 3874":"angle 3873";}

aber versuch es auf jeden fall noch mal mit $name. das macht es einfacher wenn du mehr als ein proxy device hast.

gruss
  andre
Titel: Antw:Hilfe bei Perlcode: on-for-timer implementieren
Beitrag von: blueberry63 am 22 April 2014, 22:03:18
jetzt wird auch "state" aktualisiert. Super!

Wenn mir jetzt noch jemand einen Tip geben könnte, warum die "Glühbirne" im Webfrontend den Status nicht anzeigt, dann wäre die Lösung perfekt.

Für heute aber: Gute Nacht

Gruß
Blueberry63
Titel: Antw:Hilfe bei Perlcode: on-for-timer implementieren
Beitrag von: justme1968 am 23 April 2014, 11:31:54
setz mal mit devStateIcon explizit ein icon. geht es dann?

was steht in STATE?

gruss
  andre
Titel: Antw:Hilfe bei Perlcode: on-for-timer implementieren
Beitrag von: blueberry63 am 23 April 2014, 11:35:54
@Andre

devstaticon habe ich schon ausprobiert und dabei festgestellt, dass ea auch ohne dieses Attribut geht, allerdings wird der Status im Webinterface erst nach Minuten(!) aktualisiert. STATE geht aber sofort auf "ON/OFF"

Gruß
Blueberry63
Titel: Antw:Hilfe bei Perlcode: on-for-timer implementieren
Beitrag von: justme1968 am 23 April 2014, 11:36:48
das sollte nicht so sein. ich schau mal woran das liegt.

gruss
  andre
Titel: Antw:Hilfe bei Perlcode: on-for-timer implementieren
Beitrag von: justme1968 am 23 April 2014, 11:54:42
ich kann zwar nur mit dummys testen aber bei mir funktioniert der update sofort.

zumindest wenn ich nicht im raum unsorted bin.

bitte steck das STECKD_TEST device mal alleine in einen eigenen raum und schau ob es dann geht.

wenn nicht: schau mal in der javascript konsole ob du etwas sehen kannst. welchen browser verwendest du? kannst du es mal mit einem anderen browser probieren?

gruss
  andre
Titel: Antw:Hilfe bei Perlcode: on-for-timer implementieren
Beitrag von: blueberry63 am 23 April 2014, 12:02:07
DAS war es:
zumindest wenn ich nicht im raum unsorted bin

In einem anderen Raum funktioniert der Update sofort.

Danke für Deine Geduld.

Gruß
Blueberry63
Titel: Antw:Hilfe bei Perlcode: on-for-timer implementieren
Beitrag von: justme1968 am 23 April 2014, 12:32:56
ich hab den eigentlichen fehler inzwischen auch gefunden der verhindert das es im raum Unsorted geht.

es hängt mit einem älteren problem bezüglich umlauten im raum namen zusammen und einem nicht ganz vollständigen fix dafür: http://forum.fhem.de/index.php/topic,20130.msg161725.html#msg161725 (http://forum.fhem.de/index.php/topic,20130.msg161725.html#msg161725).

demnächst sollte es also auch im raum Unsorted wieder gehen.

gruss
  andre