Gemeinsam genutze Waschmaschine überwachen, mit Sonos & Pushmsg Benachrichtigung

Begonnen von rapster, 23 November 2014, 14:11:49

Vorheriges Thema - Nächstes Thema

rapster

Hallo zusammen,

wiederverwendbares kleines Script zur Überwachung der Waschmaschine, Trockner usw. im Mehrparteienhaus, mit grafischer Darstellung in Fhem und Benachrichtigung über Sonos + Pushmsg.

Evtl. muss die RegExp ($power =~ s/^\D*(\d+)/$1/;) in der anhängenden myUtils.pm noch angepasst werden, diese ist auf den Homematic Leistungsmesser ausgelegt.

Definieren eines Gerätes (als Beispiel Waschmaschine) inkl. des benötigten Notifys, und eines Notfys welches die Überwachung über einen Funkschalter aktiviert.

#Dummy Waschmaschine
define Waschmaschine dummy
attr Waschmaschine userattr min_watt wait_sec_before_off pushmsg_devRegExp pushmsg_startMsg pushmsg_stopMsg sonos_devRegExp sonos_stopMsg sonos_volume
attr Waschmaschine event-on-change-reading state
attr Waschmaschine icon scene_washing_machine
attr Waschmaschine min_watt 8
attr Waschmaschine pushmsg_devRegExp pushmsg
attr Waschmaschine pushmsg_startMsg in Betrieb...
attr Waschmaschine pushmsg_stopMsg ist fertig!
attr Waschmaschine room Keller
attr Waschmaschine sonos_devRegExp (Sonos_Bad|Sonos_Schlafzimmer|Sonos_Kueche)
attr Waschmaschine sonos_stopMsg Die Waschmaschine ist fertig
attr Waschmaschine sonos_volume 10
attr Waschmaschine wait_sec_before_off 180
#notify Waschmaschine
define ntfy_waschmaschine notify kg_hr_steckdose_waschmaschine_Pwr:power.* { monitorDevicePower($EVENT,'Waschmaschine') }
#notify Wandtaster - Enable Monitoring
define ntfy_waschmaschine_wandtaster notify ^kg_hr_wandtaster_BtnWaschmaschine.(Short|LongRelease).* { fhem("setreading Waschmaschine monitoringEnabled 1") }


Beispiel wiederverwendung des Scripts bei einem zweiten Gerät:
#Dummy Trockner
define Trockner dummy
attr Trockner userattr min_watt wait_sec_before_off pushmsg_devRegExp pushmsg_startMsg pushmsg_stopMsg sonos_devRegExp sonos_stopMsg sonos_volume
attr Trockner event-on-change-reading state
attr Trockner icon scene_clothes_dryer
attr Trockner min_watt 2
attr Trockner pushmsg_devRegExp pushmsg
attr Trockner pushmsg_startMsg in Betrieb...
attr Trockner pushmsg_stopMsg ist fertig!
attr Trockner room Keller
attr Trockner sonos_devRegExp Sonos_.+
attr Trockner sonos_stopMsg Der Trockner ist fertig
attr Trockner sonos_volume 10
attr Trockner wait_sec_before_off 0
#notify Waschmaschine
define ntfy_trockner notify kg_hr_steckdose_trockner_Pwr:power.* { monitorDevicePower($EVENT,'Trockner') }
#notify Wandtaster - Enable Monitoring
define ntfy_trockner_wandtaster notify ^kg_hr_wandtaster_BtnTrockner.(Short|LongRelease).* { fhem("setreading Trockner monitoringEnabled 1") }


attr wait_sec_before_off - Gibt die mindest Anzahl der Sekunden an, welche zwischen einem < min-watt Events und einem >= min-watt Events vergehen müssen damit das Gerät als OFF erkannt wird. (Falls Gerät evtl. pausen ohne Stromverbrauch einlegt.)

attr min-watt - Gibt die mindest Watt an damit ein Gerät als ON erkannt wird.

Falls die Attribute für pushmsg bzw. sonos weggelassen werden, ist dieses feature deaktiviert.

Gruß Claudiu

rebejja

Hallo Rapster,

vielen Dank für das Programm. Genau das was ich Suche. Kannst du bitte noch kurz angeben welche hardware du benutzt. Insbesondere würde mich interessieren, wie du die Leistung überwachst.

Dank dir.

Grüße
rebejja

rapster

Hi rebejja,

als Hardware werden 2x Homematic HM-ES-PMSw1-Pl verwendet (Als Energiemessgerät an WM/Trockner).

Die Überwachung erfolgt über das anhängende Skript, oder versteh ich deine Frage grad falsch :-)

Gruß rapster

rebejja

Hi Rapster,

danke für deine Antwort. Mir ist allerdings noch nicht klar, wie du das Funksignal der angegebenen Funk-Steckdose Homematic HM-ES-PMSw1-Pl  an den Pi übergibst. Hast du dazwischen noch ein HMLan geschaltet? Oder gibt es ein Funkempfänger für den Pi als zusatz zu kaufen?

liebe Grüße
rebejja


Bernhard-IN

Hallo rapster,

kannst du mir sagen, wie ich dein Script abändern muss, damit es mit den AVM DECT 200 geht?

Gruss Bernhard-IN

pink99panther

Hallo
zunächst mal meinen Dank an rapster für diese Anleitung.
Lief bei mir Monate lang ohne Probleme.
Aber jetzt wird das Ende des Waschgangs nicht mehr erkannt.
Ich hab schon alles mögliche probiert, aber nichts hat geholfen.

Hier mal meine Subroutiene und meine Geräte.
package main;

use strict;
use warnings;
use POSIX;

sub
UtilsWaesche_Initialize($$)
{
  my ($hash) = @_;
}

sub monitorDevicePower($$) {
my ($power,$dummyDevice) = @_;
$power =~ s/^\D*(\d+)/$1/; #Substitut $EVENT, z.B. $EVENT='power: 68.45' substitute auf '68.45'
   
    if ( ReadingsVal("$dummyDevice",'monitoringEnabled','0') ) { #Nur überwachen wenn Reading 'monitoringEnabled' true ist
        if ( $power >= AttrVal($dummyDevice,'min_watt','') ) { #Dummy einschalten
        if ( Value($dummyDevice) ne 'on-till' && AttrVal($dummyDevice,'pushmsg_devRegExp','0') && AttrVal($dummyDevice,'pushmsg_startMsg','0') ) {
            fhem("set ".AttrVal($dummyDevice,'pushmsg_devRegExp','')." send '$dummyDevice' ".AttrVal($dummyDevice,'pushmsg_startMsg',''));
            }
            fhem("set $dummyDevice on-till"); #Dummy Status setzen (benötigt für Timestamp)
        }
        elsif ( $power < AttrVal($dummyDevice,'min_watt','') #Dummy ausschalten
        && Value($dummyDevice) eq 'on-till'
        && ReadingsVal("$dummyDevice",'Power','') < AttrVal($dummyDevice,'min_watt','') #Es muss 2 mal hintereinander < min_watt sein
        && time-time_str2num(ReadingsTimestamp($dummyDevice,'state','')) >= AttrVal($dummyDevice,'wait_sec_before_off','') ) { #Zwischen letztem > min_watt Wert, und 2. < min_watt Wert wait_sec warten       
                fhem("set $dummyDevice off"); #Wenn beide Bedingungen erfüllt sind, Dummy ausschalten
                fhem("setreading $dummyDevice monitoringEnabled 0"); #Monitoring deaktivieren
        if ( Value($dummyDevice) eq 'off' && AttrVal($dummyDevice,'pushmsg_devRegExp','0') && AttrVal($dummyDevice,'pushmsg_stopMsg','0') ) {
                fhem("set ".AttrVal($dummyDevice,'pushmsg_devRegExp','')." send '$dummyDevice' ".AttrVal($dummyDevice,'pushmsg_stopMsg',''));
            }
                if ( AttrVal($dummyDevice,'tts_devRegExp','0') && AttrVal($dummyDevice,'tts_stopMsg','0') ) {
                fhem("set ".AttrVal($dummyDevice,'tts_devRegExp','')."".AttrVal($dummyDevice,'tts_stopMsg','')."");
            }
        }
}
    elsif ( $power >= AttrVal($dummyDevice,'min_watt','' && Value($dummyDevice) ne 'on') ) {
    fhem("set $dummyDevice on");
    }
    elsif( time-time_str2num(ReadingsTimestamp($dummyDevice,'state','')) >= AttrVal($dummyDevice,'wait_sec_before_off','') && ReadingsVal("$dummyDevice",'Power','') < AttrVal($dummyDevice,'min_watt','') && Value($dummyDevice) ne 'off' ) {
        fhem("set $dummyDevice off");
    }     
    fhem("setreading $dummyDevice Power $power"); #Power in Dummy schreiben
}


1;


Das Notify
Internals:
   DEF        Sonoff_Pow1:Power:.* { monitorDevicePower($EVENT,'Waschmaschine') }
   NAME       ntfy_waschmaschine
   NOTIFYDEV  Sonoff_Pow1
   NR         91
   NTFY_ORDER 50-ntfy_waschmaschine
   REGEXP     Sonoff_Pow1:Power:.*
   STATE      2017-12-13 22:43:25
   TYPE       notify
   READINGS:
     2017-12-13 14:08:56   state           active
Attributes:
   room       Keller,Wäsche


Die Waschmaschine
Internals:
   CHANGED   
   NAME       Waschmaschine
   NR         209
   STATE      fertig
   TYPE       dummy
   READINGS:
     2017-12-13 22:44:25   Power           2
     2017-12-13 09:40:22   monitoringEnabled 1
     2017-12-13 09:38:00   state           off
Attributes:
   event-on-change-reading state
   eventMap   on:arbeite off:fertig
   group      Wäsche
   icon       scene_washing_machine
   min_watt   25
   readingList monitoringEnabled
   room       Keller,Wäsche
   userattr   min_watt wait_sec_before_off pushmsg_devRegExp pushmsg_startMsg pushmsg_stopMsg tts_devRegExp tts_stopMsg
   wait_sec_before_off 480


und hier noch mein Gerät zur Verbrauchsmessung
Internals:
   IODev      MyBroker
   NAME       Sonoff_Pow1
   NR         80
   STATE      akutelle Leistung: 2.0 W Tagesverbrauch: 0.05 Kw/h
   TYPE       MQTT_DEVICE
   Helper:
     DBLOG:
       Power:
         logdb:
           TIME       1513201645.29702
           VALUE      2
   READINGS:
     2017-12-13 22:47:25   Current         0.065
     2017-12-13 22:47:25   ENERGY          {"Time":"2017-12-13T22:47:24", "Total":12.993, "Yesterday":1.000, "Today":0.047, "Period":0, "Power":2, "Factor":0.13, "Voltage":231, "Current":0.065}
     2017-12-13 22:47:25   Factor          0.13
     2017-12-13 22:47:25   POWER           on
     2017-12-13 22:47:25   Period          0
     2017-12-13 22:47:25   Power           2
     2017-12-13 22:47:25   Power_avg_day   2.0
     2017-12-13 22:47:25   Power_avg_month 9.2
     2017-12-13 22:47:25   Power_cum_day   164090
     2017-12-13 22:47:25   Power_cum_month 11062369
     2017-12-13 00:00:51   Power_max_day   2.0
     2017-12-09 09:29:03   Power_max_month 2248.0
     2017-12-13 00:00:51   Power_min_day   2.0
     2017-12-10 18:54:47   Power_min_month 0.0
     2017-12-13 22:47:25   STATE           {"Time":"2017-12-13T22:47:24", "Uptime":146, "Vcc":3.122, "POWER":"ON", "Wifi":{"AP":1, "SSId":"WLAN", "RSSI":64, "APMac":"XX:XX:XX:XX:XX:XX"}}
     2017-12-13 22:47:25   Time            2017-12-13T22:47:24
     2017-12-13 22:47:25   Today           0.047
     2017-12-13 22:47:25   Total           12.993
     2017-12-13 22:47:25   Uptime          146
     2017-12-13 22:47:25   Vcc             3.122
     2017-12-13 22:47:25   Voltage         231
     2017-12-13 22:47:25   Wifi_AP         1
     2017-12-13 22:47:25   Wifi_APMac      XX:XX:XX:XX:XX:XX
     2017-12-13 22:47:25   Wifi_RSSI       64
     2017-12-13 22:47:25   Wifi_SSId       WLAN
     2017-12-13 22:47:25   Yesterday       1
     2017-12-10 18:54:56   state           ON
     2017-12-13 22:47:25   transmission-state incoming publish received
   message_ids:
   publishSets:
     :
       topic      cmnd/sonoffpow1/power
       values:
         on
         off
   sets:
     off       
     on         
   subscribe:
     tele/sonoffpow1/ENERGY
     tele/sonoffpow1/STATE
   subscribeExpr:
     ^tele\/sonoffpow1\/ENERGY$
     ^tele\/sonoffpow1\/STATE$
   subscribeReadings:
     tele/sonoffpow1/ENERGY:
       cmd       
       name       ENERGY
     tele/sonoffpow1/STATE:
       cmd       
       name       STATE
Attributes:
   DbLogInclude Power
   IODev      MyBroker
   alias      POW_Waschmaschine
   eventMap   ON:on OFF:off
   genericDeviceType switch
   icon       measure_power
   publishSet on off cmnd/sonoffpow1/power
   room       Wäsche,Keller
   stateFormat {sprintf("akutelle Leistung: %.1f W Tagesverbrauch: %.2f Kw/h", ReadingsVal($name,"Power",undef), ReadingsVal($name,"Today",undef))}
   subscribeReading_ENERGY tele/sonoffpow1/ENERGY
   subscribeReading_STATE tele/sonoffpow1/STATE
   webCmd     on:off


In den "on-till" Modus wird geschaltet und eine Nachricht gesendet, wenn der eingestelle Minimalverbrauch überschritten wird und dann bleibts hängen.

Für Hilfe wäre ich sehr dankbar

LG
Manfred

doman75

Hallo,

also ich überwache das ganze einfach mit einem doif


([StromverbrauchWaschmaschineEC3000:power]>5) (set Waschmaschine An) DOELSEIF ([StromverbrauchWaschmaschineEC3000:power]<4) (set Waschmaschine Aus)

und habe dort das wait attr auf 60:300 gesetzt dadruch setzt er denn Dummy "Waschmaschine" nach einer Minute wenn der Power wert über 5 liegt auf An und wenn 5 Minuten der Powerwert wieder unter 4 liegt wird der Dummy Waschmaschine auf Aus gesetzt.

Das kann mit jedem beliebigen Powermesser gemacht werden der in FHEM die Leistungsaufnahme misst, maximal muss das reading power ersetzt werden.

Grüße
Swen

pink99panther

Hallo doman75

Danke für den Schubs.
Hatte den wait_timer garnicht mehr auf dem Radar, weshalb ich es anders gemacht hatte.

Hab jetzt auf DOIF umgebaut.

Trotzdem hätte mich interessiert, warum die sub nicht mehr funktioniert hat.

LG
Manfred