Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. Rechnen mit Variablen in Blockly

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Rechnen mit Variablen in Blockly

    This topic has been deleted. Only users with topic management privileges can see it.
    • Homoran
      Homoran Global Moderator Administrators last edited by Homoran

      kann man mit Variablen in Blockly eigentlich nicht rechnen?

      Ich versuche mich gerade an einem für meine Verhältnisse fortgeschrittenen Programm. Hier will ich mit Variablen arbeiten:

      Heizungsblockly01.png

      Für @paul53 auch als Text:

      var Verbrauch, Alter_Wert, Solltemperatur;
      
      
      Verbrauch = 0;
      Alter_Wert = 0;
      Solltemperatur = 24.1;
      on({id: new RegExp('hm-rega\\.0\\.54003' + "|" + 'hm-rpc\\.0\\.JRT0001572\\.1\\.STATE' + "|" + 'hm-rpc\\.0\\.JEQ0064523\\.1\\.TEMPERATURE'), change: "ne"}, function (obj) {
          if (getState("hm-rega.0.54003").val > (obj.oldState ? obj.oldState.val : "")) {
          console.log('Heizung angeschaltet!');
          Alter_Wert = getState("hm-rpc.0.NEQ0384904.2.ENERGY_COUNTER").val;
        } else if (getState("hm-rega.0.54003").val == true && getState("hm-rpc.0.JEQ0064523.1.TEMPERATURE").val < Solltemperatur - 0.2 && getState("hm-rpc.0.JRT0001572.1.STATE").val == 0) {
          setState("hm-rpc.0.NEQ0384904.1.STATE"/*Badheizung:1.STATE*/, true);
          console.log((['Temperatur soll: ',Solltemperatur,', Temperatur ist: ',getState("hm-rpc.0.JEQ0064523.1.TEMPERATURE").val].join('')));
        } else if (getState("hm-rega.0.54003").val == true && (getState("hm-rpc.0.JEQ0064523.1.TEMPERATURE").val >= Solltemperatur + 0.2 || getState("hm-rpc.0.JRT0001572.1.STATE").val != 0)) {
          setState("hm-rpc.0.NEQ0384904.1.STATE"/*Badheizung:1.STATE*/, false);
          console.log((['Temperatur soll: ',Solltemperatur,', Temperatur ist: ',getState("hm-rpc.0.JEQ0064523.1.TEMPERATURE").val].join('')));
        } else if (getState("hm-rega.0.54003").val == false) {
          setState("hm-rpc.0.NEQ0384904.1.STATE"/*Badheizung:1.STATE*/, false);
          Verbrauch = getState("hm-rpc.0.NEQ0384904.2.ENERGY_COUNTER").val - Alter_Wert;
          console.log(('Stromverbrauch: ' + String(Verbrauch)));
        }
      });
      

      Die Heizung soll nach den eingegebene Werten schlten, leider schaltet sie in meinen Augen immer zu früh. (An schon bei 23.9 und aus bei 24.1)
      Daraufhin habe ich mir die Debug-Bausteine eingebaut und prompt war die letzte Schaltung korrekt, was aber nichts heißen muss wenn der Wert einfach zu schnell fäält/steigt:

      EDIT: so soll er nicht schalten, um 2019-05-26 21:29:25.576 sprang die Heizung an:

      javascript.0	2019-05-26 21:29:25.576	info	script.js.Wetter_und_Klima.Badheizung: Temperatur soll: 24.1, Temperatur ist: 23.9
      javascript.0	2019-05-26 21:12:31.485	info	script.js.Wetter_und_Klima.Badheizung: Temperatur soll: 24.1, Temperatur ist: 24.4
      javascript.0	2019-05-26 21:09:45.472	info	script.js.Wetter_und_Klima.Badheizung: Temperatur soll: 24.1, Temperatur ist: 24.5
      javascript.0	2019-05-26 21:08:24.268	info	script.js.Wetter_und_Klima.Badheizung: Heizung angeschaltet!
      

      Im Text-Output würde ich Klammern setzen:

      statt

      getState("hm-rpc.0.JEQ0064523.1.TEMPERATURE").val < Solltemperatur - 0.2
      

      würde ich schreiben

      getState("hm-rpc.0.JEQ0064523.1.TEMPERATURE").val < (Solltemperatur - 0.2)
      

      Ist das der Grund?
      Dann müsste ich wahrscheinlich vorab noch zwei weitere Variablen "Obergrenze" und "Untergrenze" definieren und dort direkt die Differenz bilden, oder?

      Danke für Hilfe

      paul53 1 Reply Last reply Reply Quote 0
      • paul53
        paul53 @Homoran last edited by paul53

        @Homoran sagte:

        Ist das der Grund?

        Nein, Klammern sind nicht erforderlich (Priorisierung). Javascript ist nicht HM Script.

        Was soll der Vergleich: Wert von Bad_heizen > vorheriger Wert bei 3 Triggerdatenpunkten ? Woher soll der Vergleich wissen, wer gerade getriggert hat ?

        Homoran 1 Reply Last reply Reply Quote 0
        • Homoran
          Homoran Global Moderator Administrators @paul53 last edited by

          @paul53 sagte in Rechnen mit Variablen in Blockly:

          Woher soll der Vergleich wissen, wer gerade getriggert hat ?

          Da gebe ich dir Recht! Aber das ist nicht das Problem, das hat seltsamerweise immer funktioniert.

          Dieser Block sollte nur wenn die Sysvar erstmalig von false auf true geht wirken.
          Dann muss ich das mal mit einer weiteren Variable "erstmalig" versuchen

          Danke

          PS habe gerade noch ein zweites Programm gefunden, von dem ich gar nicht wusste, dass ich es habe. muss mal sehen ob das gestört hat

          Homoran 1 Reply Last reply Reply Quote 0
          • Homoran
            Homoran Global Moderator Administrators @Homoran last edited by

            Es scheint so als seien die Funktionen "kleiner/größer" und "kleiner/größer gleich" vertauscht, Die Heizung schaltet schon bei 0,2 Differenz an, obwohl da <Wert-2 steht und umgekehrt bei Wert+2 noch nicht ab, obwohl dort größer gleich steht.

            Ansonsten scheint alles zu Laufen, hier noch mal das Blockly (obere Hälfte)Heizungsblockly02.png

            und der Quelltext:

            var erstmalig, Verbrauch, Alter_Wert, Solltemperatur;
            
            
            erstmalig = false;
            Verbrauch = 0;
            Alter_Wert = 0;
            Solltemperatur = 24.1;
            on({id: new RegExp('hm-rega\\.0\\.54003' + "|" + 'hm-rpc\\.0\\.JRT0001572\\.1\\.STATE' + "|" + 'hm-rpc\\.0\\.JEQ0064523\\.1\\.TEMPERATURE'), change: "ne"}, function (obj) {
                if (getState("hm-rega.0.54003").val == true && erstmalig == false) {
                erstmalig = true;
                console.log('Heizung angeschaltet!');
                Alter_Wert = getState("hm-rpc.0.NEQ0384904.2.ENERGY_COUNTER").val;
              } else if (getState("hm-rega.0.54003").val == true && getState("hm-rpc.0.NEQ0384904.1.STATE").val == false && getState("hm-rpc.0.JEQ0064523.1.TEMPERATURE").val < Solltemperatur - 0.2 && getState("hm-rpc.0.JRT0001572.1.STATE").val == 0) {
                setState("hm-rpc.0.NEQ0384904.1.STATE"/*Badheizung:1.STATE*/, true);
                console.log((['Untergrenze! ','Temperatur soll: ',Solltemperatur,', Temperatur ist: ',getState("hm-rpc.0.JEQ0064523.1.TEMPERATURE").val].join('')));
              } else if (getState("hm-rega.0.54003").val == true && getState("hm-rpc.0.NEQ0384904.1.STATE").val == true && (getState("hm-rpc.0.JEQ0064523.1.TEMPERATURE").val >= Solltemperatur + 0.2 || getState("hm-rpc.0.JRT0001572.1.STATE").val != 0)) {
                setState("hm-rpc.0.NEQ0384904.1.STATE"/*Badheizung:1.STATE*/, false);
                console.log((['Obergrenze! ','Temperatur soll: ',Solltemperatur,', Temperatur ist: ',getState("hm-rpc.0.JEQ0064523.1.TEMPERATURE").val].join('')));
              } else if (getState("hm-rega.0.54003").val == false) {
                setState("hm-rpc.0.NEQ0384904.1.STATE"/*Badheizung:1.STATE*/, false);
                Verbrauch = getState("hm-rpc.0.NEQ0384904.2.ENERGY_COUNTER").val - Alter_Wert;
                erstmalig = false;
                console.log(('Stromverbrauch: ' + String(Verbrauch)));
              }
            });
            

            Ist das ein bekanntes Issue mit > / >= ?

            paul53 2 Replies Last reply Reply Quote 0
            • paul53
              paul53 @Homoran last edited by paul53

              @Homoran sagte:

              Ist das ein bekanntes Issue mit > / >= ?

              Nein, das funktioniert.
              Was ist Griff Bad ? Damit hast Du eine Oder-Verküpfung:
              Temperatur >= Soll + 0,2 ODER Wert Griff bad != 0

              Homoran 1 Reply Last reply Reply Quote 0
              • paul53
                paul53 @Homoran last edited by paul53

                @Homoran Vorschlag (verkürzt):

                Blockly_2Punkt_Hzg_mFenster.JPG

                1 Reply Last reply Reply Quote 0
                • Homoran
                  Homoran Global Moderator Administrators @paul53 last edited by Homoran

                  @paul53 sagte in Rechnen mit Variablen in Blockly:

                  Was ist Griff Bad ?

                  Das ist der Fensterdrehgriffsensor. Wenn ich mach dem Baden das Fenster öffne und vergesse dass die Heizung eigentlich noch läuft, soll sie icht die Straße heizen, wenn die Temperatur fällt.

                  @paul53 sagte in Rechnen mit Variablen in Blockly:

                  Nein, das funktioniert.

                  Klar funktioniert es, nur vertauscht >= hat anscheinend die Funktion von > und umgekehrt. (Bei < ebenso).

                  @paul53 sagte in Rechnen mit Variablen in Blockly:

                  (verkürzt)

                  Hätte mich auch gewundert, wenn da nicht noch von dir etwas optimiertes käme 😂
                  Seh ich mir an! Danke!

                  Edit
                  Erster Eindruck: Die Verbrauchsberechnung ist raus.

                  paul53 1 Reply Last reply Reply Quote 0
                  • paul53
                    paul53 @Homoran last edited by paul53

                    @Homoran sagte:

                    Die Verbrauchsberechnung ist raus.

                    Alter Wert kann man sich nicht in einer Variablen merken, denn deren Wert überlebt keinen Neustart vom Skript / Adapter / ioBroker / OS. Dafür benötigt man einen Datenpunkt.

                    Wenn ich Blockly programmieren würde, würde es etwa so aussehen:

                    Blockly_2Punkt_Hzg_mFenster.JPG

                    Die Datenpunkt-Zuordnung ergibt sich aus den Variablennamen.

                    Homoran 1 Reply Last reply Reply Quote 0
                    • Homoran
                      Homoran Global Moderator Administrators @paul53 last edited by Homoran

                      @paul53 sagte in Rechnen mit Variablen in Blockly:

                      Die Datenpunkt-Zuordnung ergibt sich aus den Variablennamen.

                      Klar, kein Problem 😉

                      @paul53 sagte in Rechnen mit Variablen in Blockly:

                      Alter Wert kann man sich nicht in einer Variablen merken, denn deren Wert überlebt keinen Neustart vom Skript / Adapter / ioBroker / OS.

                      Ist in diesem Fall nicht ganz so schlimm, da die Berechnungsfunktion ja nur etw 2-3 Stunden halten muss.
                      Das Bad hat leider eine Unterdeckung im Wärmebedarf und ich schlate vor dem Baden immer die Zusatzheizung an, damit sich die Wände ein wenig aufwärmen und nicht so viel Kondenswasser bildet.
                      Jetzt soll das Bad renoviert werden und evtl. eine Infrarotheizung mit eingebaut werden. Ich würde gerne mal abschätzen welche Leistung diese haben müsste, wenn sie dauernd (mit so einem Programm gesteuert) läuft.

                      Sinn DIESES Programms ist:

                      • Taster im Bad drücken
                      • Sysvar "Bad_heizen" wird auf true gesetzt
                      • Heizung läuft im angegebenen Temperaturbereich intervallweise
                      • Nach dem Baden sollte ich die Heizungsbereitschaft über den Taster wieder abschalten.
                      • SysVar wird auf false gesetzt
                      • Sollte ich das vergessen, weill die Heizung gerade in Standby steht und ich das Fenster öffnen, soll sie natürlich nicht die nächste Stunde bei offenenm Fenster laufen
                      • jetzt neu: zum Abschluss hätte ich gerne die verbrauchte Energie

                      @paul53 sagte in Rechnen mit Variablen in Blockly:

                      Wenn ich Blockly programmieren würde,

                      Ich weiß, aber ich bin noch nicht so weit für pure js 😞

                      @paul53 sagte in Rechnen mit Variablen in Blockly:

                      würde es etwa so aussehen:

                      Da muss ich mich mal reinarbeiten. Funktionen wollte ich immer schon lernen.

                      Nochmals besten Dank!

                      Rababersaft 1 Reply Last reply Reply Quote 0
                      • Rababersaft
                        Rababersaft @Homoran last edited by Rababersaft

                        @Homoran
                        Of topic. Fast.
                        baulich gesehen, ohne jetzt wem vorwegnehmen oder belehren zu wollen, würde ich bei einer Renovierung, anstatt einer Infrarotheizung eher eine Wandheizung a la Fußbodenheizung installieren. Und die dann Steuern. Is nicht sichtbar und hat aber trotzdem die gewünschte Funktion.
                        Hab ich bei mir, im Bad, inkl. Spiegelheizung. Leider noch vor dem iobroker Projekt realisiert... Daher nicht geregelt, aber echt praktisch....

                        Homoran 1 Reply Last reply Reply Quote 0
                        • Homoran
                          Homoran Global Moderator Administrators @Rababersaft last edited by

                          @Rababersaft
                          Da hatte ich auch schon drüber nachgedacht.
                          Dazu müsste aber ausreichend Wand vorhanden sein in der keine Anschlüsse liegen.
                          Spiegelheizung bei einem 3,5 qm großen spiegel hab ich auch schon drüber nachgedacht.

                          Warum meinst du hat das Bad diese Unterdeckung?
                          Fußbodenheizung bei 5qm Raum reicht halt nicht. Das sind 12,5 cbm raum

                          Andererseits ist es keine große Renovierung. Lediglich die Badewanne soll einer großen Dusche weichen um das Bad für das Alter das unaufhörlich näherkommt vorzubereiten.

                          Rababersaft 1 Reply Last reply Reply Quote 0
                          • Rababersaft
                            Rababersaft @Homoran last edited by

                            @Homoran sagte in Rechnen mit Variablen in Blockly:

                            @Rababersaft

                            Warum meinst du hat das Bad diese Unterdeckung?
                            Fußbodenheizung bei 5qm Raum reicht halt nicht. Das sind 12,5 cbm raum

                            Hmmm, ich meinte, das es am schönsten ist mit ner Wandheizung. Man kann es fühlen wenn man in den Raum kommt (kann auch sein dass es Einbildung ist). Und, evtl nicht ganz unerheblich, verschiebt man dadurch den Taupunkt weiter nach außen.
                            (Hab ein alleinstehendes Haus...)
                            Daher war damals, bei meiner Renovierung, die Überlegung nicht weit, die Wände auch gleich mit zu bearbeiten. Freu nach dem Motto: wenn ich schon mal dabei bin... 😊

                            (Aber jetzt sind wir Off topic) 😉😎

                            1 Reply Last reply Reply Quote 0
                            • First post
                              Last post

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            899
                            Online

                            31.7k
                            Users

                            79.7k
                            Topics

                            1.3m
                            Posts

                            blockly
                            3
                            12
                            2202
                            Loading More Posts
                            • Oldest to Newest
                            • Newest to Oldest
                            • Most Votes
                            Reply
                            • Reply as topic
                            Log in to reply
                            Community
                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                            The ioBroker Community 2014-2023
                            logo