Alexa Sprachausgabe

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
udo1toni
Beiträge: 15654
Registriert: 11. Apr 2018 18:05
Answers: 254
Wohnort: Darmstadt

Re: Alexa Sprachausgabe

Beitrag von udo1toni »

Hab Deine private Nachricht gesehen...
Zunächst: Bei Problemen mit Blacklisting ist der erste empfohlene Versuch eigentlich immer, eine erneute Einwahl zu erzwingen. Dabei bekommst Du gewöhnlich eine neue öffentliche IP zugewiesen und der Zugriff sollte wieder funktionieren.

Bezüglich des "eigentlichen" Problems, ausgehend von der Origianl-Rule von oben musst Du lediglich die Codezeile korrekt einbauen:

Code: Alles auswählen

var Timer tTrockner = null
rule "Trocker fertig"
when
    Item trocknerLeistung changed
then
    if((newState as Number).intValue > 25) {
        tTrockner?.cancel
        tTrockner = null
        return;
    }
    if(tTrockner === null)
        tTrockner = createTimer(now.plusMinutes(4),[|
            Alexa_Esszimmer_Sprich.sendCommand('Der Wäschetrockner ist fertig')
            tTrockner = null
        ])
end
Der Rulecode ist gültig für die Konfiguration über eine rules-Datei (die wird unter /etc/openhab/rules/ abgespeichert, z.B. /etc/openhab/rules/meine.rules)
Alternativ kannst Du den gleichen Code auch über die UI verwenden. Aber Achtung... ein Teil des Codes oben ist nicht Teil des Programms, sondern der "Rahmen" der Rule, in dem die Trigger für die Rule definiert werden, entsprechend sieht der Code dennoch etwas anders aus. Du kannst über die UI eine Rule erzeugen und den yaml Code ersetzen. Der yaml Code enthält alles außer der rule UID, welche Du nachträglich auch nicht mehr ändern kannst und dem Label der Rule.

Code: Alles auswählen

configuration: {}
triggers:
  - id: "0"
    configuration:
      itemName: trocknerLeistung
    type: core.ItemStateChangeTrigger
conditions: []
actions:
  - inputs: {}
    id: script
    configuration:
      type: application/vnd.openhab.dsl.rule
      script: >
        if((newState as Number).intValue > 25) {
            (privateCache.remove('tTrockner') as Timer)?.cancel
            return;
        }

        if(privateCache.get('tTrockner')) === null)
            privateCache.put('tTrockner', createTimer(now.plusMinutes(4),[|
                Alexa_Esszimmer_Sprich.sendCommand('Der Wäschetrockner ist fertig')
                privateCache.remove('tTrockner')
            ]))
    type: script.ScriptAction
Einen Haken hat die UI-Version der Rule: Du musst für die Nutzung von Timern einen private Cache nutzen. Das habe ich im Code aber schon berücksichtigt.
Du kannst selbstverständlich die Rule auch mit JavaScript schreiben (das ist der Code, den Du weiter oben verwendet hast), aber da wäre meine Empfehlung, vielleicht gleich auf die grafische Variante Blockly auszuweichen, gerade Anfänger haben damit oftmals weniger Stress, weil die UI Dir "sagt", was Du alles ausfüllen musst. Der entstehende Code ist dann in den grafischen Teil und den "eigentlichen" Code unterteilt, so dass Du Dir den JavaScript Code prima als Beispiel anschauen kannst.
openHAB5.1.3 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime - LXC, 4 Kerne, 3 GByte RAM)
Hostsystem Proxmox VE 9.1.6 - AMD Ryzen 5 3600 6 Kerne, 12 Threads - 64 GByte RAM - ZFS Pools: Raid Z1, 3 x 20 TB HDD -> 40 TByte und Raid Z0-Mirrored 4 x 1 TByte NVMe -> 2 TByte

Lactobacillus
Beiträge: 170
Registriert: 1. Mär 2019 09:13
Answers: 0
Wohnort: Untergruppenbach BaWü

Re: Alexa Sprachausgabe

Beitrag von Lactobacillus »

Habe es nun mit VS Code eingetragen aber irgendwie spricht Alexa nichts wenn ich die Rule manuell auslöse in der UI

Benutzeravatar
Snatsch
Beiträge: 460
Registriert: 9. Jan 2021 22:55
Answers: 0

Re: Alexa Sprachausgabe

Beitrag von Snatsch »

Du hast diese Rule mit deinen geänderten Items (Alexa) und deinem Sprachdienst unter Rules abgespeichert ?

Code: Alles auswählen

var Timer sVolume = null
var Timer xVolume = null
rule "send MessageSay"
when
    Item MeldungSay received update
then
    
    if(MeldungSay.state == NULL || MeldungSay.state.toString == "") {
        logWarn("message","Item Meldung erhielt Update auf {}, keine Ausgabe möglich!",MeldungSay.state)
        return;
    }
    GoogleHomeMinni_Lautstarke.sendCommand(80)
    xVolume = createTimer(now.plusSeconds(2), [|
    val String strMessage = MeldungSay.state.toString
        say(strMessage, "voicerss:deDE")
    ])
        sVolume = createTimer(now.plusSeconds(10), [|
    GoogleHomeMinni_Lautstarke.sendCommand(50)
    ])


        
end
und du hast auch einen Sprachdienst wie zum Beispiel " voicers:deDE " installiert.
openhab5.1.1 auf Pi 5 8GB im Docker Portainer&Frontail /Grafana&InfluxDB und mosquitto auf Pi 3 in Docker Portainer/Pi 3 mit Docker zur Datensicherung / Pi 4 4GB Portainer & Deconz

Lactobacillus
Beiträge: 170
Registriert: 1. Mär 2019 09:13
Answers: 0
Wohnort: Untergruppenbach BaWü

Re: Alexa Sprachausgabe

Beitrag von Lactobacillus »

Snatsch hat geschrieben: 7. Mär 2026 19:19 Du hast diese Rule mit deinen geänderten Items (Alexa) und deinem Sprachdienst unter Rules abgespeichert ?

Code: Alles auswählen

var Timer sVolume = null
var Timer xVolume = null
rule "send MessageSay"
when
    Item MeldungSay received update
then
    
    if(MeldungSay.state == NULL || MeldungSay.state.toString == "") {
        logWarn("message","Item Meldung erhielt Update auf {}, keine Ausgabe möglich!",MeldungSay.state)
        return;
    }
    GoogleHomeMinni_Lautstarke.sendCommand(80)
    xVolume = createTimer(now.plusSeconds(2), [|
    val String strMessage = MeldungSay.state.toString
        say(strMessage, "voicerss:deDE")
    ])
        sVolume = createTimer(now.plusSeconds(10), [|
    GoogleHomeMinni_Lautstarke.sendCommand(50)
    ])


        
end
und du hast auch einen Sprachdienst wie zum Beispiel " voicers:deDE " installiert.
Habe ein Skript in den Rules getestet und da hat Alexa geblabbert items.getItem('Alexa_Esszimmer_Sprich').sendCommand('Der Wäschetrockner ist fertig')

Benutzeravatar
udo1toni
Beiträge: 15654
Registriert: 11. Apr 2018 18:05
Answers: 254
Wohnort: Darmstadt

Re: Alexa Sprachausgabe

Beitrag von udo1toni »

Gibt es Fehlermeldungen im Log?

Wenn Du die rules-Datei nutzt, wäre noch wichtig, dass die Variable var Timer tTrockner = null vor der ersten Rule definiert wird. Alle globalen Variablen müssen zu Beginn der Datei definiert werden.

Ach so... Welche exakte Version von openHAB nutzt Du?
openHAB5.1.3 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime - LXC, 4 Kerne, 3 GByte RAM)
Hostsystem Proxmox VE 9.1.6 - AMD Ryzen 5 3600 6 Kerne, 12 Threads - 64 GByte RAM - ZFS Pools: Raid Z1, 3 x 20 TB HDD -> 40 TByte und Raid Z0-Mirrored 4 x 1 TByte NVMe -> 2 TByte

Lactobacillus
Beiträge: 170
Registriert: 1. Mär 2019 09:13
Answers: 0
Wohnort: Untergruppenbach BaWü

Re: Alexa Sprachausgabe

Beitrag von Lactobacillus »

Hallo,

habe die Version OH 5.0.1 laufen. Bin leider Updatefaul weil es in der Vergangenheit öfter mal nicht funktioniert hatte.

Im Log kommt folgende Meldung: Script execution of rule with UID 'Trockner-1' failed: The name 'newState' cannot be resolved to an item or type; line 6, column 9, length 8 in Trockner

Benutzeravatar
udo1toni
Beiträge: 15654
Registriert: 11. Apr 2018 18:05
Answers: 254
Wohnort: Darmstadt

Re: Alexa Sprachausgabe

Beitrag von udo1toni »

Ja, stimmt, das ist korrekt, wenn Du die Rule ohne den echten Trigger startest.

newState gibt es nur, wenn die Rule durch ein Item received update Ereignis gestartet wurde - das beinhaltet auch Item changed, dabei erhält das Item ja ebenfalls ein Update.

Zum testen des Befehls als solchen musst Du entweder eine eigene Rule erstellen, in der nur der Sprachbefehl enthalten ist, oder Du musst das Item einmal mit einem passenden Wert beschreiben.
Wobei mir gerade auffällt, dass die Rule einen Fehler beinhaltet... :) weil die Messung ja immer aktiv ist, wird es vielleicht auch immer mal wieder Messfehler geben, so dass die Rule immer mal wieder meldet, dass der Trockner fertig ist, obwohl dieser niemals gestartet war.
Das sollte man unbedingt noch mit einbauen. Am einfachsten geht das mit einem zusätzlichen Item, welches dann signalisiert "der Trockner läuft" (ON) bzw. "der Trockner läuft nicht" (OFF), also ein Switch Item.
Nur wenn das Item OFF signalisiert und die Leistungsaufnahme über dem Schwellwert liegt, wird das Item auf ON gesetzt.
Nur wenn das Item ON signalisiert und der Schwellwert unterschritten ist, wird der Timer gestartet.
Nur wenn der Timer abläuft, wird die Meldung generiert und das Item auf OFF geschaltet.
So:

Code: Alles auswählen

// globale Variablen vor der ersten Rule in der Datei definieren!
var Timer tTrockner = null

rule "Trocker fertig"
when
    Item trocknerLeistung changed
then
    if((newState as Number).intValue > 25) {                                     // ON-Zustand erkannt
        if(trocknerAktiv.state != ON) trocknerAktiv.postUpdate(ON)               // Falls Zustand nicht ON, auf ON wechseln
        tTrockner?.cancel                                                        // Falls Timer existiert, abbrechen
        tTrockner = null                                                         // Zeiger auf Timer löschen
        return;                                                                  // rule abbrechen
    }
    if(tTrockner === null && trocknerAktiv.state == ON)                          // falls kein Timer und Zustand ON
        tTrockner = createTimer(now.plusMinutes(4),[|                            // erzeuge Timer
            Alexa_Esszimmer_Sprich.sendCommand('Der Wäschetrockner ist fertig')  // Melde Ende des Trocknungsvorgangs
            trocknerAktiv.postUpdate(OFF)                                        // und setze Zustand auf OFF
            tTrockner = null                                                     // Zeiger auf Timer löschen
        ])
end
openHAB5.1.3 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime - LXC, 4 Kerne, 3 GByte RAM)
Hostsystem Proxmox VE 9.1.6 - AMD Ryzen 5 3600 6 Kerne, 12 Threads - 64 GByte RAM - ZFS Pools: Raid Z1, 3 x 20 TB HDD -> 40 TByte und Raid Z0-Mirrored 4 x 1 TByte NVMe -> 2 TByte

Lactobacillus
Beiträge: 170
Registriert: 1. Mär 2019 09:13
Answers: 0
Wohnort: Untergruppenbach BaWü

Re: Alexa Sprachausgabe

Beitrag von Lactobacillus »

Hallo, bekomme es irgendwie nicht hin.

Es erscheint weiterhin die Meldung im Logviewer:

Code: Alles auswählen

Script execution of rule with UID 'Trockner-1' failed: The name 'newState' cannot be resolved to an item or type; line 8, column 9, length 8 in Trockner
Item ist dieses : AussenSteckdose_Momentanverbrauch

Benutzeravatar
udo1toni
Beiträge: 15654
Registriert: 11. Apr 2018 18:05
Answers: 254
Wohnort: Darmstadt

Re: Alexa Sprachausgabe

Beitrag von udo1toni »

Kannst Du mal Deine komplette Rule posten? Vielleicht ist da an anderer Stelle ein Tippfehler.
newState steht automatisch zur Verfügung, wenn die Rule per Item changed Ereignis getriggert wird.

Zu Not kannst Du newState auch durch AussenSteckdose_Momentanverbrauch.state ersetzen, das ist halt elend lang.
openHAB5.1.3 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime - LXC, 4 Kerne, 3 GByte RAM)
Hostsystem Proxmox VE 9.1.6 - AMD Ryzen 5 3600 6 Kerne, 12 Threads - 64 GByte RAM - ZFS Pools: Raid Z1, 3 x 20 TB HDD -> 40 TByte und Raid Z0-Mirrored 4 x 1 TByte NVMe -> 2 TByte

Antworten