Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Praktische Anwendungen (Showcase)
  4. Blockly: CreateMyState: Datenpunkte mit Unit/States

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.9k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.3k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.5k

Blockly: CreateMyState: Datenpunkte mit Unit/States

Geplant Angeheftet Gesperrt Verschoben Praktische Anwendungen (Showcase)
11 Beiträge 3 Kommentatoren 996 Aufrufe 6 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • BananaJoeB Online
    BananaJoeB Online
    BananaJoe
    Most Active
    schrieb am zuletzt editiert von BananaJoe
    #1

    Update: Hier ist Version 5 des Skriptes:
    d163ba3b-cf42-44d0-b2d8-164a46936452-image.png
    Änderungen:

    • Man kann nun auch eine Role angeben
    • Nicht genutzte Paramater können auch weggelassen werden.

    a7a0170f-4110-4b28-8406-b2d552d87291-image.png
    ea9cf97e-9435-45bc-9c34-025ca32f9958-image.png

    Für den Import in Blockly:

    <block xmlns="https://developers.google.com/blockly/xml" type="procedures_defcustomnoreturn" id="l(.(|wVZ(GS{-P%@qK=|" x="38" y="-1112">
      <mutation statements="false">
        <arg name="RootPath" varid=",%o6YJ)eJJ0Ug#A.g^(q"></arg>
        <arg name="ValueName" varid="5K8ECZE+lpGc{@BQXb!W"></arg>
        <arg name="TargetType" varid="!-(EoW{]I%^4o]}Wf0IU"></arg>
        <arg name="TargetIsWriteable" varid="2NeMF,lRvUfhS/0US`~("></arg>
        <arg name="TargetUnit" varid="pEXy5(i!?xF*I2u|UIbk"></arg>
        <arg name="TargetStates" varid="#uwxtf=vtV#969jS3HqG"></arg>
        <arg name="TargetDefaultValue" varid="oS^boSLi7Wy4dN^qi{ek"></arg>
        <arg name="TargetRole" varid="*~l#H;G$`OPF.N)|C;xZ"></arg>
      </mutation>
      <field name="NAME">CreatyMyStateV5</field>
      <field name="SCRIPT">Ly8gUHLDvGZ1bmcgb2IgUm9vdFBhdGggZWluZW4gUHVua3QgYW0gRW5kZSBoYXQsIHdlbm4gbmVpbiBlaW5lbiBhbmjDpG5nZW4uDQppZiAoUm9vdFBhdGguc2xpY2UoLTEpICE9ICIuIikgew0KICAgIFJvb3RQYXRoID0gUm9vdFBhdGggKyAiLiINCn0NCg0KLy8gUHLDvGZ1bmcgb2IgU3RhdGVzIGFuZ2VnZWJlbiB3dXJkZW4uIFdlbm4gamEgdmVyYXJiZWl0ZW4uDQp2YXIgc19zdGF0ZXMgPSAiIjsNCnZhciBzdGF0ZXMgPSBuZXcgT2JqZWN0KCk7DQppZiAoVGFyZ2V0U3RhdGVzICE9IG51bGwpIHsNCiAgICBzX3N0YXRlcyA9ICd7Jw0KICAgIGZvciAodmFyIGlfaW5kZXggaW4gVGFyZ2V0U3RhdGVzKSB7DQogICAgICAgIHNfc3RhdGV0ZW1wID0gVGFyZ2V0U3RhdGVzW2lfaW5kZXhdOw0KICAgICAgICBhX3N0YXRldGVtcCA9IHNfc3RhdGV0ZW1wLnNwbGl0KCI6Iik7DQogICAgICAgIHNfc3RhdGVzID0gc19zdGF0ZXMgKyAnIicgKyBhX3N0YXRldGVtcFswXSArICciOiInICsgYV9zdGF0ZXRlbXBbMV0gKyAnIiwnDQogICAgfQ0KICAgIHNfc3RhdGVzID0gc19zdGF0ZXMuc2xpY2UoMCwgLTEpOw0KICAgIHNfc3RhdGVzID0gc19zdGF0ZXMgKyAifSINCiAgICAvLyB1bmQgaW4gZWluIE9iamVrdCB1bXdhbmRlbG4NCiAgICBzdGF0ZXMgPSBKU09OLnBhcnNlKHNfc3RhdGVzKTsNCn0NCmlmICghVGFyZ2V0Um9sZSkgew0KICAgIFRhcmdldFJvbGUgPSAic3RhdGUiOw0KfQ0KDQovLyBWYXJpYW50ZSBkZXIgRXJzdGVsbHVuZyBwcsO8ZmVuOg0KaWYgKCFUYXJnZXRVbml0ICYmICFzX3N0YXRlcykgew0KICAgIC8vIEtlaW5lIEVpbmhlaXQgdW5kIGtlaW5lIFN0YXRlcyBhbmdlZ2ViZW4NCiAgICAvL2NvbnNvbGUubG9nKCJLZWluZSBFaW5oZWl0IHVuZCBrZWluZSBTdGF0ZXMgYW5nZWdlYmVuIik7DQogICAgYXdhaXQgY3JlYXRlU3RhdGVBc3luYygNCiAgICAgICAgUm9vdFBhdGggKyBWYWx1ZU5hbWUsIA0KICAgICAgICBUYXJnZXREZWZhdWx0VmFsdWUsIA0KICAgICAgICB7IA0KICAgICAgICAgICAgdHlwZTogVGFyZ2V0VHlwZSwgDQogICAgICAgICAgICBuYW1lOiBWYWx1ZU5hbWUsIA0KICAgICAgICAgICAgcmVhZDogdHJ1ZSwgDQogICAgICAgICAgICB3cml0ZTogVGFyZ2V0SXNXcml0ZWFibGUsDQogICAgICAgICAgICByb2xlOiBUYXJnZXRSb2xlDQogICAgICAgIH0NCiAgICApOw0KfSBlbHNlIGlmIChUYXJnZXRVbml0ICYmICFzX3N0YXRlcykgew0KICAgIC8vIEVpbmhlaXQgYW5nZWdlYmVuLCBhYmVyIGtlaW5lIFN0YXRlcw0KICAgIC8vY29uc29sZS5sb2coIkVpbmhlaXQgYW5nZWdlYmVuLCBhYmVyIGtlaW5lIFN0YXRlcyIpOw0KICAgIGF3YWl0IGNyZWF0ZVN0YXRlQXN5bmMoDQogICAgICAgIFJvb3RQYXRoICsgVmFsdWVOYW1lLA0KICAgICAgICBUYXJnZXREZWZhdWx0VmFsdWUsIA0KICAgICAgICB7IA0KICAgICAgICAgICAgdHlwZTogVGFyZ2V0VHlwZSwgDQogICAgICAgICAgICBuYW1lOiBWYWx1ZU5hbWUsIA0KICAgICAgICAgICAgcmVhZDogdHJ1ZSwgDQogICAgICAgICAgICB3cml0ZTogVGFyZ2V0SXNXcml0ZWFibGUsDQogICAgICAgICAgICB1bml0OiBUYXJnZXRVbml0LA0KICAgICAgICAgICAgcm9sZTogVGFyZ2V0Um9sZQ0KICAgICAgICB9DQogICAgKTsNCn0gZWxzZSBpZiAoIVRhcmdldFVuaXQgJiYgc19zdGF0ZXMpIHsNCiAgICAvLyBTdGF0ZXMgYW5nZWdlYmVuLCBhYmVyIGtlaW5lIEVpbmhlaXQNCiAgICAvL2NvbnNvbGUubG9nKCJTdGF0ZXMgYW5nZWdlYmVuLCBhYmVyIGtlaW5lIEVpbmhlaXQiKTsNCiAgICBhd2FpdCBjcmVhdGVTdGF0ZUFzeW5jKA0KICAgICAgICBSb290UGF0aCArIFZhbHVlTmFtZSwNCiAgICAgICAgVGFyZ2V0RGVmYXVsdFZhbHVlLCANCiAgICAgICAgeyANCiAgICAgICAgICAgIHR5cGU6IFRhcmdldFR5cGUsIA0KICAgICAgICAgICAgbmFtZTogVmFsdWVOYW1lLCANCiAgICAgICAgICAgIHJlYWQ6IHRydWUsIA0KICAgICAgICAgICAgd3JpdGU6IFRhcmdldElzV3JpdGVhYmxlLA0KICAgICAgICAgICAgdW5pdDogVGFyZ2V0VW5pdCwNCiAgICAgICAgICAgIHJvbGU6IFRhcmdldFJvbGUsDQogICAgICAgICAgICAvLyBEYXMgT2JqZWt0KCEhISkgc3RhdGVzIHdhcyB3aXIgb2JlbiBhbmdlbGVndCBoYWJlbiB3aXJkIGhpZXIgYXV0b21hdGlzY2ggZWluZ2VzZXR6dCwgaW5rbHVzaXZlIHNlaW5lcyBOYW1lbnMuDQogICAgICAgICAgICBzdGF0ZXMNCiAgICAgICAgfQ0KICAgICk7DQp9IGVsc2Ugew0KICAgIGNvbnNvbGUuZXJyb3IoIkNyZWF0ZU15U3RhdGU6IiArIFJvb3RQYXRoICsgVmFsdWVOYW1lICsgIjogVW5pdCBhbmQgU3RhdGVzIGF0IHRoZSBzYW1lIHRpbWUgYXJlIG5vdCBwb3NzaWJsZSIpOw0KfQ0K</field>
      <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
    </block>
    

    -------------------------------------------------------------------------------
    Ab hier der Originaltext:
    Ich teile hier mal eine Blockly-Funktion die ich mir geschrieben habe und selbst ständig nutze:

    d00c293a-ef07-47e8-b912-74826520153d-image.png

    Die Funktion heißt CreateMyStateV4 weil es die 4. Version ist, falls ich eine V5 erstelle gibt es hier ein Update.

    Für den Import:

    <block xmlns="https://developers.google.com/blockly/xml" type="procedures_defcustomnoreturn" id="l(.(|wVZ(GS{-P%@qK=|" x="38" y="-287">
      <mutation statements="false">
        <arg name="RootPath" varid=",%o6YJ)eJJ0Ug#A.g^(q"></arg>
        <arg name="ValueName" varid="5K8ECZE+lpGc{@BQXb!W"></arg>
        <arg name="TargetType" varid="!-(EoW{]I%^4o]}Wf0IU"></arg>
        <arg name="TargetIsWriteable" varid="2NeMF,lRvUfhS/0US`~("></arg>
        <arg name="TargetUnit" varid="pEXy5(i!?xF*I2u|UIbk"></arg>
        <arg name="TargetStates" varid="#uwxtf=vtV#969jS3HqG"></arg>
        <arg name="TargetDefaultValue" varid="oS^boSLi7Wy4dN^qi{ek"></arg>
      </mutation>
      <field name="NAME">CreatyMyStateV4</field>
      <field name="SCRIPT">Ly8gUHLDvGZ1bmcgb2IgUm9vdFBhdGggZWluZW4gUHVua3QgYW0gRW5kZSBoYXQsIHdlbm4gbmVpbiBlaW5lbiBhbmjDpG5nZW4uDQppZiAoUm9vdFBhdGguc2xpY2UoLTEpICE9ICIuIikgew0KICAgIFJvb3RQYXRoID0gUm9vdFBhdGggKyAiLiINCn0NCg0KLy8gUHLDvGZ1bmcgb2IgU3RhdGVzIGFuZ2VnZWJlbiB3dXJkZW4uIFdlbm4gamEgdmVyYXJiZWl0ZW4uDQp2YXIgc19zdGF0ZXMgPSAiIjsNCnZhciBzdGF0ZXMgPSBuZXcgT2JqZWN0KCk7DQppZiAoVGFyZ2V0U3RhdGVzICE9ICIiKSB7DQogICAgc19zdGF0ZXMgPSAneycNCiAgICBmb3IgKHZhciBpX2luZGV4IGluIFRhcmdldFN0YXRlcykgew0KICAgICAgICBzX3N0YXRldGVtcCA9IFRhcmdldFN0YXRlc1tpX2luZGV4XTsNCiAgICAgICAgYV9zdGF0ZXRlbXAgPSBzX3N0YXRldGVtcC5zcGxpdCgiOiIpOw0KICAgICAgICBzX3N0YXRlcyA9IHNfc3RhdGVzICsgJyInICsgYV9zdGF0ZXRlbXBbMF0gKyAnIjoiJyArIGFfc3RhdGV0ZW1wWzFdICsgJyIsJw0KICAgIH0NCiAgICBzX3N0YXRlcyA9IHNfc3RhdGVzLnNsaWNlKDAsIC0xKTsNCiAgICBzX3N0YXRlcyA9IHNfc3RhdGVzICsgIn0iDQogICAgLy8gdW5kIGluIGVpbiBPYmpla3QgdW13YW5kZWxuDQogICAgc3RhdGVzID0gSlNPTi5wYXJzZShzX3N0YXRlcyk7DQp9DQoNCi8vIFZhcmlhbnRlIGRlciBFcnN0ZWxsdW5nIHByw7xmZW46DQppZiAoVGFyZ2V0VW5pdC5sZW5ndGggPT09IDAgJiYgc19zdGF0ZXMubGVuZ3RoID09PSAwKSB7DQogICAgLy8gS2VpbmUgRWluaGVpdCB1bmQga2VpbmUgU3RhdGVzIGFuZ2VnZWJlbg0KICAgIC8vY29uc29sZS5sb2coIktlaW5lIEVpbmhlaXQgdW5kIGtlaW5lIFN0YXRlcyBhbmdlZ2ViZW4iKTsNCiAgICBhd2FpdCBjcmVhdGVTdGF0ZUFzeW5jKA0KICAgICAgICBSb290UGF0aCArIFZhbHVlTmFtZSwgDQogICAgICAgIFRhcmdldERlZmF1bHRWYWx1ZSwgDQogICAgICAgIHsgDQogICAgICAgICAgICB0eXBlOiBUYXJnZXRUeXBlLCANCiAgICAgICAgICAgIG5hbWU6IFZhbHVlTmFtZSwgDQogICAgICAgICAgICByZWFkOiB0cnVlLCANCiAgICAgICAgICAgIHdyaXRlOiBUYXJnZXRJc1dyaXRlYWJsZSANCiAgICAgICAgfQ0KICAgICk7DQp9IGVsc2UgaWYgKFRhcmdldFVuaXQubGVuZ3RoID4gMCAmJiBzX3N0YXRlcy5sZW5ndGggPT09IDApIHsNCiAgICAvLyBFaW5oZWl0IGFuZ2VnZWJlbiwgYWJlciBrZWluZSBTdGF0ZXMNCiAgICAvL2NvbnNvbGUubG9nKCJFaW5oZWl0IGFuZ2VnZWJlbiwgYWJlciBrZWluZSBTdGF0ZXMiKTsNCiAgICBhd2FpdCBjcmVhdGVTdGF0ZUFzeW5jKA0KICAgICAgICBSb290UGF0aCArIFZhbHVlTmFtZSwNCiAgICAgICAgVGFyZ2V0RGVmYXVsdFZhbHVlLCANCiAgICAgICAgeyANCiAgICAgICAgICAgIHR5cGU6IFRhcmdldFR5cGUsIA0KICAgICAgICAgICAgbmFtZTogVmFsdWVOYW1lLCANCiAgICAgICAgICAgIHJlYWQ6IHRydWUsIA0KICAgICAgICAgICAgd3JpdGU6IFRhcmdldElzV3JpdGVhYmxlLA0KICAgICAgICAgICAgdW5pdDogVGFyZ2V0VW5pdA0KICAgICAgICB9DQogICAgKTsNCn0gZWxzZSBpZiAoVGFyZ2V0VW5pdC5sZW5ndGggPT09IDAgJiYgc19zdGF0ZXMubGVuZ3RoID4gMCkgew0KICAgIC8vIFN0YXRlcyBhbmdlZ2ViZW4sIGFiZXIga2VpbmUgRWluaGVpdA0KICAgIC8vY29uc29sZS5sb2coIlN0YXRlcyBhbmdlZ2ViZW4sIGFiZXIga2VpbmUgRWluaGVpdCIpOw0KICAgIGF3YWl0IGNyZWF0ZVN0YXRlQXN5bmMoDQogICAgICAgIFJvb3RQYXRoICsgVmFsdWVOYW1lLA0KICAgICAgICBUYXJnZXREZWZhdWx0VmFsdWUsIA0KICAgICAgICB7IA0KICAgICAgICAgICAgdHlwZTogVGFyZ2V0VHlwZSwgDQogICAgICAgICAgICBuYW1lOiBWYWx1ZU5hbWUsIA0KICAgICAgICAgICAgcmVhZDogdHJ1ZSwgDQogICAgICAgICAgICB3cml0ZTogVGFyZ2V0SXNXcml0ZWFibGUsDQogICAgICAgICAgICB1bml0OiBUYXJnZXRVbml0LA0KICAgICAgICAgICAgLy8gRGFzIE9iamVrdCghISEpIHN0YXRlcyB3YXMgd2lyIG9iZW4gYW5nZWxlZ3QgaGFiZW4gd2lyZCBoaWVyIGF1dG9tYXRpc2NoIGVpbmdlc2V0enQsIGlua2x1c2l2ZSBzZWluZXMgTmFtZW5zLg0KICAgICAgICAgICAgc3RhdGVzDQogICAgICAgIH0NCiAgICApOw0KfSBlbHNlIHsNCiAgICBjb25zb2xlLmVycm9yKCJDcmVhdGVNeVN0YXRlOiIgKyBSb290UGF0aCArIFZhbHVlTmFtZSArICI6IFVuaXQgYW5kIFN0YXRlcyBhdCB0aGUgc2FtZSB0aW1lIGFyZSBub3QgcG9zc2libGUiKTsNCn0NCg==</field>
      <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
    </block>
    

    Die Funktion kann man nun zum Erzeugen von Datenpunkten verschiedener Art nutzen. Die Datenpunkte sind unmittelbar nach Ihrer Erzeugung nutzbar.
    Anleitung (Beispiele weiter unten):
    053fafb0-bbc4-4c54-a160-ba06c15c7a76-image.png
    Die Parameter werden in der Regel als Textfelder gesetzt:
    f629f585-1cfb-4395-92c4-9c6747b31450-image.png
    RootPath ist der Ordner unterhalb dessen der Datenpunkt angelegt wird,
    ValueName dann der Wert.
    Beispiel:
    e22f580f-880c-4c2b-ba22-1c8c11d366c5-image.png
    Der vollständige Pfad ist 0_userdata.0.AlarmSystem.Global.active
    Um diesen zu erzeugen müsstet Ihr als
    RootPath dann 0_userdata.0.AlarmSystem und als
    ValueName dann active angeben
    Ich habe das geteilt weil ich so den Block einfach kopieren kann und immer nur ValueName anpassen muss um alle Variablen unter dem gleichen Pfad zu erzeugen

    Weiter mit den restlichen Parameter:
    f629f585-1cfb-4395-92c4-9c6747b31450-image.png
    TargetType ist number für eine Zahl, string für Text, boolean für Wahr/Falsch. (was es noch gibt sollte auch gehen)
    TargetIsWriteable setzt Ihr auf Wahr oder Falsch, setzt fest ob man den Datenpunkt ändern kann. Bei Falsch muss der Datenpunkt immer bestätigt (aka Aktualisiere) geschrieben werden.
    TargetUnit könnt Ihr die Einheit setzen wie kWh, Volt oder V. Wenn keine Einheit dann leeren String setzen
    TargetStates als Liste mit den möglichen Zuständen (siehe Beispiele weiter unten)
    TargetDefaultValue hier den Wert angeben der bei der Erstellung als erster Wert geschrieben werden soll.

    Hinweis: Entweder TargetUnit oder TargetStates, wird beides gleichzeitig angegeben so wird ein Fehler ins Log geschrieben mit einem Hinweis darauf.

    Beispiele:

    String (aka Text), beschreibbar:
    f629f585-1cfb-4395-92c4-9c6747b31450-image.png
    64447419-1f6b-4860-a7fb-2d38b56e60ed-image.png

    Boolean (aka Wahr/Falsch), schreibgeschützt (mit Aktualisiere beschreiben)
    2710c715-fb6d-4a84-9459-490cd95904dc-image.png
    9bcd4345-f61f-4fc4-a3bf-ea244c88c9fb-image.png

    Number (aka Zahl), beschreibbar, mit W als Einheit
    d88930e0-57bb-47fc-9a55-8b35bfc6203c-image.png
    7ba0a3a1-d4ad-413d-96e6-00a487bd097b-image.png

    Number mit States, beschreibbar:
    6c8ff6e6-dd75-4a70-9ad4-693b0d897dc9-image.png
    f06ca185-c44f-441f-aa55-80e7c2f06f8f-image.png
    97c18afc-c431-4e40-9f14-6728f5fb77b7-image.png
    Als States eine Liste übergeben mit der Anzahl der States, jeweils ein Textfeld im Format
    Zahl:Text

    ioBroker@Ubuntu 24.04 LTS (VMware) für: >260 Geräte, 5 Switche, 7 AP, 9 IP-Cam, 1 NAS 42TB, 1 ESXi 15TB, 4 Proxmox 1TB, 1 Hyper-V 48TB, 14 x Echo, 5x FireTV, 5 x Tablett/Handy VIS || >=160 Tasmota/Shelly || >=95 ZigBee || PV 8.1kW / Akku 14kWh || 2x USV 750W kaskadiert || Creality CR-10 SE 3D-Drucker

    paul53P 1 Antwort Letzte Antwort
    2
    • M Offline
      M Offline
      ManfredHi
      schrieb am zuletzt editiert von ManfredHi
      #2

      @bananajoe
      Wowh, vielen Dank für das Script. Gerade ausprobiert, funktioniert perfekt.
      Eine Frage noch dazu: Das was man bei ValueName angibt wird sowohl für die ObjektID als auch für den Wert im Feld Name verwendet. Kann man das eventuell auch unterscheiden?

      Ergänzung:
      Hab das Script schon so angepasst, dass ich ein eigene Variable für den Namen habe.

      2137b285-bceb-4185-8828-5fd475daba21-image.png
      DANKE!

      1 Antwort Letzte Antwort
      0
      • BananaJoeB BananaJoe

        Update: Hier ist Version 5 des Skriptes:
        d163ba3b-cf42-44d0-b2d8-164a46936452-image.png
        Änderungen:

        • Man kann nun auch eine Role angeben
        • Nicht genutzte Paramater können auch weggelassen werden.

        a7a0170f-4110-4b28-8406-b2d552d87291-image.png
        ea9cf97e-9435-45bc-9c34-025ca32f9958-image.png

        Für den Import in Blockly:

        <block xmlns="https://developers.google.com/blockly/xml" type="procedures_defcustomnoreturn" id="l(.(|wVZ(GS{-P%@qK=|" x="38" y="-1112">
          <mutation statements="false">
            <arg name="RootPath" varid=",%o6YJ)eJJ0Ug#A.g^(q"></arg>
            <arg name="ValueName" varid="5K8ECZE+lpGc{@BQXb!W"></arg>
            <arg name="TargetType" varid="!-(EoW{]I%^4o]}Wf0IU"></arg>
            <arg name="TargetIsWriteable" varid="2NeMF,lRvUfhS/0US`~("></arg>
            <arg name="TargetUnit" varid="pEXy5(i!?xF*I2u|UIbk"></arg>
            <arg name="TargetStates" varid="#uwxtf=vtV#969jS3HqG"></arg>
            <arg name="TargetDefaultValue" varid="oS^boSLi7Wy4dN^qi{ek"></arg>
            <arg name="TargetRole" varid="*~l#H;G$`OPF.N)|C;xZ"></arg>
          </mutation>
          <field name="NAME">CreatyMyStateV5</field>
          <field name="SCRIPT">Ly8gUHLDvGZ1bmcgb2IgUm9vdFBhdGggZWluZW4gUHVua3QgYW0gRW5kZSBoYXQsIHdlbm4gbmVpbiBlaW5lbiBhbmjDpG5nZW4uDQppZiAoUm9vdFBhdGguc2xpY2UoLTEpICE9ICIuIikgew0KICAgIFJvb3RQYXRoID0gUm9vdFBhdGggKyAiLiINCn0NCg0KLy8gUHLDvGZ1bmcgb2IgU3RhdGVzIGFuZ2VnZWJlbiB3dXJkZW4uIFdlbm4gamEgdmVyYXJiZWl0ZW4uDQp2YXIgc19zdGF0ZXMgPSAiIjsNCnZhciBzdGF0ZXMgPSBuZXcgT2JqZWN0KCk7DQppZiAoVGFyZ2V0U3RhdGVzICE9IG51bGwpIHsNCiAgICBzX3N0YXRlcyA9ICd7Jw0KICAgIGZvciAodmFyIGlfaW5kZXggaW4gVGFyZ2V0U3RhdGVzKSB7DQogICAgICAgIHNfc3RhdGV0ZW1wID0gVGFyZ2V0U3RhdGVzW2lfaW5kZXhdOw0KICAgICAgICBhX3N0YXRldGVtcCA9IHNfc3RhdGV0ZW1wLnNwbGl0KCI6Iik7DQogICAgICAgIHNfc3RhdGVzID0gc19zdGF0ZXMgKyAnIicgKyBhX3N0YXRldGVtcFswXSArICciOiInICsgYV9zdGF0ZXRlbXBbMV0gKyAnIiwnDQogICAgfQ0KICAgIHNfc3RhdGVzID0gc19zdGF0ZXMuc2xpY2UoMCwgLTEpOw0KICAgIHNfc3RhdGVzID0gc19zdGF0ZXMgKyAifSINCiAgICAvLyB1bmQgaW4gZWluIE9iamVrdCB1bXdhbmRlbG4NCiAgICBzdGF0ZXMgPSBKU09OLnBhcnNlKHNfc3RhdGVzKTsNCn0NCmlmICghVGFyZ2V0Um9sZSkgew0KICAgIFRhcmdldFJvbGUgPSAic3RhdGUiOw0KfQ0KDQovLyBWYXJpYW50ZSBkZXIgRXJzdGVsbHVuZyBwcsO8ZmVuOg0KaWYgKCFUYXJnZXRVbml0ICYmICFzX3N0YXRlcykgew0KICAgIC8vIEtlaW5lIEVpbmhlaXQgdW5kIGtlaW5lIFN0YXRlcyBhbmdlZ2ViZW4NCiAgICAvL2NvbnNvbGUubG9nKCJLZWluZSBFaW5oZWl0IHVuZCBrZWluZSBTdGF0ZXMgYW5nZWdlYmVuIik7DQogICAgYXdhaXQgY3JlYXRlU3RhdGVBc3luYygNCiAgICAgICAgUm9vdFBhdGggKyBWYWx1ZU5hbWUsIA0KICAgICAgICBUYXJnZXREZWZhdWx0VmFsdWUsIA0KICAgICAgICB7IA0KICAgICAgICAgICAgdHlwZTogVGFyZ2V0VHlwZSwgDQogICAgICAgICAgICBuYW1lOiBWYWx1ZU5hbWUsIA0KICAgICAgICAgICAgcmVhZDogdHJ1ZSwgDQogICAgICAgICAgICB3cml0ZTogVGFyZ2V0SXNXcml0ZWFibGUsDQogICAgICAgICAgICByb2xlOiBUYXJnZXRSb2xlDQogICAgICAgIH0NCiAgICApOw0KfSBlbHNlIGlmIChUYXJnZXRVbml0ICYmICFzX3N0YXRlcykgew0KICAgIC8vIEVpbmhlaXQgYW5nZWdlYmVuLCBhYmVyIGtlaW5lIFN0YXRlcw0KICAgIC8vY29uc29sZS5sb2coIkVpbmhlaXQgYW5nZWdlYmVuLCBhYmVyIGtlaW5lIFN0YXRlcyIpOw0KICAgIGF3YWl0IGNyZWF0ZVN0YXRlQXN5bmMoDQogICAgICAgIFJvb3RQYXRoICsgVmFsdWVOYW1lLA0KICAgICAgICBUYXJnZXREZWZhdWx0VmFsdWUsIA0KICAgICAgICB7IA0KICAgICAgICAgICAgdHlwZTogVGFyZ2V0VHlwZSwgDQogICAgICAgICAgICBuYW1lOiBWYWx1ZU5hbWUsIA0KICAgICAgICAgICAgcmVhZDogdHJ1ZSwgDQogICAgICAgICAgICB3cml0ZTogVGFyZ2V0SXNXcml0ZWFibGUsDQogICAgICAgICAgICB1bml0OiBUYXJnZXRVbml0LA0KICAgICAgICAgICAgcm9sZTogVGFyZ2V0Um9sZQ0KICAgICAgICB9DQogICAgKTsNCn0gZWxzZSBpZiAoIVRhcmdldFVuaXQgJiYgc19zdGF0ZXMpIHsNCiAgICAvLyBTdGF0ZXMgYW5nZWdlYmVuLCBhYmVyIGtlaW5lIEVpbmhlaXQNCiAgICAvL2NvbnNvbGUubG9nKCJTdGF0ZXMgYW5nZWdlYmVuLCBhYmVyIGtlaW5lIEVpbmhlaXQiKTsNCiAgICBhd2FpdCBjcmVhdGVTdGF0ZUFzeW5jKA0KICAgICAgICBSb290UGF0aCArIFZhbHVlTmFtZSwNCiAgICAgICAgVGFyZ2V0RGVmYXVsdFZhbHVlLCANCiAgICAgICAgeyANCiAgICAgICAgICAgIHR5cGU6IFRhcmdldFR5cGUsIA0KICAgICAgICAgICAgbmFtZTogVmFsdWVOYW1lLCANCiAgICAgICAgICAgIHJlYWQ6IHRydWUsIA0KICAgICAgICAgICAgd3JpdGU6IFRhcmdldElzV3JpdGVhYmxlLA0KICAgICAgICAgICAgdW5pdDogVGFyZ2V0VW5pdCwNCiAgICAgICAgICAgIHJvbGU6IFRhcmdldFJvbGUsDQogICAgICAgICAgICAvLyBEYXMgT2JqZWt0KCEhISkgc3RhdGVzIHdhcyB3aXIgb2JlbiBhbmdlbGVndCBoYWJlbiB3aXJkIGhpZXIgYXV0b21hdGlzY2ggZWluZ2VzZXR6dCwgaW5rbHVzaXZlIHNlaW5lcyBOYW1lbnMuDQogICAgICAgICAgICBzdGF0ZXMNCiAgICAgICAgfQ0KICAgICk7DQp9IGVsc2Ugew0KICAgIGNvbnNvbGUuZXJyb3IoIkNyZWF0ZU15U3RhdGU6IiArIFJvb3RQYXRoICsgVmFsdWVOYW1lICsgIjogVW5pdCBhbmQgU3RhdGVzIGF0IHRoZSBzYW1lIHRpbWUgYXJlIG5vdCBwb3NzaWJsZSIpOw0KfQ0K</field>
          <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
        </block>
        

        -------------------------------------------------------------------------------
        Ab hier der Originaltext:
        Ich teile hier mal eine Blockly-Funktion die ich mir geschrieben habe und selbst ständig nutze:

        d00c293a-ef07-47e8-b912-74826520153d-image.png

        Die Funktion heißt CreateMyStateV4 weil es die 4. Version ist, falls ich eine V5 erstelle gibt es hier ein Update.

        Für den Import:

        <block xmlns="https://developers.google.com/blockly/xml" type="procedures_defcustomnoreturn" id="l(.(|wVZ(GS{-P%@qK=|" x="38" y="-287">
          <mutation statements="false">
            <arg name="RootPath" varid=",%o6YJ)eJJ0Ug#A.g^(q"></arg>
            <arg name="ValueName" varid="5K8ECZE+lpGc{@BQXb!W"></arg>
            <arg name="TargetType" varid="!-(EoW{]I%^4o]}Wf0IU"></arg>
            <arg name="TargetIsWriteable" varid="2NeMF,lRvUfhS/0US`~("></arg>
            <arg name="TargetUnit" varid="pEXy5(i!?xF*I2u|UIbk"></arg>
            <arg name="TargetStates" varid="#uwxtf=vtV#969jS3HqG"></arg>
            <arg name="TargetDefaultValue" varid="oS^boSLi7Wy4dN^qi{ek"></arg>
          </mutation>
          <field name="NAME">CreatyMyStateV4</field>
          <field name="SCRIPT">Ly8gUHLDvGZ1bmcgb2IgUm9vdFBhdGggZWluZW4gUHVua3QgYW0gRW5kZSBoYXQsIHdlbm4gbmVpbiBlaW5lbiBhbmjDpG5nZW4uDQppZiAoUm9vdFBhdGguc2xpY2UoLTEpICE9ICIuIikgew0KICAgIFJvb3RQYXRoID0gUm9vdFBhdGggKyAiLiINCn0NCg0KLy8gUHLDvGZ1bmcgb2IgU3RhdGVzIGFuZ2VnZWJlbiB3dXJkZW4uIFdlbm4gamEgdmVyYXJiZWl0ZW4uDQp2YXIgc19zdGF0ZXMgPSAiIjsNCnZhciBzdGF0ZXMgPSBuZXcgT2JqZWN0KCk7DQppZiAoVGFyZ2V0U3RhdGVzICE9ICIiKSB7DQogICAgc19zdGF0ZXMgPSAneycNCiAgICBmb3IgKHZhciBpX2luZGV4IGluIFRhcmdldFN0YXRlcykgew0KICAgICAgICBzX3N0YXRldGVtcCA9IFRhcmdldFN0YXRlc1tpX2luZGV4XTsNCiAgICAgICAgYV9zdGF0ZXRlbXAgPSBzX3N0YXRldGVtcC5zcGxpdCgiOiIpOw0KICAgICAgICBzX3N0YXRlcyA9IHNfc3RhdGVzICsgJyInICsgYV9zdGF0ZXRlbXBbMF0gKyAnIjoiJyArIGFfc3RhdGV0ZW1wWzFdICsgJyIsJw0KICAgIH0NCiAgICBzX3N0YXRlcyA9IHNfc3RhdGVzLnNsaWNlKDAsIC0xKTsNCiAgICBzX3N0YXRlcyA9IHNfc3RhdGVzICsgIn0iDQogICAgLy8gdW5kIGluIGVpbiBPYmpla3QgdW13YW5kZWxuDQogICAgc3RhdGVzID0gSlNPTi5wYXJzZShzX3N0YXRlcyk7DQp9DQoNCi8vIFZhcmlhbnRlIGRlciBFcnN0ZWxsdW5nIHByw7xmZW46DQppZiAoVGFyZ2V0VW5pdC5sZW5ndGggPT09IDAgJiYgc19zdGF0ZXMubGVuZ3RoID09PSAwKSB7DQogICAgLy8gS2VpbmUgRWluaGVpdCB1bmQga2VpbmUgU3RhdGVzIGFuZ2VnZWJlbg0KICAgIC8vY29uc29sZS5sb2coIktlaW5lIEVpbmhlaXQgdW5kIGtlaW5lIFN0YXRlcyBhbmdlZ2ViZW4iKTsNCiAgICBhd2FpdCBjcmVhdGVTdGF0ZUFzeW5jKA0KICAgICAgICBSb290UGF0aCArIFZhbHVlTmFtZSwgDQogICAgICAgIFRhcmdldERlZmF1bHRWYWx1ZSwgDQogICAgICAgIHsgDQogICAgICAgICAgICB0eXBlOiBUYXJnZXRUeXBlLCANCiAgICAgICAgICAgIG5hbWU6IFZhbHVlTmFtZSwgDQogICAgICAgICAgICByZWFkOiB0cnVlLCANCiAgICAgICAgICAgIHdyaXRlOiBUYXJnZXRJc1dyaXRlYWJsZSANCiAgICAgICAgfQ0KICAgICk7DQp9IGVsc2UgaWYgKFRhcmdldFVuaXQubGVuZ3RoID4gMCAmJiBzX3N0YXRlcy5sZW5ndGggPT09IDApIHsNCiAgICAvLyBFaW5oZWl0IGFuZ2VnZWJlbiwgYWJlciBrZWluZSBTdGF0ZXMNCiAgICAvL2NvbnNvbGUubG9nKCJFaW5oZWl0IGFuZ2VnZWJlbiwgYWJlciBrZWluZSBTdGF0ZXMiKTsNCiAgICBhd2FpdCBjcmVhdGVTdGF0ZUFzeW5jKA0KICAgICAgICBSb290UGF0aCArIFZhbHVlTmFtZSwNCiAgICAgICAgVGFyZ2V0RGVmYXVsdFZhbHVlLCANCiAgICAgICAgeyANCiAgICAgICAgICAgIHR5cGU6IFRhcmdldFR5cGUsIA0KICAgICAgICAgICAgbmFtZTogVmFsdWVOYW1lLCANCiAgICAgICAgICAgIHJlYWQ6IHRydWUsIA0KICAgICAgICAgICAgd3JpdGU6IFRhcmdldElzV3JpdGVhYmxlLA0KICAgICAgICAgICAgdW5pdDogVGFyZ2V0VW5pdA0KICAgICAgICB9DQogICAgKTsNCn0gZWxzZSBpZiAoVGFyZ2V0VW5pdC5sZW5ndGggPT09IDAgJiYgc19zdGF0ZXMubGVuZ3RoID4gMCkgew0KICAgIC8vIFN0YXRlcyBhbmdlZ2ViZW4sIGFiZXIga2VpbmUgRWluaGVpdA0KICAgIC8vY29uc29sZS5sb2coIlN0YXRlcyBhbmdlZ2ViZW4sIGFiZXIga2VpbmUgRWluaGVpdCIpOw0KICAgIGF3YWl0IGNyZWF0ZVN0YXRlQXN5bmMoDQogICAgICAgIFJvb3RQYXRoICsgVmFsdWVOYW1lLA0KICAgICAgICBUYXJnZXREZWZhdWx0VmFsdWUsIA0KICAgICAgICB7IA0KICAgICAgICAgICAgdHlwZTogVGFyZ2V0VHlwZSwgDQogICAgICAgICAgICBuYW1lOiBWYWx1ZU5hbWUsIA0KICAgICAgICAgICAgcmVhZDogdHJ1ZSwgDQogICAgICAgICAgICB3cml0ZTogVGFyZ2V0SXNXcml0ZWFibGUsDQogICAgICAgICAgICB1bml0OiBUYXJnZXRVbml0LA0KICAgICAgICAgICAgLy8gRGFzIE9iamVrdCghISEpIHN0YXRlcyB3YXMgd2lyIG9iZW4gYW5nZWxlZ3QgaGFiZW4gd2lyZCBoaWVyIGF1dG9tYXRpc2NoIGVpbmdlc2V0enQsIGlua2x1c2l2ZSBzZWluZXMgTmFtZW5zLg0KICAgICAgICAgICAgc3RhdGVzDQogICAgICAgIH0NCiAgICApOw0KfSBlbHNlIHsNCiAgICBjb25zb2xlLmVycm9yKCJDcmVhdGVNeVN0YXRlOiIgKyBSb290UGF0aCArIFZhbHVlTmFtZSArICI6IFVuaXQgYW5kIFN0YXRlcyBhdCB0aGUgc2FtZSB0aW1lIGFyZSBub3QgcG9zc2libGUiKTsNCn0NCg==</field>
          <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
        </block>
        

        Die Funktion kann man nun zum Erzeugen von Datenpunkten verschiedener Art nutzen. Die Datenpunkte sind unmittelbar nach Ihrer Erzeugung nutzbar.
        Anleitung (Beispiele weiter unten):
        053fafb0-bbc4-4c54-a160-ba06c15c7a76-image.png
        Die Parameter werden in der Regel als Textfelder gesetzt:
        f629f585-1cfb-4395-92c4-9c6747b31450-image.png
        RootPath ist der Ordner unterhalb dessen der Datenpunkt angelegt wird,
        ValueName dann der Wert.
        Beispiel:
        e22f580f-880c-4c2b-ba22-1c8c11d366c5-image.png
        Der vollständige Pfad ist 0_userdata.0.AlarmSystem.Global.active
        Um diesen zu erzeugen müsstet Ihr als
        RootPath dann 0_userdata.0.AlarmSystem und als
        ValueName dann active angeben
        Ich habe das geteilt weil ich so den Block einfach kopieren kann und immer nur ValueName anpassen muss um alle Variablen unter dem gleichen Pfad zu erzeugen

        Weiter mit den restlichen Parameter:
        f629f585-1cfb-4395-92c4-9c6747b31450-image.png
        TargetType ist number für eine Zahl, string für Text, boolean für Wahr/Falsch. (was es noch gibt sollte auch gehen)
        TargetIsWriteable setzt Ihr auf Wahr oder Falsch, setzt fest ob man den Datenpunkt ändern kann. Bei Falsch muss der Datenpunkt immer bestätigt (aka Aktualisiere) geschrieben werden.
        TargetUnit könnt Ihr die Einheit setzen wie kWh, Volt oder V. Wenn keine Einheit dann leeren String setzen
        TargetStates als Liste mit den möglichen Zuständen (siehe Beispiele weiter unten)
        TargetDefaultValue hier den Wert angeben der bei der Erstellung als erster Wert geschrieben werden soll.

        Hinweis: Entweder TargetUnit oder TargetStates, wird beides gleichzeitig angegeben so wird ein Fehler ins Log geschrieben mit einem Hinweis darauf.

        Beispiele:

        String (aka Text), beschreibbar:
        f629f585-1cfb-4395-92c4-9c6747b31450-image.png
        64447419-1f6b-4860-a7fb-2d38b56e60ed-image.png

        Boolean (aka Wahr/Falsch), schreibgeschützt (mit Aktualisiere beschreiben)
        2710c715-fb6d-4a84-9459-490cd95904dc-image.png
        9bcd4345-f61f-4fc4-a3bf-ea244c88c9fb-image.png

        Number (aka Zahl), beschreibbar, mit W als Einheit
        d88930e0-57bb-47fc-9a55-8b35bfc6203c-image.png
        7ba0a3a1-d4ad-413d-96e6-00a487bd097b-image.png

        Number mit States, beschreibbar:
        6c8ff6e6-dd75-4a70-9ad4-693b0d897dc9-image.png
        f06ca185-c44f-441f-aa55-80e7c2f06f8f-image.png
        97c18afc-c431-4e40-9f14-6728f5fb77b7-image.png
        Als States eine Liste übergeben mit der Anzahl der States, jeweils ein Textfeld im Format
        Zahl:Text

        paul53P Offline
        paul53P Offline
        paul53
        schrieb am zuletzt editiert von paul53
        #3

        @bananajoe sagte: Als States eine Liste übergeben mit der Anzahl der States, jeweils ein Textfeld im Format
        Zahl:Text

        Weshalb nicht gleich als Objekt?

        Blockly_temp.JPG

        Anstelle von TargetType könnte man auch

        typeof TargetDefaultValue
        

        verwenden. Außerdem vermisse ich die Rolle, die automatisch aus der Kombination von TargetType und TargetIsWritable gebildet werden könnte.

        Sollten nicht alle eigenen Datenpunkte unter "0_userdata.0" erstellt werden?

        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

        BananaJoeB 1 Antwort Letzte Antwort
        1
        • paul53P paul53

          @bananajoe sagte: Als States eine Liste übergeben mit der Anzahl der States, jeweils ein Textfeld im Format
          Zahl:Text

          Weshalb nicht gleich als Objekt?

          Blockly_temp.JPG

          Anstelle von TargetType könnte man auch

          typeof TargetDefaultValue
          

          verwenden. Außerdem vermisse ich die Rolle, die automatisch aus der Kombination von TargetType und TargetIsWritable gebildet werden könnte.

          Sollten nicht alle eigenen Datenpunkte unter "0_userdata.0" erstellt werden?

          BananaJoeB Online
          BananaJoeB Online
          BananaJoe
          Most Active
          schrieb am zuletzt editiert von BananaJoe
          #4

          @paul53 Ok, die Idee mit dem Objekt hatte ich einfach nicht (ich arbeite einfach zu viel Strings).
          Aber ... das ist es schon wieder fest verdrahtet. Meine Funktion ist ja entstanden weil ich dynamisch Datenpunkte anlegen wollte - in der Regel weil ich ein JSON verarbeiten will und gar nicht weis was ich bekomme.
          Mit den Textfeldern kann ich die Liste auch per erstelle Text aus zusammenbauen, in dynamischer Länge indem ich dieser vorher erzeuge.

          Das mit dem Automatischen Target-Type, ich weis nicht. Ich hätte das schon gern klar definiert. Aber die Möglichkeit da eine automatische Auswahl zusätzlich zu den festen einzubauen wäre eine Idee.

          Ob man 0_userdata.0 da fest einbaut, könnte man. Besser wäre vielleicht zu prüfen ob der Datenpunkt unterhalb erstellt wird und dann eine Fehlermeldung zu geben.

          @ManfredHi Ok, den Namen benutze ich nie - ich nutze auch nie die Objekt-Auswahl in Blockly sondern immer Textfelder für die Datenpunkte. Für mich ist das lesbarer.
          Aber du hast ja einen Weg gefunden. Eventuell baue ich das in V5 ein, wenn man es leer lässt nimmt er dann einfach den ValueName

          Allgemein: Hauptziel war eine Funktion für das Erstellen von Datenpunkten zu bauen wo ich jeden Aspekt aus anderen Dingen zusammen bauen kann.

          Aber noch mal @paul53 Wie verarbeite ich wenn ich einen Parameter gar nicht angebe:
          ca3ec9f5-3234-40f3-b4f0-5d0153975990-image.png

          Im Moment prüfe ich auf

          if (TargetStates != "") { }
          

          oder

          if (TargetUnit.length === 0 && s_states.length === 0) {
          

          Wenn ich den Parameter einfach leer lasse, gibt es einen Fehler

          ioBroker@Ubuntu 24.04 LTS (VMware) für: >260 Geräte, 5 Switche, 7 AP, 9 IP-Cam, 1 NAS 42TB, 1 ESXi 15TB, 4 Proxmox 1TB, 1 Hyper-V 48TB, 14 x Echo, 5x FireTV, 5 x Tablett/Handy VIS || >=160 Tasmota/Shelly || >=95 ZigBee || PV 8.1kW / Akku 14kWh || 2x USV 750W kaskadiert || Creality CR-10 SE 3D-Drucker

          paul53P 1 Antwort Letzte Antwort
          0
          • BananaJoeB BananaJoe

            @paul53 Ok, die Idee mit dem Objekt hatte ich einfach nicht (ich arbeite einfach zu viel Strings).
            Aber ... das ist es schon wieder fest verdrahtet. Meine Funktion ist ja entstanden weil ich dynamisch Datenpunkte anlegen wollte - in der Regel weil ich ein JSON verarbeiten will und gar nicht weis was ich bekomme.
            Mit den Textfeldern kann ich die Liste auch per erstelle Text aus zusammenbauen, in dynamischer Länge indem ich dieser vorher erzeuge.

            Das mit dem Automatischen Target-Type, ich weis nicht. Ich hätte das schon gern klar definiert. Aber die Möglichkeit da eine automatische Auswahl zusätzlich zu den festen einzubauen wäre eine Idee.

            Ob man 0_userdata.0 da fest einbaut, könnte man. Besser wäre vielleicht zu prüfen ob der Datenpunkt unterhalb erstellt wird und dann eine Fehlermeldung zu geben.

            @ManfredHi Ok, den Namen benutze ich nie - ich nutze auch nie die Objekt-Auswahl in Blockly sondern immer Textfelder für die Datenpunkte. Für mich ist das lesbarer.
            Aber du hast ja einen Weg gefunden. Eventuell baue ich das in V5 ein, wenn man es leer lässt nimmt er dann einfach den ValueName

            Allgemein: Hauptziel war eine Funktion für das Erstellen von Datenpunkten zu bauen wo ich jeden Aspekt aus anderen Dingen zusammen bauen kann.

            Aber noch mal @paul53 Wie verarbeite ich wenn ich einen Parameter gar nicht angebe:
            ca3ec9f5-3234-40f3-b4f0-5d0153975990-image.png

            Im Moment prüfe ich auf

            if (TargetStates != "") { }
            

            oder

            if (TargetUnit.length === 0 && s_states.length === 0) {
            

            Wenn ich den Parameter einfach leer lasse, gibt es einen Fehler

            paul53P Offline
            paul53P Offline
            paul53
            schrieb am zuletzt editiert von paul53
            #5

            @bananajoe sagte: Im Moment prüfe ich auf

            Prüfe einfach

            if (TargetStates) { }
            

            und

            if (TargetUnit) { }
            

            Das genügt um undefined und Leerstrings auszuklammern.

            Meine Lösung sehe etwa so aus:

            if(!id.startsWith('0_userdata.0')) id = '0_userdata.0.' + id;
            const type = typeof def;
            if(!role) {
                if(write && type == 'boolean') role = 'switch';
                else if(write && type == 'number') role = 'level';
                else if(!write && type == 'boolean') role = 'indicator';
                else if(!write && type == 'number') role = 'value';
                else role = 'state';
            }
            const common = {
                type: type,
                name: Name,
                def: def,
                read: true,
                write: !!write,
                role: role
            };
            if(desc) common.desc = desc;
            if(unitOrStates) {
                if(typeof unitOrStates == 'object') common.states = unitOrStates;
                else if(type == 'number' && typeof unitOrStates == 'string') common.unit = unitOrStates;
            }
            createState(id, def, common);
            

            Blockly_temp.JPG

            Die letzten 3 Parameter sind optional (leer lassen oder Leerstring).

            Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
            Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

            BananaJoeB 2 Antworten Letzte Antwort
            0
            • paul53P paul53

              @bananajoe sagte: Im Moment prüfe ich auf

              Prüfe einfach

              if (TargetStates) { }
              

              und

              if (TargetUnit) { }
              

              Das genügt um undefined und Leerstrings auszuklammern.

              Meine Lösung sehe etwa so aus:

              if(!id.startsWith('0_userdata.0')) id = '0_userdata.0.' + id;
              const type = typeof def;
              if(!role) {
                  if(write && type == 'boolean') role = 'switch';
                  else if(write && type == 'number') role = 'level';
                  else if(!write && type == 'boolean') role = 'indicator';
                  else if(!write && type == 'number') role = 'value';
                  else role = 'state';
              }
              const common = {
                  type: type,
                  name: Name,
                  def: def,
                  read: true,
                  write: !!write,
                  role: role
              };
              if(desc) common.desc = desc;
              if(unitOrStates) {
                  if(typeof unitOrStates == 'object') common.states = unitOrStates;
                  else if(type == 'number' && typeof unitOrStates == 'string') common.unit = unitOrStates;
              }
              createState(id, def, common);
              

              Blockly_temp.JPG

              Die letzten 3 Parameter sind optional (leer lassen oder Leerstring).

              BananaJoeB Online
              BananaJoeB Online
              BananaJoe
              Most Active
              schrieb am zuletzt editiert von
              #6

              @paul53 sagte in Blockly: CreateMyState: Datenpunkte mit Unit/States:

              @bananajoe sagte: Im Moment prüfe ich auf

              Prüfe einfach

              if (TargetStates) { }
              

              und

              if (TargetUnit) { }
              

              Das genügt um undefined und Leerstrings auszuklammern.

              Danke! Habe gerade festgestellt das

              if (testVar === null) { }
              

              auch geht, aber deines ist natürlich noch einfacher. Ich baue - vermutlich - morgen mal eine V5

              ioBroker@Ubuntu 24.04 LTS (VMware) für: >260 Geräte, 5 Switche, 7 AP, 9 IP-Cam, 1 NAS 42TB, 1 ESXi 15TB, 4 Proxmox 1TB, 1 Hyper-V 48TB, 14 x Echo, 5x FireTV, 5 x Tablett/Handy VIS || >=160 Tasmota/Shelly || >=95 ZigBee || PV 8.1kW / Akku 14kWh || 2x USV 750W kaskadiert || Creality CR-10 SE 3D-Drucker

              1 Antwort Letzte Antwort
              0
              • paul53P paul53

                @bananajoe sagte: Im Moment prüfe ich auf

                Prüfe einfach

                if (TargetStates) { }
                

                und

                if (TargetUnit) { }
                

                Das genügt um undefined und Leerstrings auszuklammern.

                Meine Lösung sehe etwa so aus:

                if(!id.startsWith('0_userdata.0')) id = '0_userdata.0.' + id;
                const type = typeof def;
                if(!role) {
                    if(write && type == 'boolean') role = 'switch';
                    else if(write && type == 'number') role = 'level';
                    else if(!write && type == 'boolean') role = 'indicator';
                    else if(!write && type == 'number') role = 'value';
                    else role = 'state';
                }
                const common = {
                    type: type,
                    name: Name,
                    def: def,
                    read: true,
                    write: !!write,
                    role: role
                };
                if(desc) common.desc = desc;
                if(unitOrStates) {
                    if(typeof unitOrStates == 'object') common.states = unitOrStates;
                    else if(type == 'number' && typeof unitOrStates == 'string') common.unit = unitOrStates;
                }
                createState(id, def, common);
                

                Blockly_temp.JPG

                Die letzten 3 Parameter sind optional (leer lassen oder Leerstring).

                BananaJoeB Online
                BananaJoeB Online
                BananaJoe
                Most Active
                schrieb am zuletzt editiert von
                #7

                @paul53 sagte in Blockly: CreateMyState: Datenpunkte mit Unit/States:

                Meine Lösung sehe etwa so aus:

                und stimmt, deine Variante common zunächst zu definieren und dann weitere Attribute wie if(desc) common.desc = desc; ist natürlich auch schlauer. Besser und eleganter als meine ganzen if Entscheidungen.

                ioBroker@Ubuntu 24.04 LTS (VMware) für: >260 Geräte, 5 Switche, 7 AP, 9 IP-Cam, 1 NAS 42TB, 1 ESXi 15TB, 4 Proxmox 1TB, 1 Hyper-V 48TB, 14 x Echo, 5x FireTV, 5 x Tablett/Handy VIS || >=160 Tasmota/Shelly || >=95 ZigBee || PV 8.1kW / Akku 14kWh || 2x USV 750W kaskadiert || Creality CR-10 SE 3D-Drucker

                M 1 Antwort Letzte Antwort
                0
                • BananaJoeB BananaJoe

                  @paul53 sagte in Blockly: CreateMyState: Datenpunkte mit Unit/States:

                  Meine Lösung sehe etwa so aus:

                  und stimmt, deine Variante common zunächst zu definieren und dann weitere Attribute wie if(desc) common.desc = desc; ist natürlich auch schlauer. Besser und eleganter als meine ganzen if Entscheidungen.

                  M Offline
                  M Offline
                  ManfredHi
                  schrieb am zuletzt editiert von
                  #8

                  @bananajoe
                  Hab mir jetzt noch eine zusätzliche Variable mit dem Objektpfad angelegt und wenn ich keinen eigenen Namen angebe, wird der ValueName für den Namen gesetzt.

                  if(!objektpfad.endsWith('.')) objektpfad = objektpfad + '.';
                  if(!objektpfad.startsWith('0_userdata.0.')) objektpfad = '0_userdata.0.' + objektpfad;
                  objektpfad = objektpfad + id;
                  const type = typeof def;
                  if(!role) {
                      if(write ?? type == 'boolean') role = 'switch';
                      else if(write ?? type == 'number') role = 'level';
                      else if(!write ?? type == 'boolean') role = 'indicator';
                      else if(!write ?? type == 'number') role = 'value';
                      else role = 'state';
                  }
                  const common = {
                      type: type,
                      def: def,
                      read: true,
                      write: write,
                      role: role
                  };
                  if(desc) common.desc = desc;
                  if(Name) common.name = Name
                      else common.name = id;
                  if(unitOrState) {
                      if(typeof unitOrState == 'object') common.states = unitOrState;
                      else if(type == 'number' && typeof unitOrState == 'string') common.unit = unitOrState;
                  }
                  createState(objektpfad, DefaultValue, def, common);
                  
                  
                  paul53P 1 Antwort Letzte Antwort
                  0
                  • M ManfredHi

                    @bananajoe
                    Hab mir jetzt noch eine zusätzliche Variable mit dem Objektpfad angelegt und wenn ich keinen eigenen Namen angebe, wird der ValueName für den Namen gesetzt.

                    if(!objektpfad.endsWith('.')) objektpfad = objektpfad + '.';
                    if(!objektpfad.startsWith('0_userdata.0.')) objektpfad = '0_userdata.0.' + objektpfad;
                    objektpfad = objektpfad + id;
                    const type = typeof def;
                    if(!role) {
                        if(write ?? type == 'boolean') role = 'switch';
                        else if(write ?? type == 'number') role = 'level';
                        else if(!write ?? type == 'boolean') role = 'indicator';
                        else if(!write ?? type == 'number') role = 'value';
                        else role = 'state';
                    }
                    const common = {
                        type: type,
                        def: def,
                        read: true,
                        write: write,
                        role: role
                    };
                    if(desc) common.desc = desc;
                    if(Name) common.name = Name
                        else common.name = id;
                    if(unitOrState) {
                        if(typeof unitOrState == 'object') common.states = unitOrState;
                        else if(type == 'number' && typeof unitOrState == 'string') common.unit = unitOrState;
                    }
                    createState(objektpfad, DefaultValue, def, common);
                    
                    
                    paul53P Offline
                    paul53P Offline
                    paul53
                    schrieb am zuletzt editiert von paul53
                    #9

                    @manfredhi
                    Korrigiere Zeilen 6 bis 9 und ersetze ?? durch &&.
                    Zeile 26: Defaultvalue? Du hast im Skript def ausgewertet.

                    Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                    Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                    M 1 Antwort Letzte Antwort
                    0
                    • paul53P paul53

                      @manfredhi
                      Korrigiere Zeilen 6 bis 9 und ersetze ?? durch &&.
                      Zeile 26: Defaultvalue? Du hast im Skript def ausgewertet.

                      M Offline
                      M Offline
                      ManfredHi
                      schrieb am zuletzt editiert von ManfredHi
                      #10

                      @paul53 sagte in Blockly: CreateMyState: Datenpunkte mit Unit/States:

                      Zeile 26: Defaultvalue? Du hast im Skript def ausgewertet.

                      Das mit dem def war mir nicht ganz klar. Kann ich darin z.B. als Defaultwert einen Wert eines anderen Datenpunktes eintragen? Dann steht dieser Wert aber auch im common-Block des Datenpunktes drinnen oder? Außer ich nehm den eintrag defaus dem commonheraus oder?

                      if(!objektpfad.endsWith('.')) objektpfad = objektpfad + '.';
                      if(!objektpfad.startsWith('0_userdata.0.')) objektpfad = '0_userdata.0.' + objektpfad;
                      objektpfad = objektpfad + id;
                      const type = typeof DefaultValue;
                      if(!role) {
                          if(write && type == 'boolean') role = 'switch';
                          else if(write && type == 'number') role = 'level';
                          else if(!write && type == 'boolean') role = 'indicator';
                          else if(!write && type == 'number') role = 'value';
                          else role = 'state';
                      }
                      const common = {
                          type: type,
                          read: true,
                          write: write,
                          role: role
                      };
                      if(desc) common.desc = desc;
                      if(Name) common.name = Name
                          else common.name = id;
                      if(unitOrState) {
                          if(typeof unitOrState == 'object') common.states = unitOrState;
                          else if(type == 'number' && typeof unitOrState == 'string') common.unit = unitOrState;
                      }
                      createState(objektpfad, DefaultValue, common);
                      
                      paul53P 1 Antwort Letzte Antwort
                      0
                      • M ManfredHi

                        @paul53 sagte in Blockly: CreateMyState: Datenpunkte mit Unit/States:

                        Zeile 26: Defaultvalue? Du hast im Skript def ausgewertet.

                        Das mit dem def war mir nicht ganz klar. Kann ich darin z.B. als Defaultwert einen Wert eines anderen Datenpunktes eintragen? Dann steht dieser Wert aber auch im common-Block des Datenpunktes drinnen oder? Außer ich nehm den eintrag defaus dem commonheraus oder?

                        if(!objektpfad.endsWith('.')) objektpfad = objektpfad + '.';
                        if(!objektpfad.startsWith('0_userdata.0.')) objektpfad = '0_userdata.0.' + objektpfad;
                        objektpfad = objektpfad + id;
                        const type = typeof DefaultValue;
                        if(!role) {
                            if(write && type == 'boolean') role = 'switch';
                            else if(write && type == 'number') role = 'level';
                            else if(!write && type == 'boolean') role = 'indicator';
                            else if(!write && type == 'number') role = 'value';
                            else role = 'state';
                        }
                        const common = {
                            type: type,
                            read: true,
                            write: write,
                            role: role
                        };
                        if(desc) common.desc = desc;
                        if(Name) common.name = Name
                            else common.name = id;
                        if(unitOrState) {
                            if(typeof unitOrState == 'object') common.states = unitOrState;
                            else if(type == 'number' && typeof unitOrState == 'string') common.unit = unitOrState;
                        }
                        createState(objektpfad, DefaultValue, common);
                        
                        paul53P Offline
                        paul53P Offline
                        paul53
                        schrieb am zuletzt editiert von
                        #11

                        @manfredhi sagte: Kann ich darin z.B. als Defaultwert einen Wert eines anderen Datenpunktes eintragen?

                        Ja, wieso nicht?

                        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                        1 Antwort Letzte Antwort
                        0
                        Antworten
                        • In einem neuen Thema antworten
                        Anmelden zum Antworten
                        • Älteste zuerst
                        • Neuste zuerst
                        • Meiste Stimmen


                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        768

                        Online

                        32.5k

                        Benutzer

                        81.6k

                        Themen

                        1.3m

                        Beiträge
                        Community
                        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                        ioBroker Community 2014-2025
                        logo
                        • Anmelden

                        • Du hast noch kein Konto? Registrieren

                        • Anmelden oder registrieren, um zu suchen
                        • Erster Beitrag
                          Letzter Beitrag
                        0
                        • Home
                        • Aktuell
                        • Tags
                        • Ungelesen 0
                        • Kategorien
                        • Unreplied
                        • Beliebt
                        • GitHub
                        • Docu
                        • Hilfe