Neues Modul für Hyperion Server 98_Hyperion.pm

Begonnen von DeeSPe, 29 Juni 2016, 18:54:18

Vorheriges Thema - Nächstes Thema

adn77

Hallo Schlimbo,

sorry, aneinander vorbeigeredet... zu viel Dinge parallel geändert...

Die Ausgabe :"ATTENTION!!! Can't detect your version of hyperion!" kommt nur, wenn das Attribut "hyperionVersionCheck == 1" ist.
Dieses Attribut muss zwingend auf "0" gesetzt werden

attr ESPHyperion hyperionVersionCheck 0

DeeSPe

#451
Zitat von: Schlimbo am 25 Oktober 2017, 16:13:24
@DeeSPe:
Bin mir nicht sicher wie ich an die JSON Daten komme.
Habe jetzt einfach mal in der Konsole folgendes ausgeführt:
echo "{\"command\":\"serverinfo\"}" | nc 192.168.5.72 19444 > ESP_Hyperion.json
Hoffe das passt so?

Ja, bestens.
Prüft mal bitte ob das angehängte Modul evtl. Euer Problem behebt.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

adn77

Hallo Dan,

Zitat von: DeeSPe am 25 Oktober 2017, 17:45:15
Prüft mal bitte ob das angehängte Modul evtl. Euer Problem behebt.

danke, dass du dich darum kümmerst, obwohl noch nicht "Anfang November" ist ;)
Ich denke, deine RegEx sind unnötig streng. Das vorverlegen der CR/LF Ersetzung ist auf jeden Fall ein gangbarer Weg. Allerdings veränderst du dadurch den Antwortstring vor dem LOG Eintrag... daher mein Patch

1.Teil: Match auf Zeilenende - So dürfen keine Whitespaces (und auch kein CR/LF) am Ende stehen
-  return if ($buf !~ /(^.+"success":(true|false)\}$)/);
+  return if ($buf !~ /(^.+"success":(true|false)\})/);
...
-  if ($result =~ /^\{"success":true\}$/)
+  if ($result =~ /^\{"success":true\}/)


2.Teil: ich verstehe nicht ganz, was der RegEx machen soll. Ich muss alle CR/LF durch "" ersetzen
$result =~ /(\s+)?\/{2,}.*|(?:[\t ]*(?:\r?\n|\r))+/gm;
+  $result =~ s/[\r|\n]//gm;


3. Teil: konsequenter Weise sollte kein Fehler gezeigt werden, wenn man im INTERVAL Modus gerade nicht verbunden ist
-    if (Value($name) =~ /^(ERROR|disconnected)$/);
+    if ( (Value($name) =~ /^(ERROR|disconnected)$/ && !$hash->{INTERVAL}) || (Value($name) =~ /^(ERROR)$/ && $hash->{INTERVAL}) );

DeeSPe

#453
Zitat von: adn77 am 25 Oktober 2017, 17:57:47
Ich denke, deine RegEx sind unnötig streng. Das vorverlegen der CR/LF Ersetzung ist auf jeden Fall ein gangbarer Weg. Allerdings veränderst du dadurch den Antwortstring vor dem LOG Eintrag... daher mein Patch

Ich stehe auf strenge RegEx, darum ist mir das so lieber. ;)

Zitat von: adn77 am 25 Oktober 2017, 17:57:47
2.Teil: ich verstehe nicht ganz, was der RegEx machen soll. Ich muss alle CR/LF durch "" ersetzen
$result =~ /(\s+)?\/{2,}.*|(?:[\t ]*(?:\r?\n|\r))+/gm;
+  $result =~ s/[\r|\n]//gm;


Verstehe auch gerade nicht wirklich was ich damit bezwecken wollte, des Modul gehörte damals zu meinen ersten Perlerfahrungen. :P
Hab das jetzt auch mal raus genommen. Bei meiner Hyperion Instanz funktioniert nach wie vor alles.

Zitat von: adn77 am 25 Oktober 2017, 17:57:47
3. Teil: konsequenter Weise sollte kein Fehler gezeigt werden, wenn man im INTERVAL Modus gerade nicht verbunden ist
-    if (Value($name) =~ /^(ERROR|disconnected)$/);
+    if ( (Value($name) =~ /^(ERROR|disconnected)$/ && !$hash->{INTERVAL}) || (Value($name) =~ /^(ERROR)$/ && $hash->{INTERVAL}) );


Okay, hab das in einer für mich mehr logischen Version übernommen.
Bitte gerne noch einmal testen.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Schlimbo

Danke euch beiden, mit DeeSPe's Version und dem Attribut  "hyperionVersionCheck" auf 0 funktioniert es jetzt :)

DeeSPe

Zitat von: Schlimbo am 25 Oktober 2017, 21:00:02
Danke euch beiden, mit DeeSPe's Version und dem Attribut  "hyperionVersionCheck" auf 0 funktioniert es jetzt :)

Danke für die Rückmeldung.
Werde diese Version dann einchecken.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

adn77

Ich hätte noch eine Frage zur Bedeutung des "aus"-Schalters.
Aktuell setzt er die Farbe auf #000000 (schwarz). Dadurch wird aber auch der vorherige RGB Wert überschrieben.

Wäre es nicht sinnvoller, wenn "aus"-Schalten ein "clearall" senden würde, dann speichert sich das Modul den RGB Wert (oder den aktuellen Effekt?) und beim "ein"-Schalten würde der Zustand wiederhergestellt.

Zeilen 633+634.

DeeSPe

#457
Zitat von: adn77 am 25 Oktober 2017, 22:28:15
Ich hätte noch eine Frage zur Bedeutung des "aus"-Schalters.
Aktuell setzt er die Farbe auf #000000 (schwarz).

Das ist die offizielle Vorgehensweise um alle LEDs auszuschalten.

Zitat von: adn77 am 25 Oktober 2017, 22:28:15
Wäre es nicht sinnvoller, wenn "aus"-Schalten ein "clearall" senden würde, dann speichert sich das Modul den RGB Wert (oder den aktuellen Effekt?) und beim "ein"-Schalten würde der Zustand wiederhergestellt.

Ein "clearall" schaltet das Ambilight ein und somit wäre es nicht "off".

Ich habe das Modul noch einmal angepasst, kann nur gerade nicht selbst testen.
Der RGB Wert wird nun nur noch im Reading rgb gespeichert wenn er nicht 000000 ist, ich hoffe das umgeht Dein Problem.
Bitte nochmal testen.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Schlimbo

@Alex:
wird der clearall Befehl überhaupt von der ESP-Version unterstützt?
Wenn ich über FHEM eine Farbe einstelle und anschließend zum Ausschalten "clearall" benutze, bleiben die LEDs an, im Modul wird als state aber "off" angezeigt.
Auch über die Hyperion Android APP funktioniert "clearall" nicht.

adn77

Also laut Hyperion Wiki:
ZitatA priority channel can be cleared using the two clear command: clear and clearall. Clear will only clear the priority channel provided by the priority parameter or use the default when the parameter is not provided. Clearall on the other hand will clear all active priority channels and effectively set all leds to black.

Das bedeutet, dass ein "ClearAll" einem Ausschalten gleichkommt (eben auch nochmal mit einem aktuellen Hyperion ausprobiert).
Daher wäre der sauberste Weg  das Modul sendet "clearall" beim "aus"-Schalten

(Im ESP-Sketch macht ein "color[ 0, 0, 0]" Kommando genau das, es schaltet die Farbe auf Schwarz und liefert bei "serverinfo" auch schwarz zurück.
Ein "clearall" setzt die Farbe ebenfalls auf Schwarz, ein "serverinfo" liefert aber fortan ein leeres "activeLedColors/activeEffects" zurück.)

Schlimbo

Zitat von: adn77 am 26 Oktober 2017, 13:16:44
Daher wäre der sauberste Weg  das Modul sendet "clearall" beim "aus"-Schalten
Sehe ich nicht so, den clearall löscht nur einmalig alle Channels, läuft noch ein Grabber setzt er im Anschluss gleich wieder die LEDs und somit würden die LEDs an bleiben, obwohl "off" gesetzt.

DeeSPe

Zitat von: Schlimbo am 26 Oktober 2017, 13:38:27
Sehe ich nicht so, den clearall löscht nur einmalig alle Channels, läuft noch ein Grabber setzt er im Anschluss gleich wieder die LEDs und somit würden die LEDs an bleiben, obwohl "off" gesetzt.

Genau!
Ich habe das auch mit den Hyperion Entwicklern besprochen.
Wirklich ausschalten lassen sich alles LEDs nur zuverlässig durch das Setzen von "rgb 000000".

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

adn77

Zum Verständnis: der "aus"-Befehl setzt die Farbe auf Schwarz mit der höchst möglichen Priorität?
D.h. wenn ein Grabber seine Informationen darstellen möchte, kommt er quasi nicht "durch"?

Im ESP-Sketch läuft es momentan so, dass sobald UDP-Daten anliegen (von einem remote Hyperion) werden diese Daten auch dargestellt, egal ob der ESP vorher "aus" war.

Schlimbo

Zitat von: adn77 am 26 Oktober 2017, 14:29:26
Zum Verständnis: der "aus"-Befehl setzt die Farbe auf Schwarz mit der höchst möglichen Priorität?
D.h. wenn ein Grabber seine Informationen darstellen möchte, kommt er quasi nicht "durch"?
Im Normalfall Ja, kann aber über das Attribut "hyperionDefaultPriority" geändert werden.

Aus commandref:
ZitathyperionDefaultPriority
default priority
default: 0 = highest priority

Schlimbo

#464
Zitat von: adn77 am 26 Oktober 2017, 14:29:26
Im ESP-Sketch läuft es momentan so, dass sobald UDP-Daten anliegen (von einem remote Hyperion) werden diese Daten auch dargestellt, egal ob der ESP vorher "aus" war.
Da es im ESP-Sketch keine priority gibt finde ich das auch richtig so:
Die zuletzt empfangene Einstellung gilt und da über UDP in diesem Fall ständig Daten kommen hat UDP immer das letzte Wort.
Es verhält sich dann so, als würden alle mit der selben Prio einstellen.

Ideal wäre natürlichen, wenn du die Prio im ESP-Sketch auswerten würdest und hierüber entschieden wird, ob UDP oder FHEM Vorrang hat. ;)
Ach Quatsch, das funktioniert ja gar nicht, da im UDP-Stream nur Farbwerte übertragen werden und keine Prio.
....könnte aber auch im Sketch noch eine Einstellung für UDPDefaultPriority vorsehen.