Seite 1 von 3

AVM DECT 200 Rules / Alexa Echo

Verfasst: 5. Apr 2020 21:27
von Thomas R.
Hallo Zusammen,
ich bin Einsteiger was OpenHab betrifft. Ich will folgendes umsetzten. OpeHab soll den aktuellen Stromverbrauch (Leistung) einer AVM DECT200 auslesen und bei einem bestimmten Wert per Amazon Alexa ein Nachricht sprechen. Kurz "Waschmaschine fertig". Ich habe es soweit hinbekommen das die Werte der Steckdose ausgelesen werden und auch angezeigt werden. Ich habe das Amazon Echo Addon installiert und verbunden. Ich bekomme es aber nicht hin, dass meine Regel funktioniert. Leider sehe ich auch überhaupt nicht, ob die Regel überhaupt angesprochen wird. Ich finde keinen Log Eintrag. Es passiert einfach nichts. Wo liegt der Fehler, bzw. wie kann ich den Fehler am besten finden/eingrenzen?
Ich hatte die Vermutung es könnte daran liegen, dass ich den Leistungs Status in der Regel falsch abfrage. Ich hoffe mir kann jemand helfen.

amazonechocontrol.items:

Code: Alles auswählen

String Badezimmer_TTS "Text to Speech" { channel="amazonechocontrol:echo:devaccount:Badezimmer:textToSpeech" }
String Wohnzimmer_TTS "Text to Speech" { channel="amazonechocontrol:echo:devaccount:Wohnzimmer:textToSpeech" }
String Esszimmer_TTS "Text to Speech" { channel="amazonechocontrol:echoshow:devaccount:Esszimmer:textToSpeech" }
String Schlafzimmer_TTS "Text to Speech" { channel="amazonechocontrol:echo:devaccount:Schlafzimmer:textToSpeech" }
fritzbox.items:

Code: Alles auswählen

Switch Steckdosenschalter "Steckdosenschalter" { channel="avmfritz:FRITZ_DECT_200:1:DECT200_WM:outlet" }
Number:Temperature Temperatur "Aktuelle Raumtemperatur [%.1f %unit%]" { channel="avmfritz:FRITZ_DECT_200:1:DECT200_WM:temperature" }
Number:Energy Stromzaehler "Stromzähler [%.3f kWh]" { channel="avmfritz:FRITZ_DECT_200:1:DECT200_WM:energy" }
Number:Power Leistung "Aktuelle Leistung [%.2f %unit%]" { channel="avmfritz:FRITZ_DECT_200:1:DECT200_WM:power" }
Number:ElectricPotential Spannung "Aktuelle Spannung [%.1f %unit%]" { channel="avmfritz:FRITZ_DECT_200:1:DECT200_WM:voltage" }
default.rules:

Code: Alles auswählen

var told = 0
rule "Waschmaschine fertig"
when
        Item Leistung received update
then
        if (Leistung.state > 0.15 && Leistung.state < 4.94) {
                createTimer(now.plusMinutes(1), [|
                        if ((Leistung.state < 4.94) && (Leistung.state > 0) && (told == 0)) {
                                Badezimmer_TTS.sendCommand('Die Waschmaschine ist fertig.')
                                Wohnzimmer_TTS.sendCommand('Die Waschmaschine ist fertig.')
                                Esszimmer_TTS.sendCommand('Die Waschmaschine ist fertig.')
				Schlafzimmer_TTS.sendCommand('Die Waschmaschine ist fertig.')
                                told = 1
                        }
                ])
        }
end

rule "Zähler zurücksetzen"
when
        Item Leistung received update
then
        if (Leistung.state < 2.78) {
                told = 0
        }
end
OpenHAB läuft unter Rasbian auf einem RB 4.

Viele Grüße

Thomas

Re: AVM DECT 200 Rules / Alexa Echo

Verfasst: 5. Apr 2020 21:39
von Darkwin101
Setze mal das Waschmaschine fertig in " und nicht in '
Bitte triggere nicht 2 Rules mit demselben Trigger sondern packe doch beides in eine Rule.
Ist es nicht schwierig ?, das sowohl das Rücksetzen als auch das setzen von told im gleichen Bereich liegt ich würde das über den Ein Aus Schalter der Steckdose machen.

Re: AVM DECT 200 Rules / Alexa Echo

Verfasst: 5. Apr 2020 21:59
von Thomas R.
Ich möchte den Schalter der Steckdose nicht bedienen müssen.

Ist die Regel so ok? Gibt es keine Log Datei in der man sehen kann, ob und wann die Regel greift?

Code: Alles auswählen

var told = 0
rule "Waschmaschine fertig"
when
        Item Leistung received update
then
        if (Leistung.state > 0.15 && Leistung.state < 4.94) {
                createTimer(now.plusMinutes(1), [|
                        if ((Leistung.state < 4.94) && (Leistung.state > 0) && (told == 0)) {
                                Badezimmer_TTS.sendCommand("Die Waschmaschine ist fertig.")
                                Wohnzimmer_TTS.sendCommand("Die Waschmaschine ist fertig.")
                                Esszimmer_TTS.sendCommand("Die Waschmaschine ist fertig.")
	                        Schlafzimmer_TTS.sendCommand("Die Waschmaschine ist fertig.")
                                told = 1
                        }
                ])
        }
        if (Leistung.state < 2.78) {
                told = 0
        }
end

Re: AVM DECT 200 Rules / Alexa Echo

Verfasst: 5. Apr 2020 22:11
von udo1toni
Die Rule wird sicher aufgerufen, aber Du hast zum einen sachliche Fehler in der Rule, zum anderen auch einen Denkfehler.

Der erste Fehler beginnt mit dem Item Leistung. Da Du dieses Item als Number:Power definiert hast, kommt hier keine Zahl zurück, sondern ein QuantityType, das heißt, die Zahl hat imemr auch eine Einheit mit dabei. (hier vermutlich W für Watt) Du vergleichst in Deiner Rule nun diesen einheitenbehafteten Wert mit einer Zahl, was dazu führt, dass die Bedingung nicht erfüllt ist. (das Blöde ist, es gibt hier keine Fehlermeldung...)

Der zweite (logische) Fehler ist, dass Du in der Rule einfach einen Timer startest und nach Ablauf des Timers wieder nach dem Verbrauch schaust. In der Zwischenzeit kann der Verbrauch aber alle möglichen Werte angenommen haben. Mehr noch, da die Rule bei jeder Änderung triggert, startest Du theoretisch seeeehr viele Timer, die alle parallel zueinander laufen. Der korrekte Ansatz wäre folgender:

Code: Alles auswählen

// Globale Variablen zu Beginn der datei definieren

var Timer tWasher = null

rule "Waschmaschine fertig"
when
    Item Leistung changed // Leistung hat sich geändert
then
    var Number nPower = 0                                            // Variable mit 0 initialisieren
    if(Leistung.state instanceof Number)                             // falls gültiger Wert
        nPower = (Leistung.state as Number).floatValue               // Variable auf numerischen wert setzen
    var Number nPowerOld = 0                                         // Variable mit 0 initialisieren
    if(previousState instanceof Number)                              // falls gültiger Wert
        nPowerOld = (previousState as Number).floatValue             // Variable auf numerischen wert setzen
    if (nPower > 0.15 && nPower < 4.94 && nPowerOld > 4.94)          // Wert war höher als 4.94 und ist jetzt zwischen 4.94 und 0.15
        tWasher?.cancel                                              // falls Timer existiert, löschen
        tWasher = createTimer(now.plusMinutes(1), [ |                // Timer neu anlegen
            val String strMessage = "Die Waschmaschine ist fertig."
            Badezimmer_TTS.sendCommand(strMessage)
            Wohnzimmer_TTS.sendCommand(strMessage)
            Esszimmer_TTS.sendCommand(strMessage)
            Schlafzimmer_TTS.sendCommand(strMessage)
        ])
     else if(nPower > 4.94)                                           // Falls Wert über 4.94
         tWasher?.cancel                                              // Timer löschen
end
Die implizite Variable previousState steht nur bei changed zur Verfügung, dieser Trigger ist aber ohnehin für diese Rule besser geeignet.
In previousState ist der Status vor der Änderung enthalten (in der aktuellen Version von OH gibt es auch noch die implizite Variable newState)
Wenn der alte Wert größer als das Wertefenster war, kommt die Maschine vom Betrieb. Der Wert fällt unter die Grenze und der Timer wird gestartet.
Steigt der Wert wieder über die Grenze, wird der Timer abgebrochen.
Wenn der Timer abläuft, wird die Nachricht versendet.

Wenn Du die *_TTS Items in einer Gruppe gTTS zusammenfasst, kannst Du den redundanten Teil der Rule so gestalten:

Code: Alles auswählen

gTTS.members.forEach[i|i.sendCommand("Die Waschmaschine ist fertig.")]
In diesem Fall ist das mit der String Variable nicht so toll, denn durch das Lambda muss die Variable dann global definiert sein.

Re: AVM DECT 200 Rules / Alexa Echo

Verfasst: 5. Apr 2020 22:11
von Darkwin101
Ja so du kannst ein loginfo setzen um zu sehen ob die Regel greift ich würde im unteren Bereich noch ein told == 1 abfragen damit der Teil nur durchlaufen wird wenn der erste Teil abgearbeitet wurde


Gesendet von iPad mit Tapatalk

Re: AVM DECT 200 Rules / Alexa Echo

Verfasst: 5. Apr 2020 22:37
von Thomas R.
Hallo Udo1toni,

ich habe die Regel wie von dir vorgeschlagen übernommen. Aber leider tut sich nichts. Ich sehe im openhab event.log, dass der Wert der Leistung unter 4.94 fällt, aber es kommt keine Benachrichtigung.

Re: AVM DECT 200 Rules / Alexa Echo

Verfasst: 6. Apr 2020 11:48
von udo1toni
Dann hilft es nichts, wie müssen ein bisschen mehr Logging generieren. Die komplette Rule:

Code: Alles auswählen

// Globale Variablen zu Beginn der datei definieren

var Timer tWasher = null

rule "Waschmaschine fertig"
when
    Item Leistung changed                                            // Leistung hat sich geändert
then
    logInfo("washer","Rule getriggert")
    var Number nPower = 0                                            // Variable mit 0 initialisieren
    if(Leistung.state instanceof Number)                             // falls gültiger Wert
        nPower = (Leistung.state as Number).floatValue               // Variable auf numerischen wert setzen
    logInfo("washer","Leistung: {}",nPower)
    var Number nPowerOld = 0                                         // Variable mit 0 initialisieren
    if(previousState instanceof Number)                              // falls gültiger Wert
        nPowerOld = (previousState as Number).floatValue             // Variable auf numerischen wert setzen
    logInfo("washer","Leistung Alt: {}",nPowerOld)
    if(nPower > 0.15 && nPower < 4.94 && nPowerOld > 4.94) {         // Wert war höher als 4.94 und ist jetzt zwischen 4.94 und 0.15
        logInfo("washer","Timer wird gestartet")
        tWasher?.cancel                                              // falls Timer existiert, löschen
        tWasher = createTimer(now.plusMinutes(1), [ |                // Timer neu anlegen
        logInfo("washer","Timer abgelaufen")
            val String strMessage = "Die Waschmaschine ist fertig."
            Badezimmer_TTS.sendCommand(strMessage)
            Wohnzimmer_TTS.sendCommand(strMessage)
            Esszimmer_TTS.sendCommand(strMessage)
            Schlafzimmer_TTS.sendCommand(strMessage)
        ])
    } else if(nPower > 4.94) {                                        // Falls Wert über 4.94
         logInfo("washer","Timer wird abgebrochen")
         tWasher?.cancel                                              // Timer löschen
    }
end

Re: AVM DECT 200 Rules / Alexa Echo

Verfasst: 6. Apr 2020 14:45
von Thomas R.
Hallo,
die Regel scheint soweit zu funktionieren, allerdings funktioniert die Sprachausgabe noch nicht.
Kann es daran liegen, dass ich mehrere Alexas gleichzeitig anspreche?

hier die Log Einträge:

openhab.log:

Code: Alles auswählen

2020-04-06 14:16:41.803 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'default.rules'
2020-04-06 14:23:28.037 [INFO ] [clipse.smarthome.model.script.washer] - Rule getriggert
2020-04-06 14:23:28.043 [INFO ] [clipse.smarthome.model.script.washer] - Leistung: 3.07
2020-04-06 14:23:28.047 [INFO ] [clipse.smarthome.model.script.washer] - Leistung Alt: 0.0
2020-04-06 14:23:57.649 [INFO ] [clipse.smarthome.model.script.washer] - Rule getriggert
2020-04-06 14:23:57.657 [INFO ] [clipse.smarthome.model.script.washer] - Leistung: 24.39
2020-04-06 14:23:57.661 [INFO ] [clipse.smarthome.model.script.washer] - Leistung Alt: 3.07
2020-04-06 14:23:57.670 [INFO ] [clipse.smarthome.model.script.washer] - Timer wird abgebrochen
2020-04-06 14:24:27.674 [INFO ] [clipse.smarthome.model.script.washer] - Rule getriggert
2020-04-06 14:24:27.679 [INFO ] [clipse.smarthome.model.script.washer] - Leistung: 12.73
2020-04-06 14:24:27.683 [INFO ] [clipse.smarthome.model.script.washer] - Leistung Alt: 24.39
2020-04-06 14:24:27.691 [INFO ] [clipse.smarthome.model.script.washer] - Timer wird abgebrochen
2020-04-06 14:25:27.701 [INFO ] [clipse.smarthome.model.script.washer] - Rule getriggert
2020-04-06 14:25:27.712 [INFO ] [clipse.smarthome.model.script.washer] - Leistung: 27.82
2020-04-06 14:25:27.716 [INFO ] [clipse.smarthome.model.script.washer] - Leistung Alt: 12.73
2020-04-06 14:25:27.723 [INFO ] [clipse.smarthome.model.script.washer] - Timer wird abgebrochen
2020-04-06 14:26:57.684 [INFO ] [clipse.smarthome.model.script.washer] - Rule getriggert
2020-04-06 14:26:57.692 [INFO ] [clipse.smarthome.model.script.washer] - Leistung: 2.86
2020-04-06 14:26:57.699 [INFO ] [clipse.smarthome.model.script.washer] - Leistung Alt: 27.82
2020-04-06 14:26:57.714 [INFO ] [clipse.smarthome.model.script.washer] - Timer wird gestartet
2020-04-06 14:27:57.741 [INFO ] [clipse.smarthome.model.script.washer] - Timer abgelaufen
2020-04-06 14:30:57.720 [INFO ] [clipse.smarthome.model.script.washer] - Rule getriggert
2020-04-06 14:30:57.729 [INFO ] [clipse.smarthome.model.script.washer] - Leistung: 2.78
2020-04-06 14:30:57.736 [INFO ] [clipse.smarthome.model.script.washer] - Leistung Alt: 2.86
events.log:

Code: Alles auswählen

2020-04-06 14:26:57.681 [vent.ItemStateChangedEvent] - Stromzaehler changed from 124.56 kWh to 124.561 kWh
2020-04-06 14:26:57.684 [vent.ItemStateChangedEvent] - Leistung changed from 27.820 W to 2.860 W
2020-04-06 14:26:57.687 [vent.ItemStateChangedEvent] - Spannung changed from 238.777 V to 238.134 V
2020-04-06 14:26:57.681 [vent.ItemStateChangedEvent] - Stromzaehler changed from 124.56 kWh to 124.561 kWh
2020-04-06 14:26:57.684 [vent.ItemStateChangedEvent] - Leistung changed from 27.820 W to 2.860 W
2020-04-06 14:26:57.687 [vent.ItemStateChangedEvent] - Spannung changed from 238.777 V to 238.134 V
2020-04-06 14:27:57.760 [ome.event.ItemCommandEvent] - Item 'Badezimmer_TTS' received command Die Waschmaschine ist fertig.
2020-04-06 14:27:57.763 [ome.event.ItemCommandEvent] - Item 'Wohnzimmer_TTS' received command Die Waschmaschine ist fertig.
2020-04-06 14:27:57.764 [nt.ItemStatePredictedEvent] - Badezimmer_TTS predicted to become NULL
2020-04-06 14:27:57.767 [ome.event.ItemCommandEvent] - Item 'Esszimmer_TTS' received command Die Waschmaschine ist fertig.
2020-04-06 14:27:57.769 [ome.event.ItemCommandEvent] - Item 'Schlafzimmer_TTS' received command Die Waschmaschine ist fertig.
2020-04-06 14:27:57.771 [nt.ItemStatePredictedEvent] - Wohnzimmer_TTS predicted to become NULL
2020-04-06 14:27:57.772 [nt.ItemStatePredictedEvent] - Esszimmer_TTS predicted to become NULL
2020-04-06 14:27:57.773 [nt.ItemStatePredictedEvent] - Schlafzimmer_TTS predicted to become NULL

Re: AVM DECT 200 Rules / Alexa Echo

Verfasst: 6. Apr 2020 14:56
von Thomas R.
Ich habe in der Regel auch mal nur eine Alexa angegeben, aber bekomme trotzdem keine Sprachausgabe.

Re: AVM DECT 200 Rules / Alexa Echo

Verfasst: 6. Apr 2020 15:09
von Thomas R.
Brauche ich eine amazonechocontrol.things Datei?