Neue Blockly-Blöcke

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
guinnes
Beiträge: 146
Registriert: 21. Apr 2020 19:46
Answers: 0

Neue Blockly-Blöcke

Beitrag von guinnes »

Moin
Ich habe mich etwas näher mit Blockly in Openhab 3 beschäftigt und es gefällt mir immer besser. Da einige Dinge fehlten, habe ich die nachgebaut :
Block_Lib.jpg
Es handelt sich um :
Stringreplace
ParseFloat
ToString und
HTTPGet
Diese Bibliothek werde ich auch weiter pflegen. Hat jemand Intresse, dann stelle ich den Code hier ein
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Glückauf
guinnes

Harka
Beiträge: 487
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: Neue Blockly-Blöcke

Beitrag von Harka »

Hallo,
JA, bitte bitte bitte. Entgegen aller guten Vorsätze komme ich von Blockly nicht weg :)
Danke

Benutzeravatar
guinnes
Beiträge: 146
Registriert: 21. Apr 2020 19:46
Answers: 0

Re: Neue Blockly-Blöcke

Beitrag von guinnes »

Harka hat geschrieben: 24. Mär 2022 17:43 Entgegen aller guten Vorsätze komme ich von Blockly nicht weg :)
Und wenn du es nur zum editieren nimmst ;)

Code: Alles auswählen

uid: Guinnes_Helpers
tags: []
props:
  parameters: []
  parameterGroups: []
timestamp: Mar 23, 2022, 4:15:23 PM
component: BlockLibrary
config:
  name: Guinnes Helpers
slots:
  blocks:
    - component: BlockType
      config:
        args0:
          - check: String
            name: Text0
            type: input_value
          - check: String
            name: Text1
            type: input_value
          - check: String
            name: Text2
            type: input_value
        colour: 225
        helpUrl: ""
        message0: Ersetze im String %1 %2 durch %3
        output: String
        tooltip: ""
        type: Replace
      slots:
        code:
          - component: BlockCodeTemplate
            config:
              template: "{{input:Text0}}.replace({{input:Text1}},{{input:Text2}})"
    - component: BlockType
      config:
        args0:
          - check: String
            name: Text0
            type: input_value
        colour: 225
        helpUrl: ""
        message0: Zahl erzeugen aus %1
        output: Number
        tooltip: ""
        type: ParseFloat
      slots:
        code:
          - component: BlockCodeTemplate
            config:
              template: (parseFloat(String({{input:Text0}}).replace(",",".")))
    - component: BlockType
      config:
        args0:
          - check: String
            name: Text0
            type: input_value
        colour: 225
        helpUrl: ""
        message0: String erzeugen aus %1
        output: String
        tooltip: ""
        type: ToString
      slots:
        code:
          - component: BlockCodeTemplate
            config:
              template: (String({{input:Text0}}))
    - component: BlockType
      config:
        args0:
          - check: String
            name: URL
            type: input_value
        colour: 225
        helpUrl: ""
        message0: HTTP-Daten holen von %1
        output: String
        tooltip: Holt die HTTP-Daten der angegebenen URL
        type: HTTPGet
      slots:
        code:
          - component: BlockCodeTemplate
            config:
              template: "{{utility:HTTP_Get}}({{input:URL}})"
  utilities:
    - component: UtilityFunction
      config:
        code: >-
          function {{name}}(URL) {
            var HttpUtil = Java.type("org.openhab.core.io.net.http.HttpUtil");
            return HttpUtil.executeUrl("GET",URL, 2000);
          }
        name: HTTP_Get
Glückauf
guinnes

Harka
Beiträge: 487
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: Neue Blockly-Blöcke

Beitrag von Harka »

Danke noch mal. Gerade ParseFloat kommt schon regelmäßig zum Einsatz.
Ich habe mich, Dank Dir, nun auch mal damit näher beschäftigt. Meine bisherige Lösung für die Berechnung der Luftfeuchte gefiel mir nicht weil sie schlecht zu pflegen war. Also ...
BlocklyBibi.png

Code: Alles auswählen

uid: SensorFeuchte
tags: []
props:
  parameters: []
  parameterGroups: []
timestamp: Oct 22, 2023, 9:07:45 PM
component: BlockLibrary
config:
  name: Feuchte+Runden+setInterval
slots:
  blocks:
    - component: BlockType
      config:
        args0:
          - name: Eingang
            type: input_value
          - name: Komma
            type: input_value
        colour: 225
        message0: Runde %1 mit %2 Nachkommastellen
        output: ""
        tooltip: Rundet auf x Nachkommastellen
        type: Number
      slots:
        code:
          - component: BlockCodeTemplate
            config:
              template: "{{utility:fRoundBlock}}({{input:Eingang}},{{input:Komma}})"
        toolbox:
          - component: PresetInput
            config:
              fields:
                NUM: 1
              name: Komma
              shadow: true
              type: math_number
          - component: PresetInput
            config:
              fields:
                NUM: 3.14159
              name: Eingang
              shadow: true
              type: math_number
    - component: BlockType
      config:
        args0:
          - name: Ausgabe
            options:
              - - Feuchte g/m3
                - af
              - - Taupunkt °C
                - tt
              - - Dampfdruck hPa
                - dd
            type: field_dropdown
          - name: relativ
            type: input_value
          - align: right
            name: temp
            type: input_value
        colour: 225
        helpUrl: https://www.smarthome-tricks.de/iobroker-scriptsammlung/taupunkt-berechnen/
        lastDummyAlign0: right
        message0: "%1 aus rel.Feuchte %2 und Temperatur %3"
        output: Number
        tooltip: errechnet die absolute Feuchte, Taupunkt und Dampfdruck aus der relativen Feuchte(%) und der Temperatur (°C)
      slots:
        code:
          - component: BlockCodeTemplate
            config:
              template: "{{utility:taupunkt}}({{input:relativ}},{{input:temp}}).{{field:Ausgabe}}"
        toolbox:
          - component: PresetInput
            config:
              name: relativ
              shadow: true
              type: oh_item
          - component: PresetInput
            config:
              name: temp
              shadow: true
              type: oh_item
    - component: BlockType
      config:
        type: Block1
        message0: set_Interval     sek =%1 repeat =%2 timer %3 %4
        args0:
          - type: input_value
            name: iZeit
          - type: input_value
            name: iCounter
          - type: input_value
            name: setIntervalID
          - type: input_statement
            name: timer_statement
        colour: 0
        tooltip: Alternative zum Reschedule Timer
        helpUrl: https://www.openhab.org/addons/automation/jsscripting/#setinterval
        nextStatement: Any
        previousStatement: Any
        inputsInline: true
      slots:
        code:
          - component: BlockCodeTemplate
            config:
              template: >
                if (typeof(this[{{input:setIntervalID}}]) != 'undefined') clearInterval(this[{{input:setIntervalID}}]); this[{{input:setIntervalID}}+"_C"] = 0;  this[{{input:setIntervalID}}] = setInterval(function() {
                  {{statements:timer_statement}}
                  this[{{input:setIntervalID}}+"_C"]++;
                  if (this[{{input:setIntervalID}}+"_C"] >= {{input:iCounter}}) clearInterval(this[{{input:setIntervalID}}]);
                }, {{input:iZeit}}*1000);
        toolbox:
          - component: PresetInput
            config:
              fields:
                NUM: 2
              name: iZeit
              shadow: true
              type: math_number
          - component: PresetInput
            config:
              fields:
                NUM: 10
              name: iCounter
              shadow: true
              type: math_number
          - component: PresetInput
            config:
              fields:
                TEXT: myInterval
              name: setIntervalID
              shadow: true
              type: text
    - component: BlockType
      config:
        type: Block2
        message0: clear_Interval %1
        args0:
          - type: input_value
            name: setIntervalID
        colour: 0
        tooltip: ""
        helpUrl: ""
        nextStatement: Any
        previousStatement: Any
        inputsInline: true
      slots:
        code:
          - component: BlockCodeTemplate
            config:
              template: >
                if (typeof(this[{{input:setIntervalID}}]) != 'undefined') clearInterval(this[{{input:setIntervalID}}]);
        toolbox:
          - component: PresetInput
            config:
              fields:
                TEXT: myInterval
              name: setIntervalID
              shadow: true
              type: text
  utilities:
    - component: UtilityFunction
      config:
        code: >
          function {{name}}(i ,k) {
                var ein = parseFloat(String(i).replace(",","."));
                var kom = parseFloat(String(k).replace(",","."));
                return +(Math.round(ein + ("e+" + kom)) + ("e-" + kom ));
          }
        name: fRoundBlock
    - component: UtilityFunction
      config:
        code: >
          function {{name}}(rel ,temp) {
                  var r = items.getItem(rel).numericState;
                  var t = items.getItem(temp).numericState;
                  var mw = 18.016;  
                  var gk = 8314.3;     
                  var t0 = 273.15;     
                  var tk = t + t0;    
                  var a, b;     
                  if (t >= 0) {
                    a = 7.5;
                    b = 237.3;
                  } else if (t < 0) {
                    a = 7.6;
                    b = 240.7;
                  }    
                  var sdd = 6.1078 * Math.pow(10, (a*t)/(b+t)); 
                  var dd = sdd * ((parseFloat(String(r).replace(",",".")))/100);
                  var af = Math.pow(10,5) * mw/gk * dd/tk;    
                  af = Math.round(af * 1000)/1000; 
                  var v =  Math.log(dd/6.1078)/ 2.302585092994046;
                  var tt = (b*v) / (a-v);
                  tt = Math.round(tt * 100)/100;
                  return { tt: tt, af: af, dd: dd };
          }
        name: taupunkt
Ev. brauch ja jemand das gleiche oder hat selbst eine Unterfunktion welche er gern in einen Block verwenden möchte.

E: Die Berechnung der Feuchte wurde an OH 4 angepasst. Zusätzlich zur absoluten Feuchte kann nun auch der Taupunkt oder den Dampfdruck berechnen werden. Rückgabe erfolgt immer ungerundet und ohne UoM.

Nachtrag: Block zum Runden auf x Nachkommastellen hinzugefügt (E: Das Runden ist in OH 4 bereits integriert.)

Nachtrag: Blöcke für setInterval hinzugefügt
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von Harka am 22. Okt 2023 21:56, insgesamt 12-mal geändert.

Benutzeravatar
guinnes
Beiträge: 146
Registriert: 21. Apr 2020 19:46
Answers: 0

Re: Neue Blockly-Blöcke

Beitrag von guinnes »

Moin
Ich hab da noch einen eingebaut, den Google scheinbar vergessen hat :
Die Stringfunktionen equalsIgnoreCase, startsWith, endsWith und matches
( Wobei ich matches nicht probieren kann, da ich mich mit Regular Expressions nicht auskenne ) :oops:

Code: Alles auswählen

    - component: BlockType
      config:
        args0:
          - check: String
            name: Text0
            type: input_value
          - name: FUNK
            options:
              - - Ist gleich ( Ohne CharCase)
                - equalsIgnoreCase
              - - Beginnt mit
                - startsWith
              - - Endet mit
                - endsWith
              - - matches RegEx
                - matches
            type: field_dropdown
          - check: String
            name: Text1
            type: input_value
        colour: 225
        helpUrl: ""
        message0: "%1 %2  %3"
        inputsInline: true
        output: Boolean
        tooltip: ""
        type: String_Check
      slots:
        code:
          - component: BlockCodeTemplate
            config:
              template: "{{input:Text0}}.{{field:FUNK}}({{input:Text1}})"
        toolbox:
          - component: PresetInput
            config:
              fields:
                TEXT: TextVariable
              name: Text0
              shadow: true
              type: text
Dazu hab ich die ZonedDateTime-Bibliothek von https://community.openhab.org/t/date-and-time/131329 überarbeitet, weil die nicht richtig getan hat. Bei Interesse einfach melden
Für Tasmota geflashte Gosund-Zwischenstecker und Shelly1PMs gibts auch noch Blöcke, die den JSON-String auf die einzelnen Items verteilen
Glückauf
guinnes

Harka
Beiträge: 487
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: Neue Blockly-Blöcke

Beitrag von Harka »

Hi, habe beim vorletztem Beitrag mal noch was eingefügt. Ich musste in der letzten Zeit öfters auf x Nachkommastellen runden. Der normale Weg "(Math.round(3.14159 * 100) / 100)" gefiel mir nicht zumal der "get state of item"-Block nicht direkt eingefügt werden kann.
Meine Lösung:
Runden.jpg
E: ist ab OH 4 nicht mehr nötig weil es unter Math.round eine entsprechende Option "by decimals" gibt.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Harka
Beiträge: 487
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: Neue Blockly-Blöcke

Beitrag von Harka »

Ich brauchte innerhalb kurzer Zeit mehrmals einen sich wiederholenden Timer wie in https://www.openhab.org/docs/configurat ... dule-timer.
Leider ist da unter OH4.0 ein Fehler enthalten (ist bekannt) und mir auch zu umständlich in der Anwendung.
Daher gibt es hier nun zusätzlich auch eine Implementierung von setInterval mit integrierter Begrenzung der Wiederholungen und der Option zum vorzeitigem Ausstieg (clear_Interval). Im Feld für die Zeit können auch Nachkommastellen genutzt werden (zum Beispiel 1.5 sek)
setInterval.png
Beim Feuchterechner kann nun zusätzlich zur absoluten Feuchte nun auch der Taupunkt oder den Dampfdruck per Auswahlfeld berechnen werden.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

hoerbp
Beiträge: 3
Registriert: 17. Dez 2023 09:02
Answers: 0

Re: Neue Blockly-Blöcke

Beitrag von hoerbp »

Hey Leute, ich find das echt genial das ihr da einen Blockly block für die Berechnung erstellt habt. So etwas hab ich schon lange für OH gesucht.
Mein problem ist nur das ich mit mit Blocky bzw. den Skripten überhaupt nicht auskenne. Wie bekommen ich denn die Absolute Feuchte oder den Taupunkt in ein Item geschrieben?
Vielen Dank für eure Bereitstellung und Hilfe : )
LG
Hört

Harka
Beiträge: 487
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: Neue Blockly-Blöcke

Beitrag von Harka »

Moin,
links oben im Hamburger-Menü findest Du Entwickler_Tools/Block_Libraries. Nun dort auf (+) klicken und den erscheinenden YAML-Code durch den Code oben ersetzen und speichern. Anschließend findest Du in Blockly unter Libraries einen neuen Eintrag.

hoerbp
Beiträge: 3
Registriert: 17. Dez 2023 09:02
Answers: 0

Re: Neue Blockly-Blöcke

Beitrag von hoerbp »

Danke das hab ich schon geschafft : )
Aber wie bekomme ich nun den Wert in ein Item gesendet?

Antworten