Alexa führt das Sript nicht aus - bzw. kein start meiner Programme

Begonnen von Karsiacar, 08 Januar 2025, 17:15:45

Vorheriges Thema - Nächstes Thema

Karsiacar

Hallo an euch,

wünsche ein "Fohes Neues"

Hab mir was gebastelt ... ein Script, dass in Linux PopOS irgendwelche Programme über mqtt öffnet. Mqtt läuft auf einem Pi, wie fhem auch. In fhem habe ich Geräte angelegt. Hier dann bei einem
set gnome_teminal_start startöffnet die Konsole auf dem Linuxrechner. Bis hier hin alles gut. Das Problem ist, dass Alexa ihr alexaNamen- Attribut nicht er/kennt. In der App, wo das Gerät auch angezeigt wird, funktioniert das Schalten auch nicht. Hier seh ich aber ein "Warte auf MQTT_Device" aufploppen. MQTT kommuniziert - händisch geht´s ja. Kann da bitte jemand helfen?

defmod gnome_teminal_start MQTT2_DEVICE
attr gnome_teminal_start userattr start
attr gnome_teminal_start IODev MQTT
attr gnome_teminal_start alexaName terminal
attr gnome_teminal_start alexaRoom Büro
attr gnome_teminal_start alias terminal
attr gnome_teminal_start eventMap ein:auf an:öffne
attr gnome_teminal_start genericDeviceType blind
attr gnome_teminal_start setList start popos/commands open_terminal
attr gnome_teminal_start stateFormat state

manche Attribute sind überflüssig aber n Versuch wars wert. Fehlt villeicht ein bestimmtes?

Grüße Karsten





passibe

Da fehlt ein homebridgeMapping, das Alexa sagt, wie es mit dem "Rollladen" interagieren soll. Hab leider keine Rollos, die ich über alexa-fhem steuere, deshalb kann ich da kein Beispiel liefern – aber du könntest einfach mal ein bisschen hier im Forum suchen und rumprobieren.
Weiß auch nicht, ob dieser "hack", das als Rollo zu deklarieren funktioniert, vielleicht musst du auch ein fake pct-Reading o.ä. hinzufügen, damit alexa zufrieden ist.

Vielleicht reicht aber auch schon was ganz stupides wie
TargetPosition:pct,cmd=startim homebridgeMapping. Eventuell noch mit "clear" davor?

Was beim austüfteln des homebridgeMappings hilft, ist, nach jedem reload von alexa-fhem (den man ja sowieso machen muss, damit Alexa das geänderte Mapping kennt) einen Blick ins Log zu werfen, um zu sehen welche Characteristics da übermittelt wurden.

Was aber sicherlich viel viel einfacher wäre, wäre das device schlicht als Schalter zu deklarieren und dann über eine Routine dein gewünschtes Sprachkommando abzubilden.
Also irgendwie:
attr gnome_teminal_start genericDeviceType switch
attr gnome_terminal_start homebridgeMapping On=state,valueOn=start,valueOff=start,cmdOn=start,cmdOff=abc
(Ggfs. valueOn und valueOff anpassen, falls dir das Ding irgendeine Rückmeldung gibt. Aber ist, denke ich, hier einfach egal, weil es dir ja eh nicht darum geht, den Status über alexa auszulesen, sondern nur um das starten. Das macht cmdOn für dich ganz unabhängig vom Status, den Alexa "sieht".)

Dann eine neue Routine anlegen, die auf "Alexa öffne Terminal" hört und dann dort sagen, der Schalter "Terminal" soll eingeschaltet werden, fertig.
Oder ohne Routine könntest du dann einfach "Alexa schalte Terminal ein" sagen.

TomLee

Zitat von: Karsiacar am 08 Januar 2025, 17:15:45Hab mir was gebastelt ... ein Script, dass in Linux PopOS irgendwelche Programme über mqtt öffnet. Mqtt läuft auf einem Pi, wie fhem auch. In fhem habe ich Geräte angelegt.

Hallo,
bei den Geräten kommt doch eh keine Rückmeldung, oder?
Du nutzt MQTT nur dafür, über dein Skript mit unterschiedlichen payloads (hier die payload open_terminal) irgendwelche "Programme" zu öffnen?
Für jede payload hast einzelne MQTT2_DEVICE-Definitionen angelegt?

Sowas würd ich dann gleich mit einem pct.-/brightness-setter, in einem Device, ohne homebridgemapping-Gedöhns umsetzen:

defmod gnome_teminal_start MQTT2_DEVICE
attr gnome_teminal_start alexaName terminal
attr gnome_teminal_start setList pct:slider,1,1,100 {my $p2c=p2c($EVTPART1);;fhem("sleep 0.1;;setreading $NAME state $p2c;;setreading $NAME pct $EVTPART1");;return "popos/commands $p2c"}

setstate gnome_teminal_start open_terminal
setstate gnome_teminal_start 2025-01-09 08:38:50 MQTT
setstate gnome_teminal_start 2025-01-09 11:48:45 pct 1
setstate gnome_teminal_start 2025-01-09 11:48:45 state open_terminal

sub p2c {
my $evt1 = shift;

my %p2c = (
        1 => 'open_terminal',
        2 => 'bli'),
        3 => 'bla';
        my $command = $p2c{$evt1};

        return if !$command;
        return "$command";
}

Für jeden pct-Wert legt man dann eine Routine an.



Wenn es möglich ist, die Programme, die das Skript aufruft, von FHEM ausführbar zu machen, braucht man den Umweg über MQTT nicht.
Dazu eignet sich aber meiner Erfahrung nach eine MQTT2_DEVICE-Definition am besten, weil man Perl in der setList nutzen kann:

defmod gnome_teminal_start MQTT2_DEVICE
attr gnome_teminal_start alexaName terminal
attr gnome_teminal_start setList pct:slider,1,1,100 {p2c($EVTPART1);;fhem("sleep 0.1;;setreading $NAME pct $EVTPART1");;return undef}

setstate gnome_teminal_start 2025-01-09 12:23:33 IODev MQTT
setstate gnome_teminal_start 2025-01-09 12:23:59 pct 1



sub p2c {
my $evt1 = shift;

my %p2c = (
        1 => "Programm1",
        2 => 'Programm3');
        my $command = $p2c{$evt1};

        return if !$command;
        return system("$command &");
}

Gruß Thomas

MadMax-FHEM

Zitat von: TomLee am 09 Januar 2025, 12:53:14Für jeden pct-Wert legt man dann eine Routine an.
Wenn man eh schon in fhem Perl subs unterwegs ist ginge das auch ohne MQTT, also zumindest in Richtung Alexa...
Da reicht (und so habe ich das) ein "Lampen-dummy" und ein notify was dann pro pct/dim Wert eben entsprechende Befehle ausführt oder mqtt-Nachrichten verschickt oder oder oder...

Und dann genau wie vorgeschlagen einfach Routinen anlegen.
Dort kannst du in der Alexa-App festlegen was du sagen willst (es gehen auch mehrere Sätze pro Routine 8)  ) und am Ende dann den dafür angedachten pct/dim Wert bei der "Lampe" setzen.
Das notify (meinetwegen auch DOIF) erledigt den Rest :)

Gruß, Joachim

P.S.: Routinen sind die einzige Möglichkeit (beim Smarthome Skill/fhem Skill) festzulegen was man sprechen will. Ansonsten ist man gebunden an das was laut Amazon/Alexa die jeweiligen Gerätetypen "können" (bzw. Alexa diesbezüglich versteht). Auch ein homebridgeMapping kann da nichts hinzu erfinden (nicht, dass das hier der Fall wäre bei den Vorschlägen, aber es wird immer wieder geglaubt).

Es gibt halt (sehr) viele Wege ;)
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Karsiacar

Sorry, für die späte Rückmeldung. Es lag an mehreren Faktoren. Ja die Attribute, ein Kreuz damit zu spielen - werden nicht unbedingt in die App übernommen oder richtig interpretiert und du gehst zum nächsten Attr. obwohl die Kombi die Richtige war. Aber auch Rechte, verfahrene Log_Wege, der richtige alexaName, der alexaRoom(muuste gesetzt werden) ... und halt keine Ahnung von der Materie. Am Ende hätte ich halt auch nicht unbedingt das Terminal zum testen nehmen sollen.

defmod orca_start MQTT2_DEVICE
attr orca_start userattr start
attr orca_start IODev MQTT
attr orca_start alexaName Orca
attr orca_start alexaRoom sonos
attr orca_start alias Orcaslicer
attr orca_start genericDeviceType switch
attr orca_start homebridgeMapping On=state,valueOn=start,cmdOn=start
attr orca_start setList start popos/commands open_orca
attr orca_start stateFormat state


#!/bin/bash

export DISPLAY=:0
eval $(dbus-launch)

LOG_DIR="/home/k-si-o/scripts/logs"
mkdir -p "$LOG_DIR"  # Sicherstellen, dass das Log-Verzeichnis existiert
MAIN_LOG="$LOG_DIR/mqtt_program_start.log"
MQTT_LOG="$LOG_DIR/mqtt_sub.log"

exec > >(tee -a "$MAIN_LOG") 2>&1

# MQTT-Einstellungen
MQTT_BROKER="192.168.178.78" 
MQTT_PORT=1883
MQTT_TOPIC="popos/commands"
MQTT_USER=""
MQTT_PASS=""


log_message() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1"
}

start_program() {
    local cmd="$1"
    local log_file="$LOG_DIR/$2.log"

    log_message "Starte: $cmd (Log: $log_file)"
    nohup bash -c "$cmd" &>> "$log_file" &
    log_message "$2 gestartet (PID: $!)"
}


execute_command() {
    case "$1" in
        open_terminal)
            start_program "gnome-terminal -- bash -i" "gnome_terminal"
            ;;
        open_orca)
            start_program "/home/k-si-o/scripts/orca-slicer-launcher.sh" "orca_slicer"
            ;;
        *)
            log_message "Unbekannter Befehl: $1"
            ;;
    esac
}

log_message "Starte MQTT-Listener auf $MQTT_BROKER:$MQTT_PORT (Thema: $MQTT_TOPIC)"
mosquitto_sub -h "$MQTT_BROKER" -p "$MQTT_PORT" -t "$MQTT_TOPIC" | tee -a "$MQTT_LOG" | while read -r message; do
    log_message "Empfangen: $message"
    execute_command "$message"
done

Danke jedenfalls für euer Zutun - die nächste Idee kommt :)
Grüße Karsten