Anpassung Waschmaschie fertig auf Revolt

Begonnen von masterpete23, 01 Dezember 2015, 14:49:57

Vorheriges Thema - Nächstes Thema

masterpete23

Hi,

Ich wollte ein vorhandenes Skript auf meine Revolt anpassen.

http://forum.fhem.de/index.php?topic=26339.0
http://www.meintechblog.de/2014/01/homematic-funk-steckdose-mit-leistungsmessung-deine-waschmaschine-ist-fertig/

############################################################################
# Leistungsüberwachung Waschmaschine
# und Fertig-Pushmeldung START
#
# Dummy Revolt_Trockner.Watt für die Anzeige des aktuellen Watt-Verbrauchs definieren
define Revolt_Trockner.Watt dummy
attr Revolt_Trockner.Watt icon scene_washing_machine
attr Revolt_Trockner.Watt room Keller
define Revolt_Trockner.Watt.Set.notify notify Revolt_Trockner {\
my $power_w=ReadingsVal("Revolt_Trockner","power","");;\
my $power=substr($power_w, 0,length($power_w)-2);;\
fhem ("set Revolt_Trockner.Watt $power");;\
}
attr Revolt_Trockner.Watt.Set.notify icon scene_washing_machine
# Dummy Revolt_Trockner.Betrieb definieren
define Revolt_Trockner.Betrieb dummy
attr Revolt_Trockner.Betrieb event-on-change-reading state
attr Revolt_Trockner.Betrieb icon scene_washing_machine
attr Revolt_Trockner.Betrieb room Keller
# Dummy Revolt_Trockner.Betrieb einschalten bei Verbrauch größer 30 Watt
define Revolt_Trockner.Betrieb.An.notify notify Revolt_Trockner:power.* {\
if (substr(ReadingsVal("Revolt_Trockner","power",""), 0,length(ReadingsVal("Revolt_Trockner","power",""))-3) >= 30 && Value("Revolt_Trockner.Betrieb") ne "on") {\
fhem ("set Revolt_Trockner.Betrieb on");;\
fhem ("setstate Revolt_Trockner.AutoOff defined");;\
}\
}
attr Revolt_Trockner.Betrieb.An.notify icon scene_washing_machine
# Dummy Revolt_Trockner.HoherVerbrauch definieren
define Revolt_Trockner.HoherVerbrauch dummy
attr Revolt_Trockner.HoherVerbrauch event-on-change-reading state
attr Revolt_Trockner.HoherVerbrauch icon scene_washing_machine
attr Revolt_Trockner.HoherVerbrauch room Keller
# Dummy Revolt_Trockner.HoherVerbrauch einschalten bei Verbrauch größer 3 Watt bei laufendem Betrieb
define Revolt_Trockner.HoherVerbrauch.An.notify notify Revolt_Trockner:power.* {\
if (substr(ReadingsVal("Revolt_Trockner","power",""), 0,length(ReadingsVal("Revolt_Trockner","power",""))-3) > 3 && Value("Revolt_Trockner.Betrieb") eq "on") {\
fhem ("set Revolt_Trockner.HoherVerbrauch on");;\
fhem ("setstate Revolt_Trockner.AutoStandby defined");;\
}\
}
attr Revolt_Trockner.HoherVerbrauch.An.notify icon scene_washing_machine
# Dummy Revolt_Trockner.HoherVerbrauch ausschalten bei Verbrauch kleiner gleich 3 Watt bei laufendem Betrieb
define Revolt_Trockner.HoherVerbrauch.Aus.notify notify Revolt_Trockner:power.* {\
if (substr(ReadingsVal("Revolt_Trockner","power",""), 0,length(ReadingsVal("Revolt_Trockner","power",""))-3) <= 3 && Value("Revolt_Trockner.Betrieb") eq "on") {\
fhem ("set Revolt_Trockner.HoherVerbrauch off");;\
}\
}
attr Revolt_Trockner.HoherVerbrauch.Aus.notify icon scene_washing_machine
# Wenn der Verbrauchswert für mindestens 5 Minuten bei laufendem Betrieb unter
# obigem Schwellwert (3 Watt) verbleibt, wird angenommen, dass der Waschvorgang
# tatsächlich abgeschlossen ist
define Revolt_Trockner.AutoStandby watchdog Revolt_Trockner.HoherVerbrauch:off 00:02:00 Revolt_Trockner.HoherVerbrauch:on set Revolt_Trockner.Betrieb standby
attr Revolt_Trockner.AutoStandby icon scene_washing_machine
# Push-Notification bei abgeschlossenem Waschvorgang "Waschmaschine ist fertig"
#define Waschmaschine.WaschvorgangAbgeschlossen.Pushalot.notify notify Revolt_Trockner.Betrieb:standby { system "curl -F \"AuthorizationToken=********************************\" -F \"Body=Waschmaschine ist fertig\" https://pushalot.com/api/sendmessage"}
#attr Waschmaschine.WaschvorgangAbgeschlossen.Pushalot.notify icon scene_washing_machine
#
# Leistungsüberwachung Waschmaschine
# und Fertig-Pushmeldung ENDE
############################################################################


Hier bin ich wirklich blutiger Anfänger. Ein einfaches Copy and paste und Änderung von 2 auf 3 Watt brachte mir ein sekündlich voll gespammtes Log.

2015.12.01 14:22:54 1: PERL WARNING: Argument "" isn't numeric in numeric ge (>=) at (eval 161447) line 2.
2015.12.01 14:22:54 3: eval: {
if (substr(ReadingsVal("Revolt_Trockner","power",""), 0,length(ReadingsVal("Revolt_Trockner","power",""))-3) >= 30 && Value("Revolt_Trockner.Betrieb") ne "on") {
fhem ("set Revolt_Trockner.Betrieb on");
fhem ("setstate Revolt_Trockner.AutoOff defined");
}
}
2015.12.01 14:22:54 1: PERL WARNING: Argument "" isn't numeric in numeric gt (>) at (eval 161448) line 2.
2015.12.01 14:22:54 3: eval: {
if (substr(ReadingsVal("Revolt_Trockner","power",""), 0,length(ReadingsVal("Revolt_Trockner","power",""))-3) > 3 && Value("Revolt_Trockner.Betrieb") eq "on") {
fhem ("set Revolt_Trockner.HoherVerbrauch on");
fhem ("setstate Revolt_Trockner.AutoStandby defined");
}
}
2015.12.01 14:22:54 1: PERL WARNING: Argument "" isn't numeric in numeric le (<=) at (eval 161449) line 2.
2015.12.01 14:22:54 3: eval: {
if (substr(ReadingsVal("Revolt_Trockner","power",""), 0,length(ReadingsVal("Revolt_Trockner","power",""))-3) <= 3 && Value("Revolt_Trockner.Betrieb") eq "on") {
fhem ("set Revolt_Trockner.HoherVerbrauch off");
}
}
2015.12.01 14:22:54 3: set Revolt_Trockner.Watt  : no set value specified
2015.12.01 14:22:54 3: Revolt_Trockner.Watt.Set.notify return value: no set value specified
2015.12.01 14:22:54 3: set Revolt_Trockner.Watt  : no set value specified
2015.12.01 14:22:54 3: Revolt_Trockner.Watt.Set.notify return value: no set value specified
2015.12.01 14:22:54 3: set Revolt_Trockner.Watt  : no set value specified
2015.12.01 14:22:54 3: Revolt_Trockner.Watt.Set.notify return value: no set value specified
2015.12.01 14:22:54 3: set Revolt_Trockner.Watt  : no set value specified
2015.12.01 14:22:54 3: Revolt_Trockner.Watt.Set.notify return value: no set value specified
2015.12.01 14:22:54 3: set Revolt_Trockner.Watt  : no set value specified
2015.12.01 14:22:54 3: Revolt_Trockner.Watt.Set.notify return value: no set value specified
2015.12.01 14:22:54 3: set Revolt_Trockner.Watt  : no set value specified
2015.12.01 14:22:54 3: Revolt_Trockner.Watt.Set.notify return value: no set value specified
2015.12.01 14:22:54 3: set Revolt_Trockner.Watt  : no set value specified
2015.12.01 14:22:54 3: Revolt_Trockner.Watt.Set.notify return value: no set value specified


Was kann ich tun - wo muss ich nacharbeiten?
Wo sollte ich mich einlesen.

Device leider als Screenshot da keine Befehle remote bei mir gehen.


masterpete23


Tedious

Naja, fahr doch erst mal eine Kurve und schau Dir die Werte an. Was zieht sie im Standby, was im Lauf, was wenn sie fertig ist - und nimm die Werte zur Anpassung...

Zitat2015.12.01 14:22:54 3: set Revolt_Trockner.Watt  : no set value specified
2015.12.01 14:22:54 3: Revolt_Trockner.Watt.Set.notify return value: no set value specified

Passen denn die Readings bei Dir? Heißt das Reading denn "Watt" und der Stecker Revolt_Trockner? Standardmäßig ist das eher sowas hier: Revolt_55f1:P. Was sagt denn ein list revolt (revolt durch das device ersetzen)...
FHEM auf Proxmox-VM (Intel NUC) mit 4xMapleCUN (433,3x868) und Jeelink, HUE, MiLight, Max!, SonOff, Zigbee, Alexa, uvm...

drhirn

Schau dir das mal an
(substr(ReadingsVal("Revolt_Trockner","power",""), 0,length(ReadingsVal("Revolt_Trockner","power",""))-3)

Die Fehlermeldung besagt, da kommt keine Zahl raus. Und das glaub ich ihr auf's Wort ;)

masterpete23

Ok,
das sagt die FM - das dachte ich auch schon.
wie kann ich das auflösen.
Ich kenne mich da noch nicht so aus bei readingsval und substr
Könntet ihr mir auf die Sprünge helfen

drhirn

http://perldoc.perl.org/functions/substr.html

Laut Screenshot ist power ja eh nur eine Zahl, oder? Dann kannst du das substr einfach weg lassen.

drhirn

Übrigens, weil ich endlich eine Erklärung zu ReadingsVal gefunden habe:
Die Werte bei ReadingsVal sind <devicename>,<reading> und <defaultvalue>
Wobei defaultvalue der Wert ist, der genommen wird, falls kein Wert aus dem Reading gelesen werden kann.

Tedious

Warum nicht via Reading Current und somit über die benötigte Leistung abfackeln? Meinetwegen 3W im Standby, 200W im Betrieb, 90W beim schleuden (die von mit oben angemerkte Leistungskurve)? Wenn (um bei den fiktiven Werten zu bleiben) der Verbrauch <10W ist er im Standby, >220W am waschen, >100 und <200 am schleudern. Denn ließe sich das auch in einem Doif abfackeln ("wenn Verbrauch >10W Maschine wäscht setze Dummy-Status on. Wenn Verbrauch <10W Maschine fertig setze Dummy status off.  event-on-change-reading state vom Dummy on sende Message Waschmaschine gestartet, wenn  event-on-change-reading state vom Dummy off sende Message Waschmaschine feddisch) - vielleicht denke ich zu einfach, wäre für mich aber eine ausreichende Logik ohne viel code?!
FHEM auf Proxmox-VM (Intel NUC) mit 4xMapleCUN (433,3x868) und Jeelink, HUE, MiLight, Max!, SonOff, Zigbee, Alexa, uvm...

drhirn

Es gibt Waschmaschinen, die machen zwischendurch kleine Pausen. Somit sinkt zwar der Stromverbrauch, die Waschmaschine ist aber noch nicht fertig. Das macht's kompliziert.

Tedious

Ich weiß :) Deswegen ja auch mal mit Messung waschen, denn sieht man ja in aller Regel ob das so geht oder nicht. Will ihn ja nur zum Denken anregen, um auch zu verstehen was er da codet ;)
FHEM auf Proxmox-VM (Intel NUC) mit 4xMapleCUN (433,3x868) und Jeelink, HUE, MiLight, Max!, SonOff, Zigbee, Alexa, uvm...

drhirn

Aso! Na dann, laß dich nicht aufhalten ;).

Tedious

Nein, im Ernst - kann man doch prima nutzen um zu diskutieren - ggf den Ansatz zu modifizieren. Das Rad muss man nicht neu erfinden wenn schon jemand eine funktionierende Lösung hat :)
FHEM auf Proxmox-VM (Intel NUC) mit 4xMapleCUN (433,3x868) und Jeelink, HUE, MiLight, Max!, SonOff, Zigbee, Alexa, uvm...

drhirn

Eh. Kam vielleicht falsch rüber. Aber ich bin ganz bei dir.
Und jetzt müssen wir aufhören, dem armen masterpete23 seinen Thread zu klauen ;)

masterpete23

Danke für eure vielen gut gemeinten Tips und dafür das ihr den Thread noch nicht ganz übernommen habt :)

Meine Idee wäre jetzt aus dem alten Code:
# Dummy Revolt_Trockner.Betrieb einschalten bei Verbrauch größer 30 Watt
define Revolt_Trockner.Betrieb.An.notify notify Revolt_Trockner:power.* {\
if (substr(ReadingsVal("Revolt_Trockner","power",""), 0,length(ReadingsVal("Revolt_Trockner","power",""))-2) >= 30 && Value("Revolt_Trockner.Betrieb") ne "on") {\
fhem ("set Revolt_Trockner.Betrieb on");;\
fhem ("setstate Revolt_Trockner.AutoOff defined");;\
}\
}


Das hier zu machen - wäre das richtig?

# Dummy Revolt_Trockner.Betrieb einschalten bei Verbrauch größer 30 Watt
define Revolt_Trockner.Betrieb.An.notify notify Revolt_Trockner:power.* {\
if (ReadingsVal("Revolt_Trockner","power","") >= 30 && Value("Revolt_Trockner.Betrieb") ne "on") {\
fhem ("set Revolt_Trockner.Betrieb on");;\
fhem ("setstate Revolt_Trockner.AutoOff defined");;\
}\
}


Als weitere Info , wenn er aus ist, sind es 0Watt
Wenn er fertig ist, werden es 2,2 Watt
Im Betrieb locker die 700  Watt.
Zwischendurch ist er 2-3 Minuten bei 157 Watt ca.  und das 3-4 mal

drhirn

Sieht für mich gut aus. Mußt es einfach ausprobieren.

Und um dich jetzt ganz zu verwirren: Ich bin an der selben Problemstellung dran wie du. Nur mit Spülmaschine. Und gerade über DOIF in Kombination mit dessen Attribut wait gestolpert.

Bei den Werten deiner Waschmaschine ist's aber eigentlich überhaupt einfach. Glaub ich halt, du hast ja leider nie geschrieben, was genau du machen willst.
Aber im Prinzip mußt du nur abfragen, ob power > 2,2 ist, dann läuft die Waschmaschine. Wenn <= ist sie aus.