[alexa-fhem | Custom Skills] Eure Setups

Begonnen von prodigy7, 28 Januar 2017, 13:59:09

Vorheriges Thema - Nächstes Thema

prodigy7

Hallo zusammen,

da eigene Skills (Custom Skills) bei alexa-fhem immer wieder ein Thema vieler Fragen ist, möchte ich dazu anregen, dass User die funktionierende Setups hinbekommen haben, Ihr Setup hier zu beschreiben und zu erklären. Oft ist es einfacher, anhand von Beispielen das abzuleiten was man möchte und zu verstehen als sich mühsam alles zusammen zu suchen muss. Würde mich hier über jedes "Mini-Tutorial" freuen!

Bitte nutzt für Fragen und Probleme die Threads und bleibt bitte hier beim wesentlichen Thema!
p7

baerbel

na dann mache ich mal den Anfang - ist kein Hexenwerk, der eine oder andere Stolperstein (über den ich gestolpert bin) habe ich auch kurz erwähnt, ohne hier eine direkt Schritt für Schritt Anleitung liefern zu wollen.

Also erstmal was zur Umgebung:

Provider - t-online
Externe ip: dyndns über strato IPV4
Erreichbarkeit von FHEM über das Internet: Portweiterleitung von TCP 3000-3000 auf 3000 auf einer Fritzbox eingerichtet
FHEM: SSL mit User/Passwort

daraus ergibt sich dann für mich folgende config.json:

{
    "alexa": {
        "name": "Alexa Produktiv",
        "keyFile": "./key.pem",
        "certFile": "./cert.pem",
        "applicationId": "amzn1.ask.skill.xxxxxxxxxxxxxxxxxxxxxxxxx",
        "oauthClientID": "amzn1.application-oa2-client.xxxxxxxxxxxxxxxxxxxxxxx"
    },

    "connections": [
        {
            "name": "FHEM",
            "server": "127.0.0.1",
            "auth": {
            "user": "<username>",
            "pass": "<passwort>"
             },
            "ssl":true,
            "port": "8083",
            "filter": "room=alexa"
        }
    ]
}



Meine "Stolpersteiner" - beides in AWS:

1. der Code wird nicht von "selbst" übertragen, dieser muss händisch übertragen werden - also copy & paste !!

const PORT=3000;
const HOST='<dyndns_name_externe_IP';


// entry
exports.handler = function(event, context, callback) {

  console.log(`EVENT: ${event}`);
  console.log(`CONTEXT: ${context}`);

  var post_data = JSON.stringify(event);

  var options = {
    hostname: HOST,
    port: PORT,
    //family: 6,
    //path: '/',
    method: 'POST',
    rejectUnauthorized: false, // accept self-signed
    headers: {
      'Content-Type': 'application/json',
      'Content-Length': Buffer.byteLength(post_data)
      }
    };

  var request = require('https').request(options, (result) => {
    console.log(`STATUS: ${result.statusCode}`);
    console.log(`HEADERS: ${JSON.stringify(result.headers)}`);
    result.setEncoding('utf8');
    var body = '';
    result.on('data', (chunk) => body += chunk);
    result.on('end', () => {
      console.log(`BODY: ${JSON.stringify(body)}`);
      callback(null, JSON.parse(body) );
      return;
    });
  });

  request.on('error', (e) => {
    console.log(`problem with request: ${e.message}`);
    callback(null, createError(ERROR_TARGET_OFFLINE) );
    return;
  });

  request.write(post_data);
  request.end();

  return;

}// exports.handler


2. Trigger -

Es muss ein "Alexa Smart Home skill" in aws zu sehen sein und dann ein "Alexa Skills Kit"

Gerne ergänze ich weitere Angaben - ist aber so dass, was für mich hängengeblieben ist wo es gezwickt hat.

Grüße - Bernd

Ma_Bo

Vielleicht hat ja jemand ne config.json als Beispiel, in der mehrere Custom Skills mit default Room beschrieben sind, sowas suche ich gerade.

P.S. @prodigy7: die Links sind falsch herum, wenn ich auf den Link mit Probleme klicke, komm ich bei dem für Smrt Home Skill aus. ;)
NUC mit FHEM, HM Heizungsthermostate, HM Wandthermostate, Intertechno Funksteckdosen, 10" Tablet als Wanddisplay, KeyMatic, Fensterkontakte, Fensterkontakte umgebaut als Wassermelder und Briefkastenmelder, Aussenthermostat, Anwesenheitssteuerung über Fritz Box, Google Home usw. usw.

bene_dicere

Schade, dass es hier noch nicht mehr content gibt.

Ich habe das Custom Skill eingerichtet, jedoch habe ich noch nicht wirklich das homebridgeMapping durchblickt.  :-[

Wenn ich ein Gerät mit dem folgenden Befehl anspreche:
"Alexa, sage <Custom Skill Invocation Name>:...."
Bekomme ich nur eine Antwort, dass keine Geräte vorhanden sind.

Beispielsweise würde ich gerne wie im Wiki (https://wiki.fhem.de/wiki/Alexa-Fhem) einen Wecker einbinden, die Rolladen öffnen ohne eine prozentuale Angabe oder meine Hue Lampen in einer bestimmten Farbe leuchten lassen.

Das sind meine Einträge aus dem Alexa Device in FHEM und analog dazu habe ich auch die Einstellungen für das Custom Skill vorgenommen.

alexaMapping
#Characteristic=<name>=<value>,...
On=verb=schalte,valueOn=an;ein,valueOff=aus,valueToggle=um

Brightness=verb=stelle,property=helligkeit,valuePrefix=auf,values=AMAZON.NUMBER,valueSuffix=prozent

Hue=verb=stelle,valuePrefix=auf,values=rot:0;grün:128;blau:200
Hue=verb=färbe,values=rot:0;grün:120;blau:220

Saturation=verb=stelle,property=sättigung,valuePrefix=auf,values=AMAZON.NUMBER
Saturation=verb=sättige,values=AMAZON.NUMBER

TargetPosition=verb=mach,articles=den,values=auf:100;zu:0
TargetPosition=verb=stelle,valuePrefix=auf,values=AMAZON.NUMBER,valueSuffix=prozent

TargetTemperature=verb=stelle,valuePrefix=auf,values=AMAZON.NUMBER,valueSuffix=grad

Volume:verb=stelle,valuePrefix=auf,values=AMAZON.NUMBER,valueSuffix=prozent

#Weckzeit=verb=stelle,valuePrefix=auf;für,values=AMAZON.TIME,valueSuffix=uhr


alexaTypes
#Type=<alias>[,<alias2>[,...]]
light=licht,lampen
blind=rolladen,rolläden,jalousie,jalousien,rollo,rollos


fhemIntents
#IntentName=<sample utterance>
gutenMorgen=guten morgen
guteNacht=gute nacht


Vielleicht hat ja jemand von euch schon was umgesetzt und kann mich ein wenig unterstützen. Leider habe ich mit homebridgeMapping noch gar nichts gemacht und bisher auch keine einfache Erklärung für Anfänger mit Beispielen gefunden.

Bin für jede Unterstützung dankbar.  :D

Romoker

#4
@bene_dicere

Ein FHEM-Objekt wird erst dann als Alexa-Gerät erkannt, wenn es einem FHEM-Room zugeordnet ist, der im Filter-Parameter der alexa-fhem-Konfigurationsdatei config.json spezifiziert ist. Der Filter ist ein Regulärer Ausdruck, z.B.
"filter": "room=alexa|Sonos|Heizungssteuerung"

Viele Grüße
BeagleBoneBlack & Raspberry Pi 4; FB7490; div. Homematic Komponenten; CUL433: CUL_TX, Conbee II, SOMFY, 1-Wire, Z-Wave, Zigbee, SmartPlugs von Sonoff und Shelly mit MQTT

bene_dicere

Zitat von: Romoker am 10 Februar 2017, 15:18:48
@bene_dicere

Ein FHEM-Objekt wird erst dann als Alexa-Gerät erkannt, wenn es einem FHEM-Room zugeordnet ist, der im Filter-Parameter der alexa-fhem-Konfigurationsdatei config.json spezifiziert ist. Der Filter ist ein Regulärer Ausdruck, z.B.
"filter": "room=alexa|Sonos|Heizungssteuerung"

Viele Grüße

das habe ich auch und funktioniert vom Prinzip auch.
Ich kann auch Alexa mit dem folgenden Befehl ansprechen und sie sagt mir den Status von allen Geräten im "config.json Raum".

Alexa, frage <Custom Skill Invocation Name> Status alternativ kann ich noch ein Gerätenamen nachfolgend nennen, wie z.B. Rolllade.

Das ganze funktioniert auch nur in genau dieser Reihenfolge, füge ich zb noch ein Pronomen hinzu, gehört es direkt zu den dingen die Alexa nicht weiß.


Jedoch kann ich nichts einstellen/ändern.

Alexa, sage <Custom Skill Invocation Name> Stelle Weckzeit auf Neunzehn Uhr.
Als Beispiel zu dem oben stehenden Befehl, bekomme ich die nachstehende Antwort ca.5x in Schleife
Zitatich kann undefined nicht auf schalten
und dann noch 1x
Zitatauf um gestellt
aber es passiert nichts.

Stelle ich jetzt aber beispielsweise eine Weckzeit in FHEM ein sagt sie mir wenn ich nach dem allgemeinen Statusfrage
ZitatWeckzeit steht auf xx Uhr
jedoch kann ich auch nach der Weckzeit nicht explizit fragen.

Ma_Bo

#6
Wenn man 2 (oder mehr) Custom Skills verwenden möchte
Damit kann man z.B. sagen:

ZitatAlexa sage Fernseher schalte ARD ein
oder
ZitatAlexa sage Badzimmer schalte Licht aus
usw...

Dazu muss der Invocation Name der Custom Skills bei Skill1 dann Fernseher heißen und bei Skill2 dann Badezimmer heißen usw...
Das ist natürlich jedem selber überlassen wie er die Skills nennt.

Folgendes in die config.json eintragen:

Zitat{
    "alexa": {
        "name": "Alexa TEST",
        "keyFile": "./key.pem",
        "certFile": "./cert.pem",
        "nat-upnp": false,
        "applicationId": [ "amzn1.ask.skill.111..." , "amzn1.ask.skill.222..." ],
        "oauthClientID": "amzn1.application-oa2-client.xxx"
  },
   
    "connections": [
        {
            "name": "FHEM",
            "server": "192.xxx.xxx.xx",
            "port": "8083",
            "filter": "room=Alexa"
        }
    ]
}


Rot markierte Stellen müssen auf die eigene Umgebung angepasst werden.

oauthClientID ist vom Smart Home Skill

und

applicationId ist von den Custom Skills




In Bezug auf das hier (alexa-fhem Version 0.2.0) https://forum.fhem.de/index.php/topic,60244.msg540117.html#msg540117 :

Zitatedit 2017-02-10:
- fhem intents der art
  {meineSub()}=guten morgen und set|get|attr <device> xyz=gute nacht
  sind jetzt möglich. die rückgabe des jeweiligen kommandos wird als antwort für alexa verwendet
  d.h man kann damit beliebige texte aus fhem an alexa zurück geben.

habe ich es so gelöst (gibt bestimmt elegantere Wege, aber dieser funktioniert):

Im Alexa device steht unter fhemIntents

{alexa_guten_morgen()}=guten morgen
{alexa_gute_nacht()}=gute nacht


Dann natürlich ein

get <Alexadevice> intercationModel

und die Ergebnisse in Intent Schema und Sample Utterances im Custom Skill (oder in mehreren Custom Skills) eintragen und speichern.

Nun habe ich mir eine eigene 99_Alexa_Sprache_Utils.pm angelegt, dazu einfach auf EDIT FILES dann auf die myUtilsTemplate.pm klicken und folgenden Text einfügen


Zitatpackage main;
use strict;
use warnings;
use POSIX;
sub
Alexa_Sprache_Utils_Initialize($$)
{
   my ($hash) = @_;
}
##### Start guten morgen
sub
alexa_guten_morgen()
{
fhem "set Alexa_Guten_Morgen_dummy on";
return "Guten Morgen, was kann ich für dich tun";
}
#####Ende guten morgen
#
##### Start gute nacht
sub
alexa_gute_nacht()
{
fhem "set Alexa_Guten_Morgen_dummy off";
return "Gute Nacht, wir hören uns morgen wieder";
}
#####Ende gute nacht
1;

Ich habe vor dem "return ....." noch einen Dummy von mir geschaltet, das kann man anpassen oder die ganze Zeile einfach löschen, dann kommt nur ein Sprachrückmeldung.

(Achtung die Datei muss so aussehen "...Utils.pm" damit diese dann auch unter EDIT FILES zu finden ist <---- Das orange markierte muss am Ende des Namens der zu speichernden Datei stehen)
Jetzt neben SAVE AS den Namen 99_Alexa_Sprache_Utils.pm eingeben (Achtung, wollt ihr einen anderen Namen verwenden, muss dieser auch im Inhalt der Datei angepasst werden (siehe roter Text)) und auf SAVE AS klicken.

Zur Sicherheit ein "reload 99_Alexa_Sprache_Utils.pm" in der FHEM Eingabezeile und
die Alexa Bridge (alexa-fhem Version 0.2.0) einmal neustarten.
Nun sollte mit

"Alexa sage FHEM guten morgen" eine Antwort mit "Guten Morgen, was kann ich für dich tun" folgen und der Dummy eingeschaltet werden.
und mit
"Alexa sage FHEM gute nacht" eine Antwort mit "Gute Nacht, wir hören uns morgen" folgen und der Dummy ausgeschaltet werden.

Das ganze kann man jetzt nach belieben erweitern.




Ein Update der alexa-fhem von 0.1.9 auf 0.2.0 habe ich wie folgt gemacht:

Datei von hier heruntergeladen : https://forum.fhem.de/index.php/topic,60244.msg540117.html#msg540117

auf meinem Mac entpackt (sollte bei Windoo... genau so gehen), alexa-fhem gestoppt, dann folgende Dateien im alexa-fhem Ordner auf meinem Pi umbenannt:

Die Datei: package.json in package.json_original
und den Ordner: lib in lib_original

somit hat man, falls was schief geht immer noch eine funktionierende Backuplösung.

Dann die neu heruntergeladenen Dateien auf den Pi kopieren:

Die Datei: package.json
und den Ordner: lib

und alexa-fhem zur Kontrolle auf der Console gestartet und geschaut ob die richtige Version läuft.

Edit1: Folgendes steht im Wiki für das Update der alexa-fhem:

ZitatUpdate
Hier wir das Update auf eine neue Version von Alexa-Fhem beschrieben

Das Verzeichnis alexa-fhem im Hauptverzeichnis von FHEM (typischerweise /opt/fhem) umbenennen in alexa-fhem.old.
Die tgz-Datei der neuen Alexa-Fhem-Version unter Linux im Hauptverzeichnis von FHEM (typischerweise /opt/fhem) entpacken (nicht unter Windows, das zerstört die Rechteeinstellungen).
Das dabei entstandene Verzeichnis package in alexa-fhem umbenennen, in das Verzeichnis wechseln
Mit
npm install
alle Abhängigkeiten installieren (kein sudo!).
Die Zertifikatsdateien key.pem und cert.pem aus dem alten Verzeichnis alexa-fhem.old ins neue Verzeichnis alexa-fhem kopieren.
Natürlich dann den Dienst neu starten, auch müssen selbstredend irgendwelche Modifikationen an der Datei server.js in der neuen Version nachgezogen werden. Wenn alles läuft, kann das alte Verzeichnis alexa-fhem.old gelöscht werden.
 

Grüße Marcel
NUC mit FHEM, HM Heizungsthermostate, HM Wandthermostate, Intertechno Funksteckdosen, 10" Tablet als Wanddisplay, KeyMatic, Fensterkontakte, Fensterkontakte umgebaut als Wassermelder und Briefkastenmelder, Aussenthermostat, Anwesenheitssteuerung über Fritz Box, Google Home usw. usw.

Esjay

#7
Hey Marcel,
danke das du deine Lösung geteilt hat.Habe es probiert, und es funktioniert soweit. Du hast allerdings einen kleinen Schnitzer in deiner 99_Alexa_Sprache_Utils.pm.

sub
alexa_guten_morgen()
{
fhem "set Alexa_Guten_Morgen_dummy on";
return "Guten Morgen, was kann ich für dich tun";
}
#####Ende guten morgen
#
##### Start gute nacht
sub
alexa_guten_morgen()
{
fhem "set Alexa_Guten_Morgen_dummy off";
return "Gute Nacht, wir hören uns morgen wieder";
}
#####Ende gute nacht
1;


Du nutzt jeweils die gutenMorgen sub.

Hab mich gerade gewundert, warum mir Alexa eine Gute Nacht wünscht, wenn ich Guten morgen sage.

Nochmal danke fürs Bereitstellen.

Romoker

@bene_dicere:

Wie ist Dein FHEM-Device "Weckzeit" definiert? Im FHEMWiki ist ein Wecker (https://wiki.fhem.de/wiki/Alexa-Fhem#Wecker) sehr gut erklärt. Liefere mal ein FHEM-Listing von Deinem Device, z.B. mit:
list Weckzeit

Hast Du nach der FHEM-Konfiguration die Konfiguration vom Interaction Model des Custom Skills in amazon.developer nachgezogen?

Hinweis: dieser Thread sollte nur funktionierende Custom Skills Setups enthalten. Konfigurationsprobleme werden hier besprochen: https://forum.fhem.de/index.php/topic,60244.0.html

BeagleBoneBlack & Raspberry Pi 4; FB7490; div. Homematic Komponenten; CUL433: CUL_TX, Conbee II, SOMFY, 1-Wire, Z-Wave, Zigbee, SmartPlugs von Sonoff und Shelly mit MQTT

Ma_Bo

@Esjay, Danke, da hatte sich der Fehlerteufel eingeschlichen, hab es korrigiert...


Gesendet von iPhone mit Tapatalk
NUC mit FHEM, HM Heizungsthermostate, HM Wandthermostate, Intertechno Funksteckdosen, 10" Tablet als Wanddisplay, KeyMatic, Fensterkontakte, Fensterkontakte umgebaut als Wassermelder und Briefkastenmelder, Aussenthermostat, Anwesenheitssteuerung über Fritz Box, Google Home usw. usw.

bene_dicere

#10
Zitat von: Romoker am 12 Februar 2017, 11:52:02
@bene_dicere:

Wie ist Dein FHEM-Device "Weckzeit" definiert? Im FHEMWiki ist ein Wecker (https://wiki.fhem.de/wiki/Alexa-Fhem#Wecker) sehr gut erklärt. Liefere mal ein FHEM-Listing von Deinem Device, z.B. mit:
list Weckzeit

Hast Du nach der FHEM-Konfiguration die Konfiguration vom Interaction Model des Custom Skills in amazon.developer nachgezogen?

Hinweis: dieser Thread sollte nur funktionierende Custom Skills Setups enthalten. Konfigurationsprobleme werden hier besprochen: https://forum.fhem.de/index.php/topic,60244.0.html


Danke für deine Unterstützung, hatte den Fehler in der Zwischenzeit schon gefunden. Habe das Weckzeit_prefix nicht mit eingetragen.
Falls es trotzdem jemanden interessiert (habe es aus dem Wiki):


Internals:
   CFGFN
   NAME       Alexa.Weckzeit
   NR         77310
   STATE      11:45
   TYPE       dummy
   Readings:
     2017-02-12 15:37:19   state           11:45
Attributes:
   alexaName  weckzeit
   alexaRoom  alexa
   genericDeviceType clock
   group      AlexaGeräte
   homebridgeMapping Weckzeit=state,cmd=+
   room       alexa
   setList    Weckzeit:time


Leider verstehe ich noch immer nicht so wirklich das HomebridgeMapping und was dadurch passiert. gibt es vll irgendwo ne Anleitung mit ein paar Beispielen an denen man es nachvollziehen kann?

Thyraz

Alexa fragen was gerade im Radio läuft

In fhemIntents hinzugefügt:

{currentRadioTitle()}=was läuft gerade im radio
{currentRadioTitle()}=was gerade im radio läuft


In der 99_myUtils.pm:

sub currentRadioTitle() {
my $title = ReadingsVal("AV_Receiver", "currentTitle", "");
return $title;
}


Damit kann ich jetzt auf 2 Wege den aktuellen Titel ausgeben lassen, der im Radio läuft:
Computer, starte SmartHome -> Was läuft gerade im Radio
oder
Computer, frage SmartHome was gerade im Radio läuft.
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

Roman

#12
Hallo zusammen,

ich wollte hier auch noch mal meine Lösung für fhemIntents vorstellen.

Ich finde es lästig, für jeden fhemIntent eine eigene sub in dem 99_myUtils.pm zu erstellen und habe das mit einer Parameterübergabe gelöst.

Beispiel von fhemIntents
#IntentName=<sample utterance>
{Alexacmd ("gutenmorgen")}=guten morgen
{Alexacmd ("guteNacht")}=gute nacht
{Alexacmd ("tvlauter")}=Fernseher lauter
{Alexacmd ("tvleiser")}=Fernseher leiser
{Alexacmd ("tvprgup")}=Fernseher nächstes Programm
{Alexacmd ("tvprgdown")}=Fernseher vorheriges Programm
{Alexacmd ("tverstes")}=Fernseher das erste
{Alexacmd ("tvzweites")}=Fernseher das zweite
{Alexacmd ("tvsateins")}=fernseher sat eins
{Alexacmd ("tvaus")}=fernseher aus


und das passende sub in der 99_my_Utils
sub Alexacmd {

my $Command = $_[0];
my $ALEXAReturn = "OK";
my $FHEMCommand = "set Dummy_test no_alexa_action";  # falls kein passendes Kommando gefunden wird

fhem("set Dummy_test $Command");    # nur zur Kontrolle um zu sehen was ankommt
$Command =~ s/fhemIntent: //;           # das reine Intent extrahieren

my %Alexakommando = (
"gutenmorgen" => "set Dummy_Test guten morgen; Guten Morgen, was kann ich für dich tun",
"tvlauter" => "set LGTV remoteControl volumeUp ;ich habe den fernseher lauter gestellt",
"tvleiser" => "set LGTV remoteControl volumeDown; ich habe den fernseher leiser gestellt",
"tvprgup" => "set LGTV channelUp;OK",
"tvprgdown" => "set LGTV channelDown; OK",
"tverstes" => "set LGTV channel 1; OK",
"tvzweites" => "set LGTV channel 2; OK",
"tvsateins" => "set LGTV channel 3; OK",
"tvaus" => "set LGTV remoteControl power; ich habe den fernseher ausgeschaltet"
);
($FHEMCommand,$ALEXAReturn) = split (/;/, $Alexakommando{$Command});
fhem("$FHEMCommand");
return "$ALEXAReturn";
};


die Variable %Alexakommando kann dann mit beliebig vielen fhemIntents gefüllt werden, Format sollte selbsterklärend sein
fhemInten => <fhemKommando> ; Alexa Antwort
evtl. könnte man das Semikolen als Trenner zwischen fhemKommando und Alexa Antwort ändern falls man mehrere Kommandos ausführen will , dann einfach das Semikolon durch einen anderen Trenner ersetzen und im split ändern.

Gruß
Roman

RaspiCOC

#13
Trivial, aber morgens sehr hilfreich... Kurz mal fragen, ob die S-Bahn pünktlich ist...

sub sbahnstatus() {
my $bahnoutput1_1 = "Die nächste S Bahn nach XYZ mit der planmäßigen Abfahrt um ";
my $bahnoutput1_2 = " Verspätung";
my $bahnoutputminuten = " Minuten ";
my $bahnoutputminute = " Minute ";
my $bahnuhrhat = " Uhr hat ";
my $bahnabfahrtszeit1 = ReadingsVal("BAHN", "plan_departure_1", "");
my $bahnabfahrtszeit2 = ReadingsVal("BAHN", "plan_departure_2", "");
my $bahnoutputeine = "eine ";
my $delay1 = ReadingsVal("BAHN", "plan_arrival_delay_1", "");
my $delay2 = ReadingsVal("BAHN", "plan_arrival_delay_2", "");
my $bahnoutput2_1 = " Die nachfolgende S Bahn nach XYZ mit der planmäßigen Abfahrt um ";
my $speech = "";
my $bahnzeit2 = " unbekannte ";
my $delayspeech1 = "Fehler";
my $delayspeech2 = "Fehler";
my $delayspeechsubstr1 = "";
my $delayspeechsubstr2 = "";

    use Switch;
    switch ($delay1) {
    case "none" { $delayspeech1 = "keine Verspätung."; }
    case "+0"         { $delayspeech1 = "keine Verspätung."; }
case "+1"         { $delayspeech1 = "eine Minute Verspätung."; }
    else         { $delayspeechsubstr1 = substr($delay1, 1, 1);
  $delayspeech1 = $delayspeechsubstr1 . $bahnoutputminuten . $bahnoutput1_2; }
    }

    switch ($delay2) {
    case "none" { $delayspeech2 = "keine Verspätung."; }
    case "+0"         { $delayspeech2 = "keine Verspätung."; }
case "+1"         { $delayspeech2 = "eine Minute Verspätung."; }
    else         { $delayspeechsubstr2 = substr($delay1, 1, 1);
  $delayspeech2 = $delayspeechsubstr2 . $bahnoutputminuten . $bahnoutput1_2; }
}

$speech = $bahnoutput1_1 . $bahnabfahrtszeit1 . $bahnuhrhat . $delayspeech1 . $bahnoutput2_1 . $bahnabfahrtszeit2 . $bahnuhrhat . $delayspeech2;
return $speech;
}


Angesagt wird im Augenblick nur die nächste S-Bahn. Aber, wie man sieht sind die Vorbereitungen für die Nachfolgende schon im Gange.

Jetzt mit nächster und übernächster S-Bahn.

Und entsprechendes für den Müll...

sub nextrestmuelldate() {
my $tage_bis_restmuell = ReadingsVal("Abfall", "Abfall_Restmuell2woe_tage", "");
my $tage_bis_gelbersack = ReadingsVal("Abfall", "Abfall_GelberSack_tage", "");
    my $tag_restmuell = ReadingsVal("Abfall", "Abfall_Restmuell2woe_wochentag", "");
my $tag_gelbersack = ReadingsVal("Abfall", "Abfall_GelberSack_wochentag", "");
my $output_restmuell = "";
my $output_gelbersack = "";
my $muell_output = "";

    use Switch;

switch ($tage_bis_restmuell) {
    case [0] { $output_restmuell = "Der Restmüll wird heute abgeholt.";}
case [1..6] { $output_restmuell = "Der Restmüll wird am kommenden " . $tag_restmuell . "abgeholt.";}
case [7] { $output_restmuell = "Der Restmüll wird am nächsten " . $tag_restmuell . "abgeholt.";}
    else { $output_restmuell = "Der Restmüll wird am übernächsten " . $tag_restmuell . " abgeholt.";}
    }

switch ($tage_bis_gelbersack) {
    case [0] { $output_gelbersack = "Der gelbe Sack wird heute abgeholt.";}
case [1..6] { $output_gelbersack = "Der gelbe Sack wird am kommenden " . $tag_gelbersack . "abgeholt.";}
    case [7] { $output_gelbersack = "Der gelbe Sack wird am nächsten " . $tag_gelbersack . "abgeholt.";}
else { $output_gelbersack = "Der gelbe Sack wird am übernächsten " . $tag_gelbersack . " abgeholt.";}
    }

$muell_output = $output_restmuell . "   " . $output_gelbersack;

return $muell_output;
}


Letzteres noch quick and dirty. Könnte natürlich auch sagen "wir heute abgeholt".

Jetzt für gelben Sack und Restmüll und auch grammatikalisch korrekt!

Die switch-anweisung benötigt das Perl-Modul SWITCH. Wer es nicht hat, kann es wie folgt nachinstallieren:

sudo apt-get install libswitch-perl

So langsam findet auch meine Frau Alexa prima!

oli82

Zitat von: Roman am 15 Februar 2017, 21:48:58
und das passende sub in der 99_my_Utils
Wenn ich den Code in meine my_Utils übernehme erhalte ich folgenden Fehler:
Global symbol "%Alexakommando" requires explicit package name (did you forget to declare "my %Alexakommando"?) at ./FHEM/99_myUtils.pm line 142
Problem ist nur: ein %Alexakommando ist bei mir gar nicht vorhanden...