setreading setzt Reading nicht

Begonnen von Loki, 21 Februar 2018, 21:05:51

Vorheriges Thema - Nächstes Thema

Loki

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.

Phill

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()},
Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html

crusader


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

Loki

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...




Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Loki

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.)

Otto123

Meine Anmerkung war auf Deinen letzten Satz
Jetzt muss ich nur noch herausfinden, warum das DOIF nie in cmd_1 geht...
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz