Mithilfe der Produkte von Shelly lassen sich sehr leicht Trockner und Waschmaschine in smarte Geräte verwandeln. Voraussetzung für die smarten features ist die Erkennung des Stromverbrauchs der Geräte. Außerdem benötigt wird eine Smarthomezentrale, wie z.B. ioBroker. Während die Maschine läuft, registrieren wir den Stromverbrauch, berechnen den Gesamtverbrauch und können bei Ende des Trocken- oder Waschvorgangs uns benachrichtigen lassen. In der Waschmaschine vergessene Wäsche und damit ein erneuter Waschvorgang gehört der Vergangenheit an.

UPDATE Oktober 2020: Nach dem letzten Update des JS-Adapters kommt es zu Fehlern bei der Benachrichtigung, diese wird mehrfach nach Abschluss des Scripts versendet. Script und Blockly-Export sind im Artikel bereits korrigiert.

Waschmaschine und Trockner smart machen, blockly script

Waschmaschine und Trockner smart machen, blockly script

Schauen wir uns das hierfür notwendige Script an, die Logik des Scripts funktioniert recht einfach:

  • Wir merken uns in einem Status den Zustand der Maschine, am Anfang AUS
  • Der Stromverbrauch sollte im Standby oder im Aus-Zustand gering bzw. 0 sein
  • Verändert sich dieser Wert, über eine gesetzte Schwelle, d.h. mindestens so viel Leistung muss bezogen werden, setzen wir den Status auf AN
  • Solange der momentane Verbrauch der Maschine über dem Schwellwert liegt, bleibt der Zustand auf AN
  • Ist die Maschine fertig, sinkt der Stromverbrauch unter den Schwellwert, wir setzen den Status auf AUS und können z.B. per pushover über das Ende des Wasch- oder Trockenvorgangs informieren
  • Beachten müssen wir allerdings, dass auch zwischendurch der Stromverbrauch kurzfristig unter den Schwellwert sinken kann. In diesem Fall starten wir einen Timer, nach dessen Ablauf das Ende des Vorgangs getriggert wird. Wird allerdings zwischendurch der Schwellenwert wieder überschritten, löschen wir den Timer und das script wartet auf die nächste Unterschreitung des Schwellwerts.

Außerdem im Script integriert: Ermittlung des Gesamtstromverbrauchs

Auch hierfür ist die Logik relativ simpel, ist allerdings in der Scriptumsetzung etwas komplexer:

  • Bei Registrierung des Momentanstromverbrauchs merken wir uns den Wert und einen Timestamp
  • Verändert sich der Verbrauch berechnen wir bei dieser Änderungen die zeitliche Differenz zum letzten Timestamp und berechnen den absoluten Verbrauch für dieses Zeitfenster. Wir setzen den Verbrauchswert und den Timestamp neu und warten auf die nächste Änderung des Momentanverbrauchs. Solange die Maschine läuft, summieren wir die Einzelwerte auf und können bei Ende des Vorgangs den Gesamtverbrauch auslesen. 100%ig genau ist diese Methode natürlich nicht, aber ergibt einen sehr guten und nur gering abweichenden Gesamtverbrauch.

Javascript für den ioBroker-Import:

var standby_power, on_power, WON, wait, ts, actual_power, ts_temp, timeout;


createState("Waschmaschine.ON", function () {
});
createState("Waschmaschine.wait", function () {
});
createState("Waschmaschine.power_temp", function () {
});
createState("Waschmaschine.power_ts", function () {
});
createState("Waschmaschine.power", function () {
});
createState("Waschmaschine.power_year", function () {
});
on({id: "shelly.0.SHSW-PM#B1DE5C#1.Relay0.Power"/*Power*/, change: "ne"}, function (obj) {
  var value = obj.state.val;
  var oldValue = obj.oldState.val;
  standby_power = 3.5;
  // Wert, der beim Anschalten überschritten werden muss
  on_power = 10;
  WON = getState("javascript.0.Waschmaschine.ON").val;
  wait = getState("javascript.0.Waschmaschine.wait").val;
  ts = getState("shelly.0.SHSW-PM#B1DE5C#1.Relay0.Power").ts;
  actual_power = getState("shelly.0.SHSW-PM#B1DE5C#1.Relay0.Power").val;
  if (WON != true && actual_power > on_power) {
    // Waschmaschine ist jetzt angeschaltet
    setState("javascript.0.Waschmaschine.ON"/*Waschmaschine.ON*/, true, true);
    setState("javascript.0.Waschmaschine.wait"/*Waschmaschine.wait*/, false, true);
    setState("javascript.0.Waschmaschine.power_temp"/*Waschmaschine.power_temp*/, actual_power, true);
    setState("javascript.0.Waschmaschine.power_ts"/*Waschmaschine.power_ts*/, ts, true);
    setState("javascript.0.Waschmaschine.power"/*Waschmaschine.power*/, 0, true);
    console.log(('W1: anschalten' + String(actual_power)));
  } else if (wait == true && actual_power > on_power) {
    // an und power>onlimit
    console.log(('W:2 läuft und reset timer und twait ' + String(actual_power)));
    (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})();
    setState("javascript.0.Waschmaschine.wait"/*Waschmaschine.wait*/, false, true);
  } else if (WON == true && wait != true && actual_power < standby_power) { // Leistung fällt auf Standby-Wert, Waschmaschine vielleicht fertig setState("javascript.0.Waschmaschine.wait"/*Waschmaschine.wait*/, true, true); console.log((['W3: Leistung Standby, starte Timer für Fertig-Meldung',actual_power,ts].join(''))); timeout = setTimeout(function () { setState("javascript.0.Waschmaschine.ON"/*Waschmaschine.ON*/, false, true); ts_temp = getState("javascript.0.Waschmaschine.power").val; setState("javascript.0.Waschmaschine.power_year"/*Waschmaschine.power_year*/, (ts_temp + getState("javascript.0.Waschmaschine.power_year").val), true); }, 1200000); } else if (WON == true) { ts_temp = (new Date().getTime()) - getState("javascript.0.Waschmaschine.power_ts").val; ts_temp = ts_temp / 1000; ts_temp = ts_temp * getState("javascript.0.Waschmaschine.power_temp").val; ts_temp = ts_temp / 3600; setState("javascript.0.Waschmaschine.power_temp"/*Waschmaschine.power_temp*/, actual_power, true); setState("javascript.0.Waschmaschine.power_ts"/*Waschmaschine.power_ts*/, ts, true); setState("javascript.0.Waschmaschine.power"/*Waschmaschine.power*/, (ts_temp + getState("javascript.0.Waschmaschine.power").val), true); console.log(('W4: Waschmaschine läuft' + String(getState("javascript.0.Waschmaschine.power").val))); } }); // Notifications werden auf Basis des Status Waschmaschine.ON versendet on({id: "javascript.0.Waschmaschine.ON"/*Waschmaschine.ON*/, change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (getState("javascript.0.Waschmaschine.ON").val == false) { // Wechsel ON>OFF
    sendTo("pushover", "send", {
       message: (['Die Waschmaschine ist jetzt fertig!',' Verbrauch: ',Math.round(getState("javascript.0.Waschmaschine.power").val*10)/10].join('')),
       sound: ""
    });
  } else {
    // Wechsel ON>OFF
    sendTo("pushover", "send", {
       message: 'Die Waschmaschine läuft jetzt!',
       sound: ""
    });
  }
});

Blockly-Export:


  
    standby_power
    on_power
    WON
    wait
    ts
    actual_power
    ts_temp
    timeout
  
  
    Waschmaschine.ON
    
      
        Waschmaschine.wait
        
          
            Waschmaschine.power_temp
            
              
                Waschmaschine.power_ts
                
                  
                    Waschmaschine.power
                    
                      
                        Waschmaschine.power_year
                        
                          
                            shelly.0.SHSW-PM#B1DE5C#1.Relay0.Power
                            ne
                            
                            
                              
                                standby_power
                                
                                  
                                    3.5
                                  
                                
                                
                                  
                                    Wert, der beim Anschalten überschritten werden muss
                                    
                                      
                                        on_power
                                        
                                          
                                            10
                                          
                                        
                                        
                                          
                                            WON
                                            
                                              
                                                val
                                                javascript.0.Waschmaschine.ON
                                              
                                            
                                            
                                              
                                                wait
                                                
                                                  
                                                    val
                                                    javascript.0.Waschmaschine.wait
                                                  
                                                
                                                
                                                  
                                                    ts
                                                    
                                                      
                                                        ts
                                                        shelly.0.SHSW-PM#B1DE5C#1.Relay0.Power
                                                      
                                                    
                                                    
                                                      
                                                        actual_power
                                                        
                                                          
                                                            val
                                                            shelly.0.SHSW-PM#B1DE5C#1.Relay0.Power
                                                          
                                                        
                                                        
                                                          
                                                            
                                                            
                                                              
                                                                AND
                                                                
                                                                  
                                                                    NEQ
                                                                    
                                                                      
                                                                        WON
                                                                      
                                                                    
                                                                    
                                                                      
                                                                        TRUE
                                                                      
                                                                    
                                                                  
                                                                
                                                                
                                                                  
                                                                    GT
                                                                    
                                                                      
                                                                        actual_power
                                                                      
                                                                    
                                                                    
                                                                      
                                                                        on_power
                                                                      
                                                                    
                                                                  
                                                                
                                                              
                                                            
                                                            
                                                              
                                                                Waschmaschine ist jetzt angeschaltet
                                                                
                                                                  
                                                                    
                                                                    javascript.0.Waschmaschine.ON
                                                                    FALSE
                                                                    
                                                                      
                                                                        TRUE
                                                                      
                                                                    
                                                                    
                                                                      
                                                                        
                                                                        javascript.0.Waschmaschine.wait
                                                                        FALSE
                                                                        
                                                                          
                                                                            FALSE
                                                                          
                                                                        
                                                                        
                                                                          
                                                                            
                                                                            javascript.0.Waschmaschine.power_temp
                                                                            FALSE
                                                                            
                                                                              
                                                                                actual_power
                                                                              
                                                                            
                                                                            
                                                                              
                                                                                
                                                                                javascript.0.Waschmaschine.power_ts
                                                                                FALSE
                                                                                
                                                                                  
                                                                                    ts
                                                                                  
                                                                                
                                                                                
                                                                                  
                                                                                    
                                                                                    javascript.0.Waschmaschine.power
                                                                                    FALSE
                                                                                    
                                                                                      
                                                                                        0
                                                                                      
                                                                                    
                                                                                    
                                                                                      
                                                                                        log
                                                                                        
                                                                                          
                                                                                            test
                                                                                          
                                                                                          
                                                                                            
                                                                                            
                                                                                              
                                                                                                W1: anschalten
                                                                                              
                                                                                            
                                                                                            
                                                                                              
                                                                                                actual_power
                                                                                              
                                                                                            
                                                                                          
                                                                                        
                                                                                      
                                                                                    
                                                                                  
                                                                                
                                                                              
                                                                            
                                                                          
                                                                        
                                                                      
                                                                    
                                                                  
                                                                
                                                              
                                                            
                                                            
                                                              
                                                                AND
                                                                
                                                                  
                                                                    EQ
                                                                    
                                                                      
                                                                        wait
                                                                      
                                                                    
                                                                    
                                                                      
                                                                        TRUE
                                                                      
                                                                    
                                                                  
                                                                
                                                                
                                                                  
                                                                    GT
                                                                    
                                                                      
                                                                        actual_power
                                                                      
                                                                    
                                                                    
                                                                      
                                                                        on_power
                                                                      
                                                                    
                                                                  
                                                                
                                                              
                                                            
                                                            
                                                              
                                                                an und power>onlimit
                                                                
                                                                  
                                                                    log
                                                                    
                                                                      
                                                                        test
                                                                      
                                                                      
                                                                        
                                                                        
                                                                          
                                                                            W:2 läuft und reset timer und twait 
                                                                          
                                                                        
                                                                        
                                                                          
                                                                            actual_power
                                                                          
                                                                        
                                                                      
                                                                    
                                                                    
                                                                      
                                                                        timeout
                                                                        
                                                                          
                                                                            
                                                                            javascript.0.Waschmaschine.wait
                                                                            FALSE
                                                                            
                                                                              
                                                                                FALSE
                                                                              
                                                                            
                                                                          
                                                                        
                                                                      
                                                                    
                                                                  
                                                                
                                                              
                                                            
                                                            
                                                              
                                                                AND
                                                                
                                                                  
                                                                    AND
                                                                    
                                                                      
                                                                        EQ
                                                                        
                                                                          
                                                                            WON
                                                                          
                                                                        
                                                                        
                                                                          
                                                                            TRUE
                                                                          
                                                                        
                                                                      
                                                                    
                                                                    
                                                                      
                                                                        NEQ
                                                                        
                                                                          
                                                                            wait
                                                                          
                                                                        
                                                                        
                                                                          
                                                                            TRUE
                                                                          
                                                                        
                                                                      
                                                                    
                                                                  
                                                                
                                                                
                                                                  
                                                                    LT
                                                                    
                                                                      
                                                                        actual_power
                                                                      
                                                                    
                                                                    
                                                                      
                                                                        standby_power
                                                                      
                                                                    
                                                                  
                                                                
                                                              
                                                            
                                                            
                                                              
                                                                Leistung fällt auf Standby-Wert, Waschmaschine vielleicht fertig
                                                                
                                                                  
                                                                    
                                                                    javascript.0.Waschmaschine.wait
                                                                    FALSE
                                                                    
                                                                      
                                                                        TRUE
                                                                      
                                                                    
                                                                    
                                                                      
                                                                        log
                                                                        
                                                                          
                                                                            test
                                                                          
                                                                          
                                                                            
                                                                            
                                                                              
                                                                                W3: Leistung Standby, starte Timer für Fertig-Meldung
                                                                              
                                                                            
                                                                            
                                                                              
                                                                                actual_power
                                                                              
                                                                            
                                                                            
                                                                              
                                                                                ts
                                                                              
                                                                            
                                                                          
                                                                        
                                                                        
                                                                          
                                                                            timeout
                                                                            20
                                                                            min
                                                                            
                                                                              
                                                                                
                                                                                javascript.0.Waschmaschine.ON
                                                                                FALSE
                                                                                
                                                                                  
                                                                                    FALSE
                                                                                  
                                                                                
                                                                                
                                                                                  
                                                                                    ts_temp
                                                                                    
                                                                                      
                                                                                        val
                                                                                        javascript.0.Waschmaschine.power
                                                                                      
                                                                                    
                                                                                    
                                                                                      
                                                                                        
                                                                                        javascript.0.Waschmaschine.power_year
                                                                                        FALSE
                                                                                        
                                                                                          
                                                                                            ADD
                                                                                            
                                                                                              
                                                                                                1
                                                                                              
                                                                                              
                                                                                                ts_temp
                                                                                              
                                                                                            
                                                                                            
                                                                                              
                                                                                                1
                                                                                              
                                                                                              
                                                                                                val
                                                                                                javascript.0.Waschmaschine.power_year
                                                                                              
                                                                                            
                                                                                          
                                                                                        
                                                                                      
                                                                                    
                                                                                  
                                                                                
                                                                              
                                                                            
                                                                          
                                                                        
                                                                      
                                                                    
                                                                  
                                                                
                                                              
                                                            
                                                            
                                                              
                                                                EQ
                                                                
                                                                  
                                                                    WON
                                                                  
                                                                
                                                                
                                                                  
                                                                    TRUE
                                                                  
                                                                
                                                              
                                                            
                                                            
                                                              
                                                                ts_temp
                                                                
                                                                  
                                                                    MINUS
                                                                    
                                                                      
                                                                        1
                                                                      
                                                                      
                                                                        
                                                                        object
                                                                      
                                                                    
                                                                    
                                                                      
                                                                        1
                                                                      
                                                                      
                                                                        val
                                                                        javascript.0.Waschmaschine.power_ts
                                                                      
                                                                    
                                                                  
                                                                
                                                                
                                                                  
                                                                    ts_temp
                                                                    
                                                                      
                                                                        DIVIDE
                                                                        
                                                                          
                                                                            1
                                                                          
                                                                          
                                                                            ts_temp
                                                                          
                                                                        
                                                                        
                                                                          
                                                                            1
                                                                          
                                                                          
                                                                            1000
                                                                          
                                                                        
                                                                      
                                                                    
                                                                    
                                                                      
                                                                        ts_temp
                                                                        
                                                                          
                                                                            MULTIPLY
                                                                            
                                                                              
                                                                                1
                                                                              
                                                                              
                                                                                ts_temp
                                                                              
                                                                            
                                                                            
                                                                              
                                                                                1
                                                                              
                                                                              
                                                                                val
                                                                                javascript.0.Waschmaschine.power_temp
                                                                              
                                                                            
                                                                          
                                                                        
                                                                        
                                                                          
                                                                            ts_temp
                                                                            
                                                                              
                                                                                DIVIDE
                                                                                
                                                                                  
                                                                                    1
                                                                                  
                                                                                  
                                                                                    ts_temp
                                                                                  
                                                                                
                                                                                
                                                                                  
                                                                                    1
                                                                                  
                                                                                  
                                                                                    3600
                                                                                  
                                                                                
                                                                              
                                                                            
                                                                            
                                                                              
                                                                                
                                                                                javascript.0.Waschmaschine.power_temp
                                                                                FALSE
                                                                                
                                                                                  
                                                                                    actual_power
                                                                                  
                                                                                
                                                                                
                                                                                  
                                                                                    
                                                                                    javascript.0.Waschmaschine.power_ts
                                                                                    FALSE
                                                                                    
                                                                                      
                                                                                        ts
                                                                                      
                                                                                    
                                                                                    
                                                                                      
                                                                                        
                                                                                        javascript.0.Waschmaschine.power
                                                                                        FALSE
                                                                                        
                                                                                          
                                                                                            ADD
                                                                                            
                                                                                              
                                                                                                1
                                                                                              
                                                                                              
                                                                                                ts_temp
                                                                                              
                                                                                            
                                                                                            
                                                                                              
                                                                                                1
                                                                                              
                                                                                              
                                                                                                val
                                                                                                javascript.0.Waschmaschine.power
                                                                                              
                                                                                            
                                                                                          
                                                                                        
                                                                                        
                                                                                          
                                                                                            log
                                                                                            
                                                                                              
                                                                                                test
                                                                                              
                                                                                              
                                                                                                
                                                                                                
                                                                                                  
                                                                                                    W4: Waschmaschine läuft
                                                                                                  
                                                                                                
                                                                                                
                                                                                                  
                                                                                                    val
                                                                                                    javascript.0.Waschmaschine.power
                                                                                                  
                                                                                                
                                                                                              
                                                                                            
                                                                                          
                                                                                        
                                                                                      
                                                                                    
                                                                                  
                                                                                
                                                                              
                                                                            
                                                                          
                                                                        
                                                                      
                                                                    
                                                                  
                                                                
                                                              
                                                            
                                                          
                                                        
                                                      
                                                    
                                                  
                                                
                                              
                                            
                                          
                                        
                                      
                                    
                                  
                                
                              
                            
                            
                              
                                Notifications werden auf Basis des Status Waschmaschine.ON versendet
                                
                                  
                                    javascript.0.Waschmaschine.ON
                                    ne
                                    
                                    
                                      
                                        
                                        
                                          
                                            EQ
                                            
                                              
                                                val
                                                javascript.0.Waschmaschine.ON
                                              
                                            
                                            
                                              
                                                FALSE
                                              
                                            
                                          
                                        
                                        
                                          
                                            Wechsel ON>OFF
                                            
                                              
                                                
                                                
                                                0
                                                
                                                
                                                  
                                                    text
                                                  
                                                  
                                                    
                                                    
                                                      
                                                        Die Waschmaschine ist jetzt fertig!
                                                      
                                                    
                                                    
                                                      
                                                         Verbrauch: 
                                                      
                                                    
                                                    
                                                      
                                                        1
                                                        
                                                          
                                                            3.1234
                                                          
                                                          
                                                            val
                                                            javascript.0.Waschmaschine.power
                                                          
                                                        
                                                      
                                                    
                                                  
                                                
                                              
                                            
                                          
                                        
                                        
                                          
                                            Wechsel ON>OFF
                                            
                                              
                                                
                                                
                                                0
                                                
                                                
                                                  
                                                    text
                                                  
                                                  
                                                    Die Waschmaschine läuft jetzt!