Seite 1 von 2

Neue Blockly-Blöcke

Verfasst: 23. Mär 2022 18:47
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

Re: Neue Blockly-Blöcke

Verfasst: 24. Mär 2022 17:43
von Harka
Hallo,
JA, bitte bitte bitte. Entgegen aller guten Vorsätze komme ich von Blockly nicht weg :)
Danke

Re: Neue Blockly-Blöcke

Verfasst: 24. Mär 2022 18:43
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

Re: Neue Blockly-Blöcke

Verfasst: 2. Apr 2022 09:49
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

Re: Neue Blockly-Blöcke

Verfasst: 3. Apr 2022 19:29
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

Re: Neue Blockly-Blöcke

Verfasst: 12. Jul 2022 20:08
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.

Re: Neue Blockly-Blöcke

Verfasst: 19. Okt 2023 15:30
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.

Re: Neue Blockly-Blöcke

Verfasst: 17. Dez 2023 09:14
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

Re: Neue Blockly-Blöcke

Verfasst: 17. Dez 2023 10:07
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.

Re: Neue Blockly-Blöcke

Verfasst: 17. Dez 2023 13:53
von hoerbp
Danke das hab ich schon geschafft : )
Aber wie bekomme ich nun den Wert in ein Item gesendet?