FHEM Forum

FHEM => Automatisierung => Thema gestartet von: Ronald am 27 Februar 2017, 21:50:13

Titel: [gelöst] Radio Kanäle toggeln
Beitrag von: Ronald am 27 Februar 2017, 21:50:13
Hallo,

ich versuche mit notify kanäle durchzutoggeln, klappt aber noch nicht.
zu Fuß kann ich mit
set Onkyo internet-radio-preset 1 den Kanal 1 anwählen.
Ziel ist die 6 Kanäle 1 - 6 per notify auf Taste durchzutoggeln.
So funktioniert es leider nicht:
define number dummy
attr number setList state: 1, 2, 3, 4, 5, 6
define Button8_Onkyo_stage notify (Remote8_._Btn_08:Short.*) { fhem("set Onkyo internet-radio-preset.number;;set number (number)+1")}

Wie kann ich den Text Onkyo internet-radio-preset mit einer nummer 1 - 6 zusammensetzen?
Wie kann ich die Variable number hochzählen und nach 6 bei hochzählen wieder auf 1 setzen?
VG, Ronald
Titel: Antw:Radio Kanäle toggeln
Beitrag von: MadMax-FHEM am 27 Februar 2017, 22:35:55
Wozu den dummy?

Der notify triggert wie du willst!?

Rufe mit dem notify eine sub auf:


define myNotify notify RegEx {SetzeLautstaerke()}


und dort einfach:


sub SetzeLautstaerke()
{
my $NextLs=ReadingsNum("Onkyo", "internet-radio-preset", 0);
$NextLs += 1;

if($NextLs > 6)
{
$NextLs =0;
}
{fhem ("set Onkyo internet-radio-preset $NextLs")}
}


https://wiki.fhem.de/wiki/99_myUtils_anlegen

Sicher auch ohne sub direkt im notify möglich...
...aber so kann man leicht Logausgaben etc. machen und weitere Abhängigkeiten/Abfragen etc. programmieren ohne, dass es schnell unübersichtlich wird (meine Meinung)...

Namen etc. nur Beispiele und die passende Regex für den notify musst du halt übernehmen/passend definieren...

Ungetestet und mit Handytastatur zusammengeklimpert...

Gruß, Joachim
Titel: Antw:Radio Kanäle toggeln
Beitrag von: Ronald am 27 Februar 2017, 22:58:43
Hallo Joachim,

danke für die schnelle Antwort.
Leider bin ich in punkto FHEm noch nicht so sicher.

Wenn ich deinen Code in der fhem.cfg einsetze
define Kanal notify RegEx {SetzeLautstaerke()}
sub SetzeLautstaerke() {my $NextLs=ReadingsNum("Onkyo", "internet-radio-preset", 0);$NextLs += 1;if($NextLs > 6) {$NextLs =0;}{fhem ("set Onkyo internet-radio-preset $NextLs")}}

bekomme ich nach shutdown restart folgendes Ergebnis:
Muss ich die Sub definieren?
Im logfile sieht das so aus:

Gruß, Ronald
Titel: Antw:Radio Kanäle toggeln
Beitrag von: kumue am 27 Februar 2017, 23:15:34
wie MadMax-FHEM schon schrieb....
Das notify ruft eine Routine SetzeLautstaerke auf, welche in eine Datei ausgelagert wurde... und zwar z.B. in die 99_myUtils.pm
Dort kommt der Code von SetzeLautstaerke rein.

Schau bitte ins Wiki zu 99_myUtils.pm
Den Link hat Dir MadMax-FHEM schon gepostet..
Titel: Antw:Radio Kanäle toggeln
Beitrag von: MadMax-FHEM am 27 Februar 2017, 23:19:51
Den Link hast du dir mal angeschaut??

Kann nicht sein!

EDIT: Ah, da ist mir schnell jemand zur Seite gesprungen ;)

Warum hauen viele einfach unbesehen/ungelesen/ungeprüft alles einfach in die Config (und per Hand editieren sollte man GAR NICHT da es NICHT nötig ist und wenn dann erst, wenn man GANZ GENAU WEIß WAS MAN TUT)...
...oder in das WebCmd-Fenster?? ;)

Und mal in der Commandref bzgl. notify kucken kann man auch als noch nicht so sicherer fhem-Anwender mal tun...
...und nachdem du hier ja bereits ein notify präsentiert hast bin ich davon ausgegangen, dass du das bereits entsprechend passend gestaltet hast...

EDIT2: und also ungefähr weißt wie notify so funktioniert...

Also das notify einfach in die WebCmd eingeben, dazu muss das RegEx halt zu deinem Trigger/Event passen.
Wenn das was du bislang geliefert hast passt dann einfach so:

define Button8_Onkyo_stage notify (Remote8_._Btn_08:Short.*) {SetzeLautstaerke()}

wobei mich die Klammern um die RegEx beim notify stören und ich glaube, dass die nicht hingehören (mag aber auch so funktionieren)...
...ich denke also eher so:

define Button8_Onkyo_stage notify Remote8_._Btn_08:Short.* {SetzeLautstaerke()}

Dann Enter und dann das rote Fragezeichen links oben klicken: save config...

Aber das passende RegEx musst du schon selber bauen, ich weiß ja nicht auf was getriggert werden soll...

Aber es ist nicht so schwer:

EventMonitor öffnen, den Filter grob auf das einstellen was man sehen will und dann schauen was kommt, wenn man das Ereignis (Knopf drücken??) ausführt.
Und dann entweder hier posten oder halt die RegEx "basteln"...

In der Sub (da dann dem Link folgen, dort ist erläutert was das alles ist und soll) evtl. zu Beginn eine Logausgabe, dann weißt du auch, dass der notify triggert und die sub aufruft...


sub SetzeLautstaerke()
{
my $NextLs=ReadingsNum("Onkyo", "internet-radio-preset", 0);
$NextLs += 1;

Log(1,"SetzeLautstaerke   nextLS: $NextLs");

if($NextLs > 6)
{
$NextLs =1;
}

{fhem ("set Onkyo internet-radio-preset $NextLs")}
}


EDIT3: $NextLs=0 geändert auf $NextLs = 1 da du ja von 1-6 (und nicht 0-6) durchtoggeln willst...

Gruß, Joachim
Titel: Antw:Radio Kanäle toggeln
Beitrag von: Ronald am 01 März 2017, 00:02:42
Hallo Joachim,

danke für die ausführliche Info.
Lesenden Menschen kann geholfen werden, in dem Link ist das mit 99_myUtils.pm ja prima erklärt. :-[
Habe Deinen Code eingetragen, lediglich SetzeLautstärke durch SetzeStage ersetzt.
In meiner 99_myUtils.pm steht jetzt:

sub SetzeStage()
{
my $NextLs=ReadingsNum("Onkyo", "internet-radio-preset", 0);
$NextLs += 1;

Log(1,"SetzeStage   nextLS: $NextLs");

if($NextLs > 6)
{
$NextLs =1;
}

{fhem ("set Onkyo internet-radio-preset $NextLs")}
}


Als Webcmd habe ich eingegeben:
define Button8_Onkyo_stage notify Remote8_._Btn_08:Short.* {SetzeStage()}
Wenn ich Btn_8 auslöse sehe ich im Logfile immer zwei Zeilen:
Hier noch die Lists aus dem Eventmonitor, 2 x Btn_08 betätigt:

Habi ich etwas verbogen? Der Zähler wirft immer 1 aus.
Der Onkyo macht dann immer ein reconnect - das Kommando funktioniert also, nur mit dem Zählen klappts noch nicht.
Gruß, Ronald
Titel: Antw:Radio Kanäle toggeln
Beitrag von: MadMax-FHEM am 01 März 2017, 00:18:31
Hi,

nö passt, also von dir...
...zumindest teilweise ;)

Dass es 2x im Log steht liegt wohl an dem notify.

So wie ich das sehe triggert es auf:

2017-02-28 23:58:40 CUL_HM Remote8_2 Remote8_2_Btn_08 Short
und
2017-02-28 23:58:40 CUL_HM Remote8_2_Btn_08 Short (to HMUART)

Was passiert bei:
define Button8_Onkyo_stage notify Remote8_._Btn_08:Short {SetzeStage()}


So nun zum immer 1.

War ein Fehler von mir.

Ich dachte ich könnte die aktuelle Einstellung auslesen:

my $NextLs=ReadingsNum("Onkyo", "internet-radio-preset", 0);

(war anhand des set Kommandos von dir "geraten")

und dann um eins Hochzählen:

$NextLs += 1;

Aber es gibt wohl das Reading 'internet-radio-preset' nicht, also wird immer der Default '0' geliefert...

Entweder musst du dir den aktuellen Wert wo merken oder rausfinden im welchem Reading der aktuelle Wert steht.

EDIT: merken evtl. in einem userreading...

Laut dem set Befehl habe ich angenommen das Gerät/Device heißt Onkyo!?

Mach doch mal ein list des Gerätes...
...außer du weißt in welchem Reading der aktuelle Wert steht, dann einfach das ReadingsNum anpassen...

Gruß, Joachim
Titel: Antw:Radio Kanäle toggeln
Beitrag von: Ronald am 01 März 2017, 00:57:00
Hi Joachim,
wenn ich .* weglasse triggert das Notify gar nicht.
Da passiert dann nichts im Logfile.
Der Onky receiver hat ziemlich viele Einträge, siehe nachfolgende Liste.
Mir würde es eigentlich reichen einfach einen Zähler durchzutoggeln.
Ich mache ein Toggle mit Btn_07 short set Onky off und set Onkyo internet-radio-preset 1
Dann schaltet er ein und direkt auf Radio 1, Swiss pop, dann ist die Regierung zufrieden :-)
Der Befehl funktioniert auch noch nicht astrein, habe ich mir zusammengebastelt. Da könnte man ja den SetzeStage auch gleich mit auf 1 setzen, dann reicht mir das toggeln beginnend bei 1

Das notify für Btn_07 sieht in der FHEM.CFG so aus:
define Onkyo_an dummy
attr Onkyo_an alias Onkyo An/Aus
attr Onkyo_an devStateIcon an:remotecontrol/black_btn_GREEN aus:remotecontrol/black_btn_RED
attr Onkyo_an room Wohnzimmer
attr Onkyo_an setList state:an,aus
attr Onkyo_an webCmd state
#attr Onkyo_an verbose 5
define OnkyoSchalter notify (Remote8_._Btn_07:Short.*) { if (Value("Onkyo_an") eq "an") {fhem("set Onkyo off;;set Onkyo_an aus")} else { fhem("set Onkyo internet-radio-preset 1;;set Onkyo_an an")}}

Könnte man bestimmt auch sauberer definieren - ich lerne halt noch (aber erst wieder Abends, in 4 1/2 Stunden klingelt der Wecker)

Gruß, Ronald
Titel: Antw:Radio Kanäle toggeln
Beitrag von: MadMax-FHEM am 01 März 2017, 08:59:00
Zu beginn: für Code, lists, etc. bitte "code-Tags" verwenden, das ist das '#' oben im "Menü"...
...so lässt es sich lechter lesen...

So, bevor hier noch mehr durcheinander geht (habe den Eindruck dass dem so ist) versuche ich mal zu verstehen/zu ordnen (was ich gedacht habe zu verstehen):

1. also du kannst mit:


set Onkyo internet-radio-preset 1
set Onkyo internet-radio-preset 2
set Onkyo internet-radio-preset 3
set Onkyo internet-radio-preset 4
set Onkyo internet-radio-preset 5
set Onkyo internet-radio-preset 6


wenn du es oben im WebCmd eingibst die Kanäle schalten!?

2. Wofür hast du den Dummy 'Onkyo_an'?

3. du willst auf 'Remote8_2_Btn_08 Short' triggern zum Weiterschalten? Und hast bei 1x drücken 2 Einträge im Log!? Wobei die geposteten Einträge eine "Pause" von mehr als 20Sec haben, die beiden Events aber gleich hintereinander kommen:


2017.02.28 23:46:39 1: SetzeStage   nextLS: 1
2017.02.28 23:46:39 3: ONKYO_AVR set Onkyo internet-radio-preset 1
2017.02.28 23:47:01 1: SetzeStage   nextLS: 1
2017.02.28 23:47:01 3: ONKYO_AVR set Onkyo internet-radio-preset 1



2017-02-28 23:58:40 CUL_HM Remote8_2 Remote8_2_Btn_08 Short
2017-02-28 23:58:40 CUL_HM Remote8_2_Btn_08 Short (to HMUART)


EDIT2: Falls du dich "nur" wunderst, dass 2 Einträge kommen: der mit '1:' vorne dran ist der aus der Funktion und der mit '3:' vorne dran ist der Schaltbefehl an den Onkyo, der kommt vom Onkyo-Modul (oder IODev falls es da so etwas gibt), kommt also "vom System"... (Die Nummer gibt den "verbosity-Level" an. Du kannst durch setzen entweder beim Modul oder global den Level hoch (5: viele Ausgaben) und runter (1 oder 0: wenige gar keine Ausgaben) setzen (also 2,3,4 geht nat. auch ;)  ). Die 1 im Log-Aufruf Log(1,"HIER DIE AUSGABE") ist ebenfalls der Level. Da ich diese Ausgaben für Debug-Zwecke einbaue ist der Level auf 1, also sollte die Ausgabe "immer" kommen (außer wenn alle Ausgaben mittels 0 abgeschaltet wurden). Das aber nur so nebenbei... Du lernst ja noch ;)

EDIT3: nach der "Entwicklungsphase" lasse ich natürlich nur noch Ausgaben drin, die ich will und brauche. Entweder dann auskommentieren '#' davor oder halt den verbose-Level auf 4 oder 5 setzen: Log(4,"..."). So lässt sich die Ausgabe durch setzen des erwähnten Attributs 'verbose' steuern (ohne im Code wieder einkommentieren zu müssen)...

4. es gibt kein Reading 'internet-radio-preset' in dem die gesetzte Nummer steht. Gut nicht schilmm. Ich habe gesehen, dass im Reading 'Channel' wohl der aktuelle zu finden wäre ;)  Du hast aber mehr als 6 Kanäle, oder? (ChannelList) Oder bringe ich da was durcheinandr? Wobei es nicht wirklich wichtig ist.


5. Den zuletzt gesetzten Wert musst du wo speichern (wenn man ihn tatsächlich nirgends auslesen kann und dazu kenne ich das Onkyo-Modul zu wenig/gar nicht). Entweder in einem 'userreading' beim Onkyo-Device ODER nachdem der dummy schon mal da ist einfach dort (vorausgesetzt der dummy ist tatsächlich notwendig)

D.h. die Funktion müsste dann so sein:


sub SetzeStage()
{
# hier wird der aktuelle Kanal ausgelesen
my $NextLs=ReadingsNum("Onkyo_an", "actChannel", 0);

# dann Kanal eins hoch ;)
$NextLs += 1;

# mal ausgeben wo wir sind
Log(1,"SetzeStage   nextLS: $NextLs");

# prüfen ob schon Kanal 6 vorbei, dann wieder 1
if($NextLs > 6)
{
$NextLs =1;
}

# setze den Kanal beim Onkyo (vorasugesetzt das funktioniert siehe 1.)
{fhem ("set Onkyo internet-radio-preset $NextLs")}

# speichere die Kanalnummer im dummy (vorausgesetzt der dummy wird gebraucht siehe 5. / ansonsten halt userReading beim Onkyo)
{fhem ("setreading Onkyo_an actChannel $NextLs")}
}


Was mir noch nicht klar ist, ist bzgl. dem Trigger für's notify, ob das nun klappt oder nicht, siehe 3.

Viel Erfolg, Joachim


EDIT:

nur um mit dem Trigger und Event richtig zu liegen kannst du auch mal folgendes tun (mache ich während der Entwicklung eigentlich immer so).
Im notify beim Aufruf der Funktion das Event mit übergeben:


define Button8_Onkyo_stage notify Remote8_._Btn_08:Short.* {SetzeStage($EVENT)}


und die Funktion so anpassen:


sub SetzeStage($)
{
my ($Event) = @_;
my $NextChan = ReadingsNum("Onkyo_an", "actChannel", 0);

$NextChan += 1;

# mal ausgeben wo wir sind
Log(1,"SetzeStage   Event: $Event      NextChan: $NextChan");

# prüfen ob schon Kanal 6 vorbei, dann wieder 1
if($NextChan > 6)
{
  $NextChan = 1;
}

# setze den Kanal beim Onkyo (vorasugesetzt das funktioniert siehe 1.)
{fhem ("set Onkyo internet-radio-preset $NextChan")}

# speichere die Kanalnummer im dummy (vorausgesetzt der dummy wird gebraucht siehe 5. / ansonsten halt userReading beim Onkyo)
{fhem ("setreading Onkyo_an actChannel $NextChan")}
}


Ich habe noch NextLs in NextChan geändert weil es ja um Kanäle und nicht um Lautstärke geht ;)
Titel: Antw:Radio Kanäle toggeln
Beitrag von: Ronald am 01 März 2017, 23:42:48
Hallo Joachim,

1. also du kannst mit:

set Onkyo internet-radio-preset 1
set Onkyo internet-radio-preset 2
set Onkyo internet-radio-preset 3
set Onkyo internet-radio-preset 4
set Onkyo internet-radio-preset 5
set Onkyo internet-radio-preset 6


wenn du es oben im WebCmd eingibst die Kanäle schalten!?
Jepp, das klappt problemlos :-)
Wenn der Onkyo aus ist schaltet er sich damit auch ein und geht direkt auf die gewählte Quelle.

2. Wofür hast du den Dummy 'Onkyo_an'?
Ziel ist mit mit Taste 7 den Onkyo zu toggeln zwischen aus und "an + Quelle internet radio preset 1
define OnkyoSchalter notify (Remote8_._Btn_07:Short.*) { if (Value("Onkyo_an") eq "an") {fhem("set Onkyo off;;set Onkyo_an aus")} else { fhem("set Onkyo internet-radio-preset 1;;set Onkyo_an an")}}
Das kann man bestimmt einfacher lösen, ich schaue mit if auf den status des dummys und schalten dann dazu den Onkyo an / aus und den dummy um.

3. du willst auf 'Remote8_2_Btn_08 Short' triggern zum Weiterschalten? Und hast bei 1x drücken 2 Einträge im Log!? Wobei die geposteten Einträge eine "Pause" von mehr als 20Sec haben, die beiden Events aber gleich hintereinander kommen:

Ich habe das wohl falsch beschrieben, ich habe machmal Probleme mit der HomeMatic Fernbedienung, weil die von FHEM kein ACK bekommt. Deshalb funktioniert wohl auch das short nicht sondern nur short.*
In meinem Post hatte ich 2 x gedrückt, es kam jeweils die gleiche Kanal Nummer.
Zu Edit 2:
Danke für die Tipps zum verbose und den Aufbau wie das zu lesen ist.

4. es gibt kein Reading 'internet-radio-preset' in dem die gesetzte Nummer steht. Gut nicht schilmm. Ich habe gesehen, dass im Reading 'Channel' wohl der aktuelle zu finden wäre ;)  Du hast aber mehr als 6 Kanäle, oder? (ChannelList) Oder bringe ich da was durcheinandr? Wobei es nicht wirklich wichtig ist.

Ja, ich kann da bis zu 40 Kanäle anlegen. Es gibt auch eine "klassische Fernbedienung zu dem Onkyo, funktioniert aber nicht, da das Teil im Schrank ist und der IR nicht durch kommt.
Wenn ich mehr will, z.B. den Fernsehton via Onkyo wiedergeben, Bluray Kanal wählen, ... nehme ich die Onkyo App auf dem Handy.
Meistens reicht es aber ein paar Lieblingskanäle zu schalten (Btn8 short), Volume regeln (Btn 7,8 long) oder ein aus (Btn 7 short).
An der Eingangstür habe ich noch eine 6er HM Tastatur. Da werden über Btn 1,3,4,5,6 Schalter und Dimmer getoggelt. Mit Btn 2 schalte ich alle Lampen und den Onky aus.
Mit der Logik kommt meine Frau auch top zurecht - so soll es sein.

So nun zu den Änderungsvorschlägen:
define Button8_Onkyo_stage notify Remote8_._Btn_08:Short.* {SetzeStage($EVENT)}
habe ich eingetragen.
in der 99_myUtils.pm Deinen unten genannten  Code eingetragen.
sub SetzeStage($)
{
my ($Event) = @_;
my $NextChan = ReadingsNum("Onkyo_an", "actChannel", 0);

$NextChan += 1;

# mal ausgeben wo wir sind
Log(1,"SetzeStage   Event: $Event      NextChan: $NextChan");

# prüfen ob schon Kanal 6 vorbei, dann wieder 1
if($NextChan > 6)
{
  $NextChan = 1;
}

# setze den Kanal beim Onkyo (vorasugesetzt das funktioniert siehe 1.)
{fhem ("set Onkyo internet-radio-preset $NextChan")}

# speichere die Kanalnummer im dummy (vorausgesetzt der dummy wird gebraucht siehe 5. / ansonsten halt userReading beim Onkyo)
{fhem ("setreading Onkyo_an actChannel $NextChan")}
}


Das funzt prima und macht genau, was es soll.
Bin bestens zufrieden, danke für den ausführlichen Support.

Wenn ich mal wieder etwas Ruhe habe schaue ich mir die off / preset 1 Geschichte für Btn 7 an, das müsste doch auch genauso mit einer Sub gehen.
Jetzt bin ich erst Mal Top zufrieden  :)
Gruß, Ronald


Titel: Antw:Radio Kanäle toggeln
Beitrag von: MadMax-FHEM am 01 März 2017, 23:50:59
Hallo Ronald,

freut mich!
Schön zu hören, dass es jetzt endlich klappt...
...noch besser, dass/wenn du was gelernt hast...

EDIT: evtl. noch die Logausgaben überarbeiten, nicht dass dein Log unnötig voll läuft...

EDIT2: bzgl. des roten Blinken evtl. mal hier: https://wiki.fhem.de/wiki/HomeMatic#Peeren  und hier: https://wiki.fhem.de/wiki/Virtueller_Controller_VCCU (eine anzulegen schadet nicht und hat Vorteile / Forumssuche sagt bestimmt mehr dazu) schauen...

Viel Spaß noch!

Aber Achtung: es findet sich immer was zu tun... ;)

Gruß, Joachim

P.S.: evtl. noch als gelöst "kennzeichnen", z.B. durch umbenennen in "[gelöst] Radio Kanäle toggeln"
Titel: Antw:Radio Kanäle toggeln
Beitrag von: Ronald am 05 März 2017, 20:37:58
Hallo Joachim,

eine Frage zum Umbenennen:
Einen Button zum Umbenennen habe ich nicht gefunden, nur verschieben.
Da kann ich zwar auch ein Häkchen bei umbenennen setzen, dann steht bei verschieben "verschieben nach Forum".
Wie klappt das sauber mit dem umbenennen?

Zum Thema habe ich noch ein paar Änderungen vorgenommen:
Wenn der Onkyo direkt über Toggeln Kanäle eingeschaltet wird habe ich in der 99_myUtils.pm noch ergänzt:
{fhem ("set Onkyo_an an")}

Dadurch wird der Dummy auch umgeschaltet, wenn man über Toggeln Kanäle auch direkt den Onkyo einschaltet.
Gleiches habe ich auch für Btn_2 - All Off ergänzt.
Da wurde vorher nur der Onkyo ausgeschaltet, jetzt wird auch der Dummy mit umgeschaltet:
{ fhem("set Wohnraum off;set Onkyo off;set Onkyo_an aus")}
Insofern alles gut - jetzt muss ich das Thema nur noch als [gelöst] markieren.
Gruß, Ronald
Titel: Antw:Radio Kanäle toggeln
Beitrag von: MadMax-FHEM am 05 März 2017, 20:59:26
Hmm ich hab's schon lange nicht mehr gemacht...
Aber wenn du auf ändern gehst kannst du dann den Namen nicht editieren??

Ansonsten: is nicht wichtig/schlimm würde nr zeigen, dass das Problem gelöst ist...

Viel Spaß noch, Joachim
Titel: Antw:[gelöst] Radio Kanäle toggeln
Beitrag von: Ronald am 05 März 2017, 21:07:58
So, hat anscheinend mit dem umbenennen ohne verschieben geklappt, bis demnächst  ;)