FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Loki am 21 Februar 2018, 21:05:51

Titel: setreading setzt Reading nicht
Beitrag von: Loki am 21 Februar 2018, 21:05:51
ich habe folgendes DoIf:
([Trockner.Status:power] < 2 and [Trockner.Status:state] ne 'running') (
  set Trockner.Status off,
  {Log 3, "Trockner: Aus - [Trockner.Status:power] W"}
) DOELSEIF ([Trockner.Status:power] > 2 and [Trockner.Status:state] eq 'off') (
  set Trockner.Status on,
  setreading Trockner.Status TimeStart {(time_str2num(ReadingsTimestamp("Trockner.Status","power","0")))},
  setreading Trockner.Status preEnergy [Trockner.Status:energy],
  {Log 3, "Trockner: Ein - [Trockner.Status:power] W"}
) DOELSEIF ([Trockner.Status:power] > 2) (
  set Trockner.Status running,
  {Log 3, "Trockner: Läuft - [Trockner.Status:power] W"}
) DOELSEIF ([Trockner.Status:power] < 2 and [Trockner.Status:state] eq 'running') (
  set Trockner.Status done,
  setreading Trockner.Status TimeEnd {(time_str2num(ReadingsTimestamp("Trockner.Status","power","0")))},
  setreading Trockner.Status TimeRunning {([Trockner.Status:TimeEnd]-[Trockner.Status:TimeStart])},
 
  setreading Trockner.Status TimeRunningHours {(int([Trockner.Status:TimeRunning]/3600))},
 
  setreading Trockner.Status TimeRunningMinutes {(sprintf("%02d", int(([Trockner.Status:TimeRunning]-([Trockner.Status:TimeRunningHours]*3600))/60)))},
 
  setreading Trockner.Status lastEnergy {([Trockner.Status:energy]-[Trockner.Status:preEnergy])},
  setreading Trockner.Status preEnergy [Trockner.Status:energy],
  setreading Trockner.Status lastCost {(sprintf("%.2f",([Trockner.Status:lastEnergy])/1000*0.25))}, 
  set Speaker playTone 5 1 7,
  set Trockner off,
  {Log 3, "Trockner: Fertig - [Trockner.Status:lastCost]€"}
)


Alles funktioniert, bis auf den Abschnitt:
setreading Trockner.Status TimeEnd {(time_str2num(ReadingsTimestamp("Trockner.Status","power","0")))},

der fast gleiche Abschnitt funktioniert wieder
setreading Trockner.Status TimeStart {(time_str2num(ReadingsTimestamp("Trockner.Status","power","0")))},

ich sehe einfach den Fehler nicht.
Vorher hatte ich die Abfrage nach dem Timestamp auf "status" statt auf "power", aber der Wechsel hat nichts gebracht.
Titel: Antw:setreading setzt Reading nicht
Beitrag von: Phill am 22 Februar 2018, 12:57:26
Ich sehe auch keinen Fehler. Frage wäre halt welche Funktion der Zeile nicht funktioniert.
Wird TimeEnd gar nicht gesetzt oder wird ein leerer Wert eingefügt.


Ansonsten kannst du es doch auch so schreiben, wäre doch genau daselbe, oder?
setreading Trockner.Status TimeEnd {time()},
Titel: Antw:setreading setzt Reading nicht
Beitrag von: crusader am 22 Februar 2018, 22:13:25

Alles funktioniert, bis auf den Abschnitt:
setreading Trockner.Status TimeEnd {(time_str2num(ReadingsTimestamp("Trockner.Status","power","0")))},

Sieht so aus, als ob das vorhergehende Kommando die erste DOIF-Bedingung triggert, so dass der Rest des Ausführungsteils nicht mehr zum Zuge kommt.
Das sollte sich mit dem Attribut 'selftrigger' verhindern lassen.

Gruß
crusader
Titel: Antw:setreading setzt Reading nicht
Beitrag von: Loki am 26 Februar 2018, 09:15:00
Danke für Eure Hinweise.

Das setreading mit der Zeit habe ich umgestellt. So ist es natürlich kürzer und führt zum gleichen Ergebnis.

Das eigentlich Problem konnte ich inzwischen auch identifizieren!

Es lagt nicht am selftrigger, das steht ja per default auf "off".

Aber auf jeden Fall ist er nie ins cmd_2 gekommen!

cmd_1 wird bei mir nie getriggert und somit steht der Device-Status auch nie auf "off", was aber Bedingung für cmd_2 ist.
Nachdem ich noch die Bedingung auf Device-Status "off" oder "done" erweitert habe, klappt es auch mit cmd_2 und die readings werden gesetzt! Yeah!

Jetzt muss ich nur noch herausfinden, warum das DOIF nie in cmd_1 geht...



Titel: Antw:setreading setzt Reading nicht
Beitrag von: Otto123 am 26 Februar 2018, 09:32:09
Moin,

da einige Leute Probleme mit dem Verständnis and und or haben. Deine Bedingung bedeutet im Klartext
([Trockner.Status:power] < 2 and [Trockner.Status:state] ne 'running')
wahr                                           wahr                                              -> wahr

In allen anderen Fällen ist die gesamte Bedingung nicht wahr. Der Trockner muss also etwas anderes machen als running und die Leistung muss unter 2 Watt sein.

Also Du testest ob er aus ist  um ihn dann aus zu schalten?  ;)

Gruß Otto
Titel: Antw:setreading setzt Reading nicht
Beitrag von: Loki am 26 Februar 2018, 15:59:43
Hallo Otto,

das AND ist schon gewollt an der Stelle.    ;)

In der Regel ist das Gerät vor Benutzung komplett stromlos und nach dem Einschalten der Steckdose zieht es schon um die 1Watt.
Da es aber auch wärend des Programms öfter mal Pausen einlegt und unter 2 Watt sinkt, musste noch eine zweite Bedingung her " ne 'running' ".

Meine Erwartung ist nun, dass nach dem Einschalten des Steckers das Gerät unter 2 Watt bleibt und der Status auf irgendwas ausser "running" steht (sollte vom cmd_4 auf "done" sein).
Dann sollte der Anfangs-Status auf "off" gesetzt werden.  (ACHTUNG -> es geht hier um den Status Dummy-Devices "trockner.status", nicht um den Trockner selbst, der im cmd mit "set Trockner off" abgeschaltet wird.)
Titel: Antw:setreading setzt Reading nicht
Beitrag von: Otto123 am 26 Februar 2018, 21:14:25
Meine Anmerkung war auf Deinen letzten Satz
Jetzt muss ich nur noch herausfinden, warum das DOIF nie in cmd_1 geht...