[Modul] Raumdisplay (RoomDisplay)

Der Post wäre besser hier aufgehoben gewesen Hervorragendes und günstiges Mini Touch Display

Bekannt und ist beim Hochladen oder Speichern der pages.jsonl auch so. Genau wie beim Screenshot machen …

Meine ganz persönliche Meinung zu Punkt 2: dafür ist das Display - noch openHASP gemacht/gedacht!

Gruß HEiko

Nicht gedacht, aber funktioniert…
Upload des PNG über FTP per Script

Am Schluss des Scripts:

WWXRD_SendJSONL(32211, ['page' => 2,'id' => 11,'obj' => 'img','src' => "L:/$ftpFileName"]);

und das Bild ist aktuell…

Super, mit deinem Modul holen wir das letzte aus dem Display raus :joy:

Ich benötige Hilfe bei einem Problem, das ich trotz vieler Mühen einfach nicht selbst hinbekomme.
Ich setze das Sonos-Modul ein. Playlisten importieren geht dank TuneIn (New) nicht mehr (soweit ich das verstnaden habe). Damit kann ich aber leben. Ich habe daher drei Radiosender „händisch“ in den Sonos-Splitter gepackt. Das funktioniert auch.


Im Webfront sieht das auch gut aus.

Ich möchte nun gerne das Layout von @pitti für das Wanddisplay nutzen und auf der Seite 4, ID 91 (der Roller) die drei Sender in dem Roller angezeigt bekommen. Was auch immer ich mache, der Roller zeigt nur die in der JSONL vorbelegten Daten an, nicht die Daten aus meiner Variable.
Alles andere an der Sonos Steuerung läuft, auch der Play / Pause Button.

Kann mich bitte jemand „erleuchten“? Danke! :slight_smile:

auch so geht es nicht…

Versuchs mal so, habe auch lange geübt

Habe eine Seite für die Wärmepumpe zusammengeschustert…

image

Seitenaufbau sieht so aus

{"comment": " ---------------------- Page 05 - HEIZUNG -------------------------- "}
{"page": 5, "id": 4, "obj": "img", "src": "L:/bg30.png", "auto_size": 0, "w": 480}
{"comment": " --- Navi Buttons .---- "}
{"page": 5, "id": 5, "obj": "btn", "x": 5, "y": 42, "w": 150, "h": 48, "action": {"down": "page prev"}, "bg_opa": 30, "bg_color": "#FFFFFF", "border_side": 0, "text": "\uE04D", "text_color": "#FFFFFF", "text_font": 32, "radius": 10}
{"page": 5, "id": 6, "obj": "btn", "x": 165, "y": 42, "w": 150, "h": 48, "action": {"down": "page back"}, "bg_opa": 30, "bg_color": "#FFFFFF", "border_side": 0, "text": "\uE2DC", "text_color": "#FFFFFF", "text_font": 32, "radius": 10}
{"page": 5, "id": 7, "obj": "btn", "x": 325, "y": 42, "w": 150, "h": 48, "action": {"down": "page next"}, "bg_opa": 30, "bg_color": "#FFFFFF", "border_side": 0, "text": "\uE054", "text_color": "#FFFFFF", "text_font": 32, "radius": 10}
{"comment":" --- Wärmepumpe --------------- "}
{"page": 5, "id": 10, "obj": "img", "x": 10, "y": 110,"auto_size":0,"w": 200, "h": 200, "src": "L:/WP_Off.png"}
{"page": 5, "id": 21, "obj": "label", "x": 230, "y": 115, "w": 240, "h": 25, "align": "left", "text": "Vorlauf: 45°C", "text_color": "#FFFFFF", "text_font": 22}
{"page": 5, "id": 22, "obj": "label", "x": 230, "y": 155, "w": 240, "h": 25, "align": "left", "text": "Rücklauf: 30°C", "text_color": "#FFFFFF", "text_font": 22}
{"page": 5, "id": 23, "obj": "label", "x": 230, "y": 195, "w": 240, "h": 25, "align": "left", "text": "Rücklauf Soll: 35°C", "text_color": "#FFFFFF", "text_font": 22}
{"page": 5, "id": 24, "obj": "label", "x": 230, "y": 235, "w": 240, "h": 25, "align": "left", "text": "Warmwasser: 50°C", "text_color": "#FFFFFF", "text_font": 22}
{"page": 5, "id": 25, "obj": "label", "x": 230, "y": 275, "w": 240, "h": 25, "align": "left", "text": "COP-Faktor: 3.9", "text_color": "#FFFFFF", "text_font": 22}
{"comment":" --- Temperaturkorrektur --------------- "}
{"page": 5, "id": 30, "obj": "slider", "x": 10, "y": 320, "w": 360, "h": 35, "min": 30, "max": 65, "val": 50,"radius":20,"bg_opa10":25,"bg_color10":"#FFFFFF","bg_grad_color10":"#C0F0C0","border_side":0,"radius20":40,"bg_grad_dir20":0,"bg_color20":"#FFFFFF","pad_top":0,"pad_bottom":0,"pad_left":0,"pad_right":0,"bg_opa":70,"border_side10":0}
{"page": 5, "id": 31, "obj": "label", "x": 380, "y": 320, "w": 100, "h": 35, "align": "center", "text": "50°C", "text_color": "#FFFFFF", "text_font": 30}
{"page": 5, "id": 32, "obj": "label", "x": 10, "y": 360, "w": 360, "h": 25, "align": "center", "text": "Warmwasser-Soll", "text_color": "#FFFFFF", "text_font": 22}
{"page": 5, "id": 40, "obj": "slider", "x": 10, "y": 405, "w": 360, "h": 35, "min": -5, "max": 5, "val": 0, "radius":20,"bg_opa10":25,"bg_color10":"#FFFFFF","bg_grad_color10":"#C0F0C0","border_side":0,"radius20":40,"bg_grad_dir20":0,"bg_color20":"#FFFFFF","pad_top":0,"pad_bottom":0,"pad_left":0,"pad_right":0,"bg_opa":70,"border_side10":0}
{"page": 5, "id": 41, "obj": "label", "x": 380, "y": 405, "w": 100, "h": 35, "align": "center", "text": "0°C", "text_color": "#FFFFFF", "text_font": 30}
{"page": 5, "id": 42, "obj": "label", "x": 10, "y": 445, "w": 360, "h": 25, "align": "center", "text": "Temperatur-Korrektur", "text_color": "#FFFFFF", "text_font": 22}

Mit diesem Script werden die Bilder anhand der Integer-Statusvariable der Wärmepumpe gewechselt

<?php

// ID der Integervariable
$variableID = 16696;  // Hier die richtige ID der Integervariable eintragen
// Aktuellen Wert der Integervariable auslesen
$status = GetValueInteger($variableID);

// Ziel-ID für WWXRD_SendJSONL
$targetID = 32211;

// JSON-Befehle basierend auf dem Status senden
switch ($status) {
    case 0:  // Heating
        WWXRD_SendJSONL($targetID, [
            'page' => 5,
            'id' => 10,
            'obj' => 'img',
            'x' => 10,
            'y' => 110,
            'auto_size' => 0,
            'w' => 200,
            'h' => 200,
            'src' => "L:/WP_Heating.png"
        ]);
        break;
        
    case 1:  // HotWater
        WWXRD_SendJSONL($targetID, [
            'page' => 5,
            'id' => 10,
            'obj' => 'img',
            'x' => 10,
            'y' => 110,
            'auto_size' => 0,
            'w' => 200,
            'h' => 200,
            'src' => "L:/WP_HotWater.png"
        ]);
        break;
        
    case 5:  // Off
        WWXRD_SendJSONL($targetID, [
            'page' => 5,
            'id' => 10,
            'obj' => 'img',
            'x' => 10,
            'y' => 110,
            'auto_size' => 0,
            'w' => 200,
            'h' => 200,
            'src' => "L:/WP_Off.png"
        ]);
        break;
        
    case 7:  // Cooling
        WWXRD_SendJSONL($targetID, [
            'page' => 5,
            'id' => 10,
            'obj' => 'img',
            'x' => 10,
            'y' => 110,
            'auto_size' => 0,
            'w' => 200,
            'h' => 200,
            'src' => "L:/WP_Cooling.png"
        ]);
        break;
        
    default:  // Falls kein gültiger Wert
        echo "Unbekannter Status: $status";
        break;
}

Und hier die Bilder, die dazu per FTP auf Display geladen werden müssen, um sie später mit dem Script abzurufen.

WP.zip (177,3 KB)

@pitti gerne zur Integration, natürlich auch in modifizierter Form, in deinen publizierten Seitenaufbau.

1 „Gefällt mir“

Danke, das habe ich schon früher gelesen und versucht. Leider ohne Erfolg.

Du musst den Seitenaufbau auch anpassen

{"comment":" --- Favorites -------- "}
{"page":4,"id":91,"obj":"roller","x":315,"y":130,"w":150,"rows":7,"options":"Italo Dance\nBest of Mundart\nAntenne Bayern\nRadio Aargovia\nRadio Pilatus\nRadio SRF1\nRadio SRF3\nVintage Radio","mode":1,"radius":10,"border_side":0,"text_font":24,"bg_color":"#FFFFFF","bg_opa":30,"bg_opa1":150,"align": "center"}

Und sonst die Wiedergabelisten verwenden, damit mach ichs und das funktioniert einwandfrei…

Super, ich baue gerade Wettersymbole in das 7" Display ein und Die von Openweather sind mir zu klein. Dein Script gibt mir ein Denkanstoß, DANKE.

Du kannst die Namen der Playlisten nicht dynamisch syncen, d.h. die Namen müssen händisch in die jsonl eingetragen werden.
Wenn die Namen dann im Display und IPS übereinstimmen, dann weiß man anhand des Indexwertes was man hören möchte.

Gruß Heiko

Wenn ich die unbekannte Objekte löschen möchte führt das zu einer leeren Liste der Objektzuordnung, alles was zugeordnet ist verschwindet.
image

Ich habe mal Debug aufgezeichnet, wärend ich den ‚Einlesen‘ Button (inkl. Löschen) drücke und berstätige
dump.txt (129,3 KB)

Ahh, Danke - kann es nachstellen! Da gehe ich mal auf die Suche :slight_smile:

Gruß HEiko

PS: Fehler gefunden - kommt mit nächster Beta!

ChatGPT hat das auch schön erklärt :slight_smile:

Warum passiert das?

  • In PHP bleibt die numerische Indexierung nach einem unset() erhalten.
  • json_encode() behandelt Arrays, bei denen die Indizes nicht lückenlos aufeinanderfolgen, als assoziatives Array (also als Objekt im JSON-Format mit numerischen Keys).
    Wenn die Indizes lückenlos sind ([0, 1, 2]), erzeugt json_encode() ein JSON-Array ([...]).
  • Wenn die Indizes jedoch Lücken aufweisen ([0, 2]), wird daraus ein JSON-Objekt ({ "0": ..., "2": ... }).*

Wie behebe ich das?

  • unset() hinterlässt Lücken in numerischen Arrays.
  • json_encode() erkennt diese Lücken und wandelt das Array in ein Objekt um.
  • Mit array_values() kannst du die Indizes neu ordnen, um ein sauberes JSON-Array zu erhalten.

Dank @mb-stern konnte ich den Fehler finden (siehe Post vorher) und fixen. Da ich immer ungern für einen Fix eine neue Version mache gibt es wieder mal eine kleine Zugabe :slight_smile:
Danke an @Spoosie für die Anregung zu der Idee mit dem Durchblättern!

BETA v3.4.20250303 ist online:

  • NEU: Auswahl der zu aktivierenden Seite im Leerlauf (erw. Einstellungen)
  • NEU: Automatisches Durchblättern der Seiten im Leerlauf (erw. Einstellungen)
  • FIX: Bei Aktivierung der Löschfunktion beim Einlesen des Seitenlayouts wurden alle Zurodnungen gelöscht

Gruß HEiko

3 „Gefällt mir“

Danke Euch @mb-stern und @pitti , sehr cool!

1 „Gefällt mir“

Hiho,
wenn alle Tests erfolgreich verlaufen, erwartet Euch morgen eine neue Beta-Version.

Und um die Spannung ein wenig zu steigern … ich sage nur …

  • selektives Blättern
  • formatierte Werte

… mehr verrate ich noch nicht!

Gruß Heiko

3 „Gefällt mir“

Guten Abend,

wie versprochen noch paar Worte zur neuen BETA v3.5.20250305!

Bilder sagen ja bekanntlich mehr als Worte …

image

  1. Man kann jetzt festlegen, zu welcher Seite im Leerlauf gesprungen werden soll.
    Prinzipiell nichts Großes, aber bei genauer Betrachtung lässt sich daraus eine clevere Lösung entwickeln.
    Wer meine Layouts kennt, weiß vielleicht, dass ich sieben Seiten nutze: Die erste Seite dient als Verteiler und Haupteinstieg, die anderen sechs Seiten enthalten spezifische Funktionen oder Informationen. Wenn man die Vor- und Zurück-Navigation auf bestimmte Seiten einschränkt, kann man mit dieser neuen Konfigurationsmöglichkeit aus der fixen Seitennavigation ausbrechen :slight_smile:. Das bedeutet, man kann eine spezielle Seite für den Idle-Modus erstellen – und ich habe da schon eine Idee … abwarten :slight_smile:.

  2. Es macht nicht immer Sinn, im Leerlauf durch alle Seiten zu blättern. Zum Beispiel möchte man die Musik-Steuerungsseite überspringen und nur Seiten durchlaufen, die nützliche Informationen (wie Strom, Heizung etc.) anzeigen. Diese Seiten oder Bereiche lassen sich jetzt gezielt definieren – das kennt man bereits aus dem Druckdialog.

  3. Ein weiteres kleines, aber feines Feature betrifft die Anzeige von Zuständen, Modi oder Status. Ab sofort können auch die formatierten Werte (GetValueFormatted) für Beschriftungen oder Werte genutzt werden. Das vereinfacht vieles: Komplexe Formeln zur Nachbildung von Profilen sind nicht mehr nötig :slight_smile:.

  • Programm Geschirrspüler:
    – Vorher: @array_pop(explode('.', '{{val}}'))
    – Danach: '{{fmt}}'
  • Zustand Geschirrspüler:
    – Vorher: ('{{val}}'== 'BSH.Common.EnumType.OperationState.Ready' ) ? '#FFC107 Bereit#' : (('{{val}}'=='BSH.Common.EnumType.OperationState.Run') ? '#FF9800 Läuft#' : '#58A906 Fertig#')
    – Danach: '#FFC107 {{fmt}}#'

Hier mochmal der Changelog v3.5.20250305:

v3.5.20250305

  • NEU: Neuer Platzhalter {{fmt}} für profilformatierte Werte wird jetzt auch bei Wert und Beschriftung unterstützt
  • NEU: Seiten(bereichs)angabe für automatisches Durchblättern der Seiten im Leerlauf
  • NEU: Freie Definition einer Seite, welche beim Seitenwechsel im Leerlauf dargestellt/geschaltet werden soll
  • FIX: Veraltete Konfigurationsangaben ersetzt

Viel Spaß

PS: Es ist schon wieder was am brodeln :heart_on_fire:

7 „Gefällt mir“

Das ist aber nun richtig cool. Wenn das nun auch für das roller-Objekt funktionieren würde könnte man die Wiedergabeliste dynamisch laden.
Vielen Dank für deinen riesigen Aufwand, den du in das Modul steckst :+1:

1 „Gefällt mir“

Richtig cool wird es jetzt erst :sunglasses: Ich kann die Finger einfach nicht von dem Teil lassen …

Mit dem letzten Update kam ja die Möglichkeit auf Seiten zu springen die außerhalb der Seitennavigationsschleife liegen. Was man ja perfekt für einen Idle-Widget nutzen kann …

… et voilà und schon sind sie da :slight_smile: … ja gleich 2 Widgets :smiley:

… und wie sieht das jetzt in rot aus

und in blau …

Letzte Tests laufen … daher müsst ihr bis morgen warten :sunglasses:

Gruß HEiko

5 „Gefällt mir“

das sieht alles richtig stark aus :slight_smile:
ich bräuchte nur einen Editor, der es mir in die erforderliche „Sprache“ übersetzt :smiley:

1 „Gefällt mir“

Ja selbst innerdeutsch gibt es verschiedne Versionen :grin: