Ankündigung

Einklappen
Keine Ankündigung bisher.

Gruppenadressen im Expertenprogramm dynamisch beschreiben (multiplexen)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Gruppenadressen im Expertenprogramm dynamisch beschreiben (multiplexen)

    Hallo zusammen,

    ich möchte in meinem EibPC²-Projekt die Visualisierungselemente "Multibutton" nutzen um auf Basis des ausgewählten Eintrags eine Gruppenadresse (1bit) zu Multiplexen.
    Der Eingang von dem Multiplexer sind 4 interne Variablen (1bit), Schalter sind vier Dropdown-Einträge, Ausgang ist eine Gruppenadresse. Diese Funktion benötige ich insgesamt 16 mal, daher möchte ich sie möglichst schlank und effizient gestalten.
    Meine Idee scheitert allerdings aktuell am Validierungsschema des EibPC², da die Write-Befehle nur bei Änderung der If-Abfrage neu ausgeführt werden...

    Aktueller Stand:

    Auf der Visu habe ich einen (16x) Multibutton, um die Dauer der Nachtladung auszuwählen (mal davon abgesehen, dass der Text die Schaltfläche Dropdown überblendet):



    Dieser ist mit der Logik verbunden:2020-09-23 00_12_34-Window.png
    • Ich benötige die Schaltfläche (Icon) nur zum Anzeigen, das Drücken wird nicht ausgewertet
    • Den Status des Icons ermittele ich direkt aus dem Ausgang "Auswahl", da ich nur auf die ausgewähle Option ragieren möchte
    • Das Icon wird bei Auswahl der Option "1" auf "Aus" geschaltet, ansonsten auf "Ein" -> Expertenprogramm

    Im Expertenprogramm habe ich zwei relevante Blöcke.
    Der erste generiert die Einschaltung der verscheidenen Lade-Freigaben (global für alle 16 Gruppenadressen):
    2020-09-23 00_15_57-Window.png

    Der zweite Block (je Gruppenadresse/Multibutton) realisiert auf Basis der (jeweiligen) Dropdown-Auswahl den (jeweiligen) Icon-Status und soll (jeweilige) Gruppenadresse multiplexen:
    2020-09-23 00_18_43-Window.png

    Das Programm funktionier bis auf das dynamsiche Schalten der Gruppenadresse auf Basis der jeweils zugeordneten internen Variable (HZ_Nacht_xh) ganz gut, nur das Multiplexen bekomme ich so nicht ins Ziel...

    - Habt ihr hierfür einen klugen Ratschlag?
    - Ich habe den Multibutton mit der Logik statt mit dem Experten verknüft, weil ich aus der Bedienungsanleitung heraus nciht schlau geworden bin, wie ich auf den Ausgang "Auswahl" bei Experten-Verknüpfung zugreifen kann. Das Icon zu drücken werte ich cniht aus, das ist irrelevant, interessant ist einig die eingestellte Option (Dropdown-Eintrag).

    #2
    Hi,

    allgemeine Anmerkung: du kannst direkt
    akt_Stunde = hour() verwenden, ohne stime. Anderenfalls wird zu jeder Sekunde die stime()-Funktion neu ausgewertet.

    Bei 16 identischen Funktionen empfehle ich dir, ein entsprechendes Makro anzulegen.

    Zur Auswertung des Multibuttons:

    if mbutton(ButtonID, 1) == 255 then {} endif
    if mbutton(ButtonID, 2) == 255 then {} endif
    ...
    reagiert auf die Auswahl statt das Icon. Achtung: Sehe eine "Bitte wählen"-Belegung vor, da sonst beim Start das erste Element ausgewählt ist, der Browser aber beim erneuten Auswählen keinen Event generiert, da sich die Auswahl ja nicht ändert.

    (Der Vollständigkeit halber:
    if mbutton(ButtonID, 1) == 1 then {} endif
    if mbutton(ButtonID, 2) == 2 then {} endif
    ...
    reagiert auf das Drücken des Icons, wenn das entsprechende Element ausgewählt ist.
    )

    Das Problem ist hier, dass du auf die Änderung der Uhrzeit reagieren willst, und nicht nur auf die Änderung der Variablen Reserve1_Ladung, oder?
    Zuletzt geändert von foobar0815; 23.09.2020, 13:09.

    Kommentar


      #3
      Moin,

      ich hoffe, ich habe deine Antwort größtenteils verstanden 😅
      Zitat von foobar0815 Beitrag anzeigen
      du kannst direkt akt_Stunde = hour() verwenden
      stimmt 🙄 hour() wird ja jede neue Stunde invalid, da neuer Zustand, oder? damit wird akt_Stunde = hour() stündlich neu ausgewertet... und bei Neustart auch... sollte so passen.

      Zitat von foobar0815 Beitrag anzeigen
      Bei 16 identischen Funktionen empfehle ich dir, ein entsprechendes Makro anzulegen.
      Makro habe ich auch schon drüber nachgedacht. Habe ich mich noch nicht mit beschäftigt bislang 😁

      Zitat von foobar0815 Beitrag anzeigen
      if mbutton(ButtonID, 1) == 255 then {} endif
      mbutton(ButtonID, Auswahl) == Rückgabewert
      • Ich habe den Button über den Visu-Editor angelegt und mit der Logik verknüpft damit ich hier auch gleich feste Namen im Button hinterlegen kann. DAs kann ich auf Experte ändern dafür muss ich aber einen eindeutigen Variablennamen angeben. Dann muss ich die Schriftart aber via Experte vorgeben, darum habe ich mich bislang gedrückt...
        • Was macht der eindeutige Variablenname?
        • Wo bekomme ich die Button-ID her? Ist das der Variablenname?
      • Auswahl ist in meinem Fall 1..4. Verstanden
      • Rückgabewert ist == Auswahl, wenn der Button gedrückt wird. Verstanden
      • Rückgabewert ist == 255, wenn der Dropdown-Eintrag geändert wird; nach Änderung ist der derjenige mit "Auswahl"= "Ausgewählter Eintrag" einen Zyklus aktiv. Verstanden
      Zitat von foobar0815 Beitrag anzeigen
      Sehe eine "Bitte wählen"-Belegung vor, da sonst beim Start das erste Element ausgewählt ist, der Browser aber beim erneuten Auswählen keinen Event generiert, da sich die Auswahl ja nicht ändert.
      Würde mich soweit nicht stören. Das erste Element ist "Aus", das ist nach einem Neustart eh das beste und ich spare mit ein Durchtippen um alle wieder auf "Aus" zu stellen. Neu bei einer definierten Ladung müsste ich dann eh ran...

      Zitat von foobar0815 Beitrag anzeigen
      Das Problem ist hier, dass du auf die Änderung der Uhrzeit reagieren willst, und nicht nur auf die Änderung der Variablen Reserve1_Ladung, oder?
      • Mit der Auswahl aus dem Multibutton möchte ich das Ladeverhalten ändern (1="Aus", 2="4h", 3="6h", 4="8h") --> Variable "xxx_Ladung"
      • Ist hier 1 ("Aus") gewählt wird das Icon inaktiv, bei jeder anderen Auswahl (2..4) aktiv. --> Variable "xxx_Nacht"
      • Ist hier eine Ladezeit gewählt (2..4), so soll die Ladung während der definierten Zeitspannen ("HZ_Nacht_4h, ..._6h, ..._8h) des jeweiligen Heizkörpers aktiviert werden, außerhalb dieser Zeitspannen wird der Wert auf 0 geschrieben --> Gruppenadresse "HZ_xxx-2/1/x"



      --------------------------------------------------------------------------
      Der Vollständigkeit halber:
      Um das Ganze am Ende noch komplizeirter zu machen wird die Ladung später noch von zwei weiteren Einstellugnen beeinflusst.
      Ladung über den ganzen Tag:
      • Nachts (22:00 - 06:00) beieinflusst die ausgewählte Nachtladung, ob der jeweilige Heizkörper geladen werden soll und wenn ja, wie lange.
      • Tagsüber (12:00 - 20:00 Uhr) kann je Heizkörper eine Tagladung über ein Bit (Variable "xxx_Tag") aktiviert werden.
      • Anstelle der Tagladung kann eine PV-Tagladung (06:00 - 22:00 Uhr) je Heizkörper aktiviert werden. Diese schaltet je nach vorhandem PV-Strom einzelne Heiizkörper zum Laden Ein und Aus.
      • Nachtladung, Tagladung und PV-Tagladung besitzen heirüber hinaus noch je einen golbalen Button, um diesen Ladetyp überhaupt freizugeben. Hierbei sind Tagladung und PV-Tagladung gegeneinander verriegelt (Wenn dann geht nur ein Ladetyp)
      Aber diesen Part muss ich überhaupt erstmal ausprogrammieren... Soweit bin ich noch nicht.
      Aktuell geht nur das globale Ein-und Ausschalten der Nachtladung (Schaltet das Schütz vor allen 16 Heizungsabgängen Im Zeitraum von 22:00 - 06:00 Uhr Ein wenn "Ein" oder halt nicht wenn auf "Aus").
      Zuletzt geändert von Latias1990; 23.09.2020, 16:25.

      Kommentar


        #4
        Ein wenig geupdated, heute Abend neuer Testlauf:

        2020-09-23 17_33_53-EibStudio v4.104 - Gartenstraße 22 [Getrennt].png 2020-09-23 17_39_50-EibStudio v4.104 - Gartenstraße 22 [Getrennt].png
        Zuletzt geändert von Latias1990; 23.09.2020, 16:41.

        Kommentar


          #5
          Zu den Makros: am besten, du orientierst dich an bestehenden Makros (bzw Bibliotheken), zB EnertexV2.

          Zitat von Latias1990 Beitrag anzeigen
          Was macht der eindeutige Variablenname? Wo bekomme ich die Button-ID her? Ist das der Variablenname?
          Genau. Jedes Visu-Element hat eigentlich eine ganzzahlige ID, über die die Funktionen wie pdisplay das Element ansprechen. Die ID wird vom Visu-Editor selbstständig angelegt. Bei "Verknüpfung mit Experten" wird diese ID zusätzlich in der Variable mit "eindeutigen Variablennamen" gespeichert, die du fortan als Element-ID nutzen kannst, zB NachtLadungReserve1. Seitenbezogene Elemente legen zudem noch NachtLadungReserve1_P an, für den Zugriff auf die ID der Seite.

          Zitat von Latias1990 Beitrag anzeigen
          • Mit der Auswahl aus dem Multibutton möchte ich das Ladeverhalten ändern (1="Aus", 2="4h", 3="6h", 4="8h") --> Variable "xxx_Ladung"
          • Ist hier 1 ("Aus") gewählt wird das Icon inaktiv, bei jeder anderen Auswahl (2..4) aktiv. --> Variable "xxx_Nacht"
          • Ist hier eine Ladezeit gewählt (2..4), so soll die Ladung während der definierten Zeitspannen ("HZ_Nacht_4h, ..._6h, ..._8h) des jeweiligen Heizkörpers aktiviert werden, außerhalb dieser Zeitspannen wird der Wert auf 0 geschrieben --> Gruppenadresse "HZ_xxx-2/1/x"
          Das Auswerten des MultiButton (Achtung: hatte beim letzten Beitrag mbutton geschrieben -> die Visu verwendet aber den mpbutton) und Ändern der Anzeige geht wie folgt:
          Angenommen, du hast den Button NachtLadungReserve1, dann brauchst du die beiden Varianten:
          Code:
          pdisplay([FONT=Courier New]NachtLadungReserve1,$$,NIGHT;INACTIVE,GREY,NachtLadungReserve1_P, NachtLadungReserve1_Auswahl[/FONT])
          pdisplay([FONT=Courier New]NachtLadungReserve1,$$,NIGHT;ACTIVE,GREY,NachtLadungReserve1_P, NachtLadungReserve1_Auswahl[/FONT])
          
          [FONT=Courier New]NachtLadungReserve1_Auswahl=1[/FONT]
          if mpbutton([FONT=Courier New]NachtLadungReserve1[/FONT], 1,[FONT=Courier New]NachtLadungReserve1_P[/FONT]) == 255 then [FONT=Courier New]NachtLadungReserve1_Auswahl=1[/FONT] endif
          if mpbutton([FONT=Courier New]NachtLadungReserve1[/FONT], 2,[FONT=Courier New]NachtLadungReserve1_P[/FONT]) == 255 then [FONT=Courier New]NachtLadungReserve1_Auswahl=2[/FONT] endif
          if mpbutton([FONT=Courier New]NachtLadungReserve1[/FONT], 3,[FONT=Courier New]NachtLadungReserve1_P[/FONT]) == 255 then [FONT=Courier New]NachtLadungReserve1_Auswahl=3[/FONT] endif
          if mpbutton([FONT=Courier New]NachtLadungReserve1[/FONT], 4,[FONT=Courier New]NachtLadungReserve1_P[/FONT]) == 255 then [FONT=Courier New]NachtLadungReserve1_Auswahl=4[/FONT] endif
          Wann soll denn das Schreiben auf die GA genau erfolgen? Mit jeder Änderung der Konfiguration (also Änderung von NachtLadungReserve1_Auswahl) oder nur bei jeder Stundenänderung, oder nur bei Beginn und Ende eines Intervalls, auch wenn sich zwischendurch die Konfiguration ändert? Das bestimmt, was in das äußere if als Bedingung muss.

          Kommentar


            #6
            Zitat von Latias1990 Beitrag anzeigen
            heute Abend neuer Testlauf
            Du kannst über's EibStudio die Uhrzeit verstellen und statt der internen Schnittstelle "Simulation" wählen. Das reduziert die Wartezeit und verhindert Quatsch auf dem Bus.

            Sieht auf den ersten Blick gut aus.
            Zuletzt geändert von foobar0815; 23.09.2020, 17:04.

            Kommentar


              #7
              Zitat von foobar0815 Beitrag anzeigen
              Wann soll denn das Schreiben auf die GA genau erfolgen? Mit jeder Änderung der Konfiguration (also Änderung von NachtLadungReserve1_Auswahl) oder nur bei jeder Stundenänderung, oder nur bei Beginn und Ende eines Intervalls, auch wenn sich zwischendurch die Konfiguration ändert? Das bestimmt, was in das äußere if als Bedingung muss.
              • Bei einer Konfigurationsänderung (Auswahl eines anderen Dropdown-Eintrages) sofort
                • Betrifft bei meiner aktuellen Programmierung aktuell nur das Ein-Signal
                • Aus-Signal falsl außerhalb der Ladezeit: da muss ich Nachbessern
              • Entsprechend der Konfuguration zeitgesteuert:
                • Startzeit = Ein
                • Ende = 06:00 Uhr = Aus)
              • Bei Neustart = Auswahl auf 1 ("Aus")
                • muss ich noch ergänzen.

              Kommentar


                #8
                So langsam komme ich dem ganzen näher. Die Buttons sidn zwar noch über den Umweg der Logik projektiert, aber es scheint erstmal zu laufen:

                2020-09-23 23_25_42-EibStudio v4.104 - Gartenstraße 22 [Getrennt].png

                2020-09-23 23_26_18-EibStudio v4.104 - Gartenstraße 22 [Getrennt].png

                Gerade die Fälle wie
                • Umschalten der Tagladung während die Nachtladung läuft (und umgekehrt)
                • Wechsel auf eine kürzere Nachtladung, wenn eine vorher gewählte, längere bereits gestartet ist
                waren ein wenig "nervig" aber sind jetzt mit abgefangen. Wenn es diese Nacht auf den beiden Reserve-Kanälen sauber läuft dann übernehme ich das morgen für die 14 aktuell angeschlossenen Heizungen.
                Zuletzt geändert von Latias1990; 23.09.2020, 22:33.

                Kommentar

                Lädt...
                X