Hauptmenü

Problem mit at Befehl

Begonnen von tyrolean, 11 Mai 2016, 21:44:29

Vorheriges Thema - Nächstes Thema

tyrolean

Hallo,
ich bin noch relativ neu in der "FHEM Welt"
Aktuell versuche ich mich gerade daran meine Fußbodenheizung über eine PWM zu regeln. Das Ganze soll über den PID20 und einigen AT Kommandos bestehen. Nun scheitere ich aber an einer wohl "einfachen" Aufgabe:

Ich möchte gerne einen AT Befehl zum Ausschalten meines Stellgliedes aktivieren, allerdings steht mir der Ausschaltzeitpunkt nur in Sekunden und nicht im Format hh:mm:ss zur Verfügung (sprich es können auch z.Bsp. 1200 Sekunden sein)
Wie bringe ich das ganze in einen AT Befehl, leider bin ich im Forum bisher nicht fündig geworden...

Gruß und Dank aus Tirol

pinkfloyd66

Hi ich habe das gefunden


    # Realtive Beispiele:
    define a5 at +00:00:10 set lamp on                  # Einschalten in 10 Sekunden
   

# Absolute Beispiele:
    define a1 at 17:00:00 set lamp on                            # fhem Befehl
   
    define a4 at *17:00:00 set lamp on                           # Jeden Tag


Falls noch Fragen da sind dann frage ich bin noch bis 22:00 online

tyrolean

Erstens Danke für die schnell Antwort, mein Problem ist leider etwa komplexer.

Genauer Gesagt möchte ich alle 20 Minuten ein Stellglied einschalten und je nach actuation Wert des PID20 Reglers (mit pidActorLimitUpper = 1190 entspricht 20min-10sec) wieder ausschalten.

Dabei ergeben sich folgende 2 Probleme für mich:
1. Wie bekomme ich den Wert actuation des PID20 Reglers in meinen AT Befehl (irgendwie habe ich mit readingsval Probleme)
2. Wie rechne ich den Sekundenwert in ein gültiges Zeitformat um (hh:mm:ss)

Als Basis dient folgender Befehl:

define at_tt3on at +*00:20:00 set TT3Stellglied on ;; define at_tt3off at +00:00:(ReadingsVal("TT3PID","actuation",1))  set TT3Stellglied off

...aber so einfach funktioniert das Ganze leider nicht  ;)

dev0

Zitat von: tyrolean am 11 Mai 2016, 22:06:05
1. Wie bekomme ich den Wert actuation des PID20 Reglers in meinen AT Befehl (irgendwie habe ich mit readingsval Probleme)
ReadingsVal war schon richtig, aber Perl Befehle müssen in {} eingefasst werden, nicht in ().

Zitat von: tyrolean am 11 Mai 2016, 22:06:05
2. Wie rechne ich den Sekundenwert in ein gültiges Zeitformat um (hh:mm:ss)
Die Suchmaschine Deiner Wahl findet z.B. http://www.perlmonks.org/?node_id=30392
Da laut command reference der Perlzeitausdruck keine Leerzeichen oder Tabs enthalten darf, kannst Du die Funktion entweder in 99_myUtils auslagern oder einen Einzeiler ohne Leerzeichen benutzen.

Der Einzeiler würde dann so aussehen:

define at_tt3on at +*00:20:00 set TT3Stellglied on;; define at_tt3off at +{join":",map{sprintf"%02d",$_}(gmtime(ReadingsVal("TT3PID","actuation",1)))[2,1,0]} set TT3Stellglied off


Mit ausgelagerter Funktion und mMn besser lesbaren Code so:

define at_tt3on at +*00:20:00 set TT3Stellglied on;; define at_tt3off at +{secs2ts(ReadingsVal("TT3PID","actuation",1))} set TT3Stellglied off

99_myUtils:

sub secs2ts($)
{
  use integer;
  my $sec = shift;

  return "00:00:0$sec" if $sec < 10;
  return "00:00:$sec" if $sec < 60;

  my $min = $sec / 60, $sec %= 60;
  $sec = "0$sec" if $sec < 10;
  return "00:0$min:$sec" if $min < 10;
  return "00:$min:$sec" if $min < 60;

  my $hr = $min / 60, $min %= 60;
  $min = "0$min" if $min < 10;
  return "0$hr:$min:$sec" if $hr < 10;
  return "$hr:$min:$sec" if $hr < 24;

  return "23:59:39" if $hr >= 24;
}


Der Einzeiler ist getestet, die 2. Variante nicht, sollte aber auch funktionieren, wenn ich kein Typo eingebaut habe.

Damian

Zitat von: tyrolean am 11 Mai 2016, 22:06:05
Erstens Danke für die schnell Antwort, mein Problem ist leider etwa komplexer.

Genauer Gesagt möchte ich alle 20 Minuten ein Stellglied einschalten und je nach actuation Wert des PID20 Reglers (mit pidActorLimitUpper = 1190 entspricht 20min-10sec) wieder ausschalten.

Dabei ergeben sich folgende 2 Probleme für mich:
1. Wie bekomme ich den Wert actuation des PID20 Reglers in meinen AT Befehl (irgendwie habe ich mit readingsval Probleme)
2. Wie rechne ich den Sekundenwert in ein gültiges Zeitformat um (hh:mm:ss)

Als Basis dient folgender Befehl:

define at_tt3on at +*00:20:00 set TT3Stellglied on ;; define at_tt3off at +00:00:(ReadingsVal("TT3PID","actuation",1))  set TT3Stellglied off

...aber so einfach funktioniert das Ganze leider nicht  ;)

hier das Ganze ohne Perl:

define di_tt3on DOIF ([+00:20])(set TT3Stellglied on)(set TT3Stellglied off)

attr di_tt3on do always
attr di_tt3on wait 0,[TT3PID:actuation]


alles Weitere kann man hier nachlesen:

http://fhem.de/commandref_DE.html#DOIF

Gruß

Damian


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

tyrolean

#5
Vielen Dank für die Antworten, werde es gleich mal umsetzen und testen.
Habe mich gerade in das DoIf Command ein wenig eingelesen, scheint ja ein mächtiges und elegantes Tool zu sein...

Allerdings bekomme ich beim Testen folgende Fehlermeldung:

2016.05.13 07:11:16 2: di_tt3on: error in wait: no right bracket

Meine cfg schaut wie folgt aus:

define di_tt3on DOIF ([+00:20])(set TT3Stellglied on)(set TT3Stellglied off)
attr di_tt3on do always
attr di_tt3on room Schulungsraum
attr di_tt3on wait 0,[TT3PID:actuation]

Sieht jemand was ich da falsch gemacht habe?

Damian

Zitat von: tyrolean am 13 Mai 2016, 07:10:03
Vielen Dank für die Antworten, werde es gleich mal umsetzen und testen.
Habe mich gerade in das DoIf Command ein wenig eingelesen, scheint ja ein mächtiges und elegantes Tool zu sein...

Allerdings bekomme ich beim Testen folgende Fehlermeldung:

2016.05.13 07:11:16 2: di_tt3on: error in wait: no right bracket

Meine cfg schaut wie folgt aus:

define di_tt3on DOIF ([+00:20])(set TT3Stellglied on)(set TT3Stellglied off)
attr di_tt3on do always
attr di_tt3on room Schulungsraum
attr di_tt3on wait 0,[TT3PID:actuation]

Sieht jemand was ich da falsch gemacht habe?

Du benutzt nicht die aktuelle Version des Moduls vom 26.04.16
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

tyrolean

Zitat von: Damian am 13 Mai 2016, 07:46:02
Du benutzt nicht die aktuelle Version des Moduls vom 26.04.16

Nun muß ich leider wirklich blöd fragen wie ich zum aktuellen Modul komme (auf einem raspberry pi), da nach sudo apt-get update und sudo  apt-get upgrade bekomme ich immer noch denselben Fehler...

Damian

Zitat von: tyrolean am 13 Mai 2016, 19:16:44
Nun muß ich leider wirklich blöd fragen wie ich zum aktuellen Modul komme (auf einem raspberry pi), da nach sudo apt-get update und sudo  apt-get upgrade bekomme ich immer noch denselben Fehler...

Was liefert Version DOIF in der Commandozeile?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

tyrolean

Zitat von: Damian am 13 Mai 2016, 19:18:18
Was liefert Version DOIF in der Commandozeile?

98_DOIF.pm  9766 2015-11-03 19:43:23Z damian-s

tyrolean

... mit einem simplen Befehl "update" im Webgui hat das Update funktioniert, jetzt scheint auch der Rest zu funktionieren.
erstmal Danke dafür

Allerdings hätte ich zu dem Thema noch eine kurze Frage:
Die Befehle werden zwar im 20 Minuten Takt wiederholt, jedoch ist die "Erstausführung" sozusagen undefiniert. Ich habe gesehen dass ich mit DOELSEIF ([:20])(...)DOELSEIF ([:40])(...) einen definierten zustand erreichen kann. Gibt es hierfür eine "elegantere" Möglichkeit z.Bsp. dass erste CMD um XX:05 zu starten und danach einfach alle 20 Minuten zu wiederholen.
Bzw. habe ich nicht ganz verstanden wie ich das Wait Attr. ändern müsste wenn mehrere DOELSEIF folgen...

Damian

Zitat von: tyrolean am 13 Mai 2016, 21:26:44
... mit einem simplen Befehl "update" im Webgui hat das Update funktioniert, jetzt scheint auch der Rest zu funktionieren.
erstmal Danke dafür

Allerdings hätte ich zu dem Thema noch eine kurze Frage:
Die Befehle werden zwar im 20 Minuten Takt wiederholt, jedoch ist die "Erstausführung" sozusagen undefiniert. Ich habe gesehen dass ich mit DOELSEIF ([:20])(...)DOELSEIF ([:40])(...) einen definierten zustand erreichen kann. Gibt es hierfür eine "elegantere" Möglichkeit z.Bsp. dass erste CMD um XX:05 zu starten und danach einfach alle 20 Minuten zu wiederholen.
Bzw. habe ich nicht ganz verstanden wie ich das Wait Attr. ändern müsste wenn mehrere DOELSEIF folgen...

http://fhem.de/commandref_DE.html#DOIF_repeatcmd
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF