FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: masterpete23 am 01 Dezember 2015, 14:49:57

Titel: Anpassung Waschmaschie fertig auf Revolt
Beitrag von: masterpete23 am 01 Dezember 2015, 14:49:57
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.

Titel: Antw:Anpassung Waschmaschie fertig auf Revolt
Beitrag von: masterpete23 am 03 Dezember 2015, 08:18:27
jemand eine Idee?
Titel: Antw:Anpassung Waschmaschie fertig auf Revolt
Beitrag von: Tedious am 03 Dezember 2015, 09:09:55
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)...
Titel: Antw:Anpassung Waschmaschie fertig auf Revolt
Beitrag von: drhirn am 03 Dezember 2015, 10:38:53
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 ;)
Titel: Antw:Anpassung Waschmaschie fertig auf Revolt
Beitrag von: masterpete23 am 03 Dezember 2015, 11:08:38
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
Titel: Antw:Anpassung Waschmaschie fertig auf Revolt
Beitrag von: drhirn am 03 Dezember 2015, 11:19:34
http://perldoc.perl.org/functions/substr.html (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.
Titel: Antw:Anpassung Waschmaschie fertig auf Revolt
Beitrag von: drhirn am 03 Dezember 2015, 11:35:09
Ü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.
Titel: Antw:Anpassung Waschmaschie fertig auf Revolt
Beitrag von: Tedious am 03 Dezember 2015, 11:41:19
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?!
Titel: Antw:Anpassung Waschmaschie fertig auf Revolt
Beitrag von: drhirn am 03 Dezember 2015, 11:44:36
Es gibt Waschmaschinen, die machen zwischendurch kleine Pausen. Somit sinkt zwar der Stromverbrauch, die Waschmaschine ist aber noch nicht fertig. Das macht's kompliziert.
Titel: Antw:Anpassung Waschmaschie fertig auf Revolt
Beitrag von: Tedious am 03 Dezember 2015, 11:54:12
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 ;)
Titel: Antw:Anpassung Waschmaschie fertig auf Revolt
Beitrag von: drhirn am 03 Dezember 2015, 11:56:17
Aso! Na dann, laß dich nicht aufhalten ;).
Titel: Antw:Anpassung Waschmaschie fertig auf Revolt
Beitrag von: Tedious am 03 Dezember 2015, 12:00:49
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 :)
Titel: Antw:Anpassung Waschmaschie fertig auf Revolt
Beitrag von: drhirn am 03 Dezember 2015, 12:55:52
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 ;)
Titel: Antw:Anpassung Waschmaschie fertig auf Revolt
Beitrag von: masterpete23 am 03 Dezember 2015, 14:51:07
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
Titel: Antw:Anpassung Waschmaschie fertig auf Revolt
Beitrag von: drhirn am 03 Dezember 2015, 15:01:21
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.
Titel: Antw:Anpassung Waschmaschie fertig auf Revolt
Beitrag von: masterpete23 am 03 Dezember 2015, 15:32:04
Ja so langsam frage ich mich auch was ich brauch und du hast recht: testen und dann nochmal überlegen ob das nicht reicht wenn 5 Minuten unter 3 Watt dann fertig.
Ich berichte ...
Titel: Antw:Anpassung Waschmaschie fertig auf Revolt
Beitrag von: Brice am 03 Dezember 2015, 18:24:48
Ich habe mich mehr als 2 Jahre mit einer FS20FMS (Funk-Master-Slave) und unbefriedigenden Ergebnissen für "Waschmaschine-fertig" gequält und den "WAF" in den Keller gebracht  ;D

Zitat von: masterpete23 am 03 Dezember 2015, 15:32:04
Ja so langsam frage ich mich auch was ich brauch

Seit ich die DECT200 von AVM nutze, läuft es per THRESHOLD perfekt: Waschmaschine oder Trockner gehen in den Standby und "fertig" wird ohne Verzögerung gemeldet.
Titel: Antw:Anpassung Waschmaschie fertig auf Revolt
Beitrag von: masterpete23 am 03 Dezember 2015, 20:00:55
Hättest du netterweise den Code dafür. Danke

Gesendet von meinem Huawei Honor 7

Titel: Antw:Anpassung Waschmaschie fertig auf Revolt
Beitrag von: drhirn am 03 Dezember 2015, 20:06:58
DOIF = notify + at + threshold + watchdog
Schau dir also lieber das mal genauer an. Da z.B. http://www.fhemwiki.de/wiki/DOIF#Waschmaschine_Fertigmeldung (http://www.fhemwiki.de/wiki/DOIF#Waschmaschine_Fertigmeldung)
Titel: Antw:Anpassung Waschmaschie fertig auf Revolt
Beitrag von: Damian am 03 Dezember 2015, 20:14:12
Zitat von: drhirn am 03 Dezember 2015, 20:06:58
DOIF = notify + at + threshold + watchdog
Schau dir also lieber das mal genauer an. Da z.B. http://www.fhemwiki.de/wiki/DOIF#Waschmaschine_Fertigmeldung (http://www.fhemwiki.de/wiki/DOIF#Waschmaschine_Fertigmeldung)

oder einfach das Beispiel aus der Commandref zu DOIF:

Anwendungsbeispiel: Benachrichtung "Waschmaschine fertig", wenn Verbrauch mindestens 5 Minuten unter 2 Watt (Perl-Code wird in geschweifte Klammern gesetzt):

define di_washer DOIF ([power:watt]<2) ({system("wmail washer finished")})
attr di_washer wait 300


Eine erneute Benachrichtigung wird erst wieder ausgelöst, wenn zwischendurch der Verbrauch über 2 Watt angestiegen war.

Gruß

Damian
Titel: Antw:Anpassung Waschmaschie fertig auf Revolt
Beitrag von: Brice am 03 Dezember 2015, 21:55:21
@masterpete23
DECT200 ist als "Waschmaschine definiert:

define Waschmaschine FBDECT 17 switch

Threshold (im Standby verbraucht die Waschmaschine 1,35 Watt, also Threshold auf 1,5 Watt definiert):

define th_Waschmaschine THRESHOLD Waschmaschine:power:0:1.5||||on:off|_sc
attr th_Waschmaschine state_cmd1_gt on
attr th_Waschmaschine state_cmd2_lt off
attr th_Waschmaschine state_format _sc


Pushnachricht via PushNotifier bei Ende:
define Notify_Waschmaschine_Push notify th_Waschmaschine:off set PushNachricht message Die Waschmaschine ist fertig, bitte die Wäsche entnehmen

Ich denke mal über eine Änderung auf DOIF nach....
Titel: Antw:Anpassung Waschmaschie fertig auf Revolt
Beitrag von: Damian am 03 Dezember 2015, 22:21:37
Zitat von: Brice am 03 Dezember 2015, 21:55:21
@masterpete23
DECT200 ist als "Waschmaschine definiert:

define Waschmaschine FBDECT 17 switch

Threshold (im Standby verbraucht die Waschmaschine 1,35 Watt, also Threshold auf 1,5 Watt definiert):

define th_Waschmaschine THRESHOLD Waschmaschine:power:0:1.5||||on:off|_sc
attr th_Waschmaschine state_cmd1_gt on
attr th_Waschmaschine state_cmd2_lt off
attr th_Waschmaschine state_format _sc


Pushnachricht via PushNotifier bei Ende:
define Notify_Waschmaschine_Push notify th_Waschmaschine:off set PushNachricht message Die Waschmaschine ist fertig, bitte die Wäsche entnehmen

Ich denke mal über eine Änderung auf DOIF nach....

ja. DOIF ist natürlich universeller, auch wenn es mit THRESHOLD funktioniert. THRESHOLD ist auch kryptischer in der Syntax und auf Zweipunktregelung spezialisiert. Ein weiterer Vorteil bei DOIF ist es, eine Verzögerung anzugeben, um Schwankungen zu ignorieren  - das kann THRESHOLD nicht.

Gruß

Damian
Titel: Antw:Anpassung Waschmaschie fertig auf Revolt
Beitrag von: masterpete23 am 04 Dezember 2015, 07:33:23
Moin,
mit meiner Lösung erhalte ich
2015.12.03 22:45:06 3: Watchdog Revolt_Trockner.AutoStandby triggered
2015.12.03 22:45:06 3: Revolt_Trockner.WaschvorgangAbgeschlossen.Telegram.notify return value: syntax error at (eval 474389) line 1, near "fertig !"

2015.12.03 22:48:05 3: setstate Revolt_Trockner.AutoOff defined : Please define Revolt_Trockner.AutoOff first
2015.12.03 22:48:05 3: Revolt_Trockner.Betrieb.An.notify return value: Please define Revolt_Trockner.AutoOff first


Code:
define Revolt_Trockner.WaschvorgangAbgeschlossen.Telegram.notify notify Revolt_Trockner.Betrieb:standby { set teleBot message Der Trockner ist fertig !}
Ich denke mal die { können weg oder?

und bei
fhem ("setstate Revolt_Trockner.AutoOff defined");;\
Muss es wohl
fhem ("setstate Revolt_Trockner.AutoStandby defined");;\
heißen.

Gut wenn man copy und paste macht - besser wenn man es versteht.
DOIF scheint ja echt das ganze in einem Einzeiler zu schaffen.
Mal sehen wie es so geht...
Danke und ihr könnt erstmal weiter über euers diskutieren :)

Titel: Antw:Anpassung Waschmaschie fertig auf Revolt
Beitrag von: Tedious am 04 Dezember 2015, 09:22:50
Das ist immer Geschmackssache :) Ich nutze die DoIfs einfach gerne weil Basic auf dem C64 seinerzeit die erste Sprache war die ich gelernt habe. Da war das "If-Then-Else" quasi Standard, daher finde ich das am übersichtlichsten und (für mich) am einfachsten zu verstehen.
Titel: Antw:Anpassung Waschmaschie fertig auf Revolt
Beitrag von: masterpete23 am 05 Dezember 2015, 20:49:30
So mit beiden Lösungen hatte ich heute morgen telegram.me Nachrichten obwohl der Trockner nicht lief. Wie kann ich das Debuggen?

Gesendet von meinem Huawei Honor 7