UPGRADE IP 9 verfügbar!
Timberwolf VISU jetzt mit NEUEM Layout Editor
Freie Anordnung, Reihenfolge und Größe der Widgets - viele weitere Verbesserungen
Infos im Wiki: https://elabnet.atlassian.net/l/cp/06SeuHRJ

NEU! Insider & Leistungsmerkmale FÜR ALLE freigeschaltet
Damit kann nun jeder das Upgrade vornehmen und VISU & IFTTT testen. Alle Info hier: viewtopic.php?f=8&t=5074

[TIPP] [3.5.1] Shelly Button1 (Beispielimplementierung)

Hier stellen Foristen und Kunden Ihre EIGENEN Logikbausteine vor. Diese Logikbausteine stehen jedem im Rahmen der vom Autor eingeräumten / genannten Lizenz zur Verfügung.
Forumsregeln
  • Denke bitte an aussagekräftige Titel und gebe dort auch die [Firmware] an. Wenn ETS oder CometVisu beteiligt sind, dann auch deren Version
  • Bitte mache vollständige Angaben zu Deinem Server, dessen ID und dem Online-Status in Deiner Signatur. Hilfreich ist oft auch die Beschreibung der angeschlossener Hardware sowie die verwendeten Protokolle
  • Beschreibe Dein Projekt und Dein Problem bitte vollständig. Achte bitte darauf, dass auf Screenshots die Statusleiste sichtbar ist
  • Bitte sei stets freundlich und wohlwollend, bleibe beim Thema und unterschreibe mit deinem Vornamen. Bitte lese alle Regeln, die Du hier findest: https://wiki.timberwolf.io/Forenregeln
Antworten

Ersteller
blaubaerli
Reactions:
Beiträge: 2308
Registriert: Sa Sep 15, 2018 10:26 am
Wohnort: Kerpen
Hat sich bedankt: 884 Mal
Danksagung erhalten: 677 Mal

[3.5.1] Shelly Button1 (Beispielimplementierung)

#1

Beitrag von blaubaerli »

Hallo zusammen,

wie von Ben @AchterB hier erbeten, anbei mal ein Stück-Mustercode zur Einbindung eines Shelly Button1. Der Code ist explizit entstanden, bevor die Logigengine Stringerweiterung erfahren hat.

Sieht dann bei mir so aus:

Bild

Bitte nicht wundern, ich habe im Code die Anleitung zu diversen Elementen oben immer als Kommentar mit drinnen. Ist quasi meine eigene Templatekonstruktion, damit ich bei Analysen nicht lange graben muss. Kann auch sein, dass nen paar Variablen zu viel drinnen sind. Soll auch keinen optimalen Code demonstrieren, sondern nen Quick-Hack... :whistle:

Code: Alles auswählen

/**
 
    Latch
    Ein Latch ist dazu da, einen Wert/Zustand der zu einen bestimmten Zeitpunkt anliegt zwischenzuspeichern.
    ["Latch","$Eingang","$Ausgang","$Trigger",TriggerOption]
    
    Eingang und Ausgang müssen vom gleichen Typ sein, also (float/float),(integer/integer),(bool/bool) oder (string/string).
    Der Trigger ist vom Typ "bool" und bestimmt, ob der Eingangswert am Ausgang übernommen wird.
    Das Verhalten des Triggers kann durch die TriggerOption angepasst werden.
    TriggerOption	Der Eingangswert wird am Ausgang übernommen, wenn ...
    0	... Trigger = true ist
    1	... der Trigger von false nach true wechselt (steigende Flanke)
    2	... der Trigger von true nach false wechselt (fallende Flanke)
    3	... der Trigger seinen Wert ändert (steigende oder fallende Flanke)
    ansonsten bleibt der Ausgang unverändert.


    Comparator
    Der Schwellwertschalter erlaubt 2 Varianten:
    Ein Schwellwert: Der Eingangswert wird mit dem Schwellwert verglichen und die Logikzelle gibt 1 aus, wenn $Input_Wert > $Schwellwert erfüllt ist.
    ["Comparator" , "$Input_wert" , "$Output" , "$Schwellwert"]
    Oberer und unterer Schwellwert: Der Ausgang der Logik liefert 0, wenn der untere Schwellwert unterschritten ist, eine 1, wenn der obere Schwellwert überschritten ist. Liegt der Input_Wert zwische oberer und unterer Schwelle, wird der unveränderte Ausgangswert ausgegeben.
    ["Comparator" , "$Input_Wert" , "$Output" , ["$UntereSchwelle","$ObereSchwelle"]]


    Startverhaltenfunktion
    Im Custom-Logik-Code
    
    In einer Custom-Logik kann der Startwert im Level-Array über den “Init Value” festgelegt werden.
    Das Sperren bis der Variablen (hier $In) ein Eingangswert zugewiesen wurde, kann bspw. wie folgt erreicht werden ["Break",["-$In"]].


    Triggered(verfügbar ab TWS V1.6)
    Die Syntax für die Trigger-Erkennung sieht folgendermassen aus:
    [ "Triggered", "$Input", "$Touched" ]
    
    "Triggered" : Modulkennung
    "$Input": Referenz auf einen Level der mit einem Eingang verbunden ist
    "$Touched": Referenz auf einen boolschen Level
    
    Der Trigger-Erkennung funktioniert folgendermaßen:
    Der Status des "$Input"-Levels wird überprüft, ob er beim aktellen Durchlauf dieser Logik bereits einmal "angefasst" wurde.
    Ist das der Fall wird "$Touched" auf true gesetzt, anderfalls auf false
    
    Wenn ein Ereignis an einem Eingang die Logik triggert, bekommt der mit dem Eingang verbundene Level vorher das "Touched"-Flag gesetzt.
    Somit lässt sich einfach abfragen, ob dieser Eingang die Logik ausgelöst hat.
    
    Achtung:
    Wird ein Level intern "angefasst", z.B. durch ein vorheriges Modul beschrieben, wird ebenfalls das "Touched"-Flag gesetzt. Will man sicher nur auf "Eingang triggered" testen, muss dieser Test möglichst vor allen anderen Modulen stehen, die den Level verändern können.


    Break
    Dies ist ein spezielles Modul, das die weitere Ausführung einer (Custom-) Logikzelle abbricht, sobald ein "True" auf einem der Break-Eingänge eintrifft (von einem Eingang der Logikzelle oder einer Variablen, die innerhalb der Logik berechnet wird). Beim Abbruch werden keine nachfolgenden Module mehr berechnet/ausgeführt. Kein Ausgang wird gesendet, auch nicht die Ausgänge, deren Variable vor dem Erreichen des Breaks gesetzt wurden.

    Syntax mit einem Eingang:
    ["Break", ["$Eingang"]]

    Mehrer Eingänge sind ODER-verknüpft, zB:
    ["Break", ["$Eingang1","$Eingang2"]]

    Wird Break wie folgt verwendet, können in der GUI beliebig viele Eingänge hinzugefügt werden, die einen Abbruch triggern:
    ["Break", ["$VAR<Inhibit?>"]]

 
 */

{
  "_Meta": { // Optional
    "Description": "",
    "Version": "1.00",
	 "Icon": " data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDUxMi4wMDEgNTEyLjAwMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTEyLjAwMSA1MTIuMDAxOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8cGF0aCBzdHlsZT0iZmlsbDojRkRCNTFFOyIgZD0iTTI1Mi4xOTgsMzQ3LjY5MWMxNi4xMTYtMi41MiwyOS45NjcsMTEuMzMyLDI3LjQ0OCwyNy40NDhjLTEuNTg1LDEwLjEzNi05LjcwNiwxOC4yNTgtMTkuODQzLDE5Ljg0Mw0KCWMtMTYuMTE2LDIuNTItMjkuOTY3LTExLjMzMi0yNy40NDgtMjcuNDQ4QzIzMy45NCwzNTcuMzk3LDI0Mi4wNjEsMzQ5LjI3NiwyNTIuMTk4LDM0Ny42OTF6Ii8+DQo8cGF0aCBzdHlsZT0iZmlsbDojRkZEMzExOyIgZD0iTTMzMy44MTUsMzExLjQ3OXYxNDMuNjU3SDE3OC4xODZWMzExLjQ3OUgzMzMuODE1eiBNMjU2LjAwMSwzOTUuMjc5DQoJYzEzLjE2OSwwLDIzLjk0My0xMC43NzQsMjMuOTQzLTIzLjk0M2MwLTEzLjE2OS0xMC43NzQtMjMuOTQzLTIzLjk0My0yMy45NDNjLTEzLjE2OSwwLTIzLjk0MywxMC43NzQtMjMuOTQzLDIzLjk0Mw0KCUMyMzIuMDU4LDM4NC41MDQsMjQyLjgzMiwzOTUuMjc5LDI1Ni4wMDEsMzk1LjI3OXoiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiM0NDU3NjQ7IiBkPSJNMjU2LjAwMSw3OC4wMzdjMTYuNTIxLDAsMjkuOTI5LDEzLjQwOCwyOS45MjksMjkuOTI5cy0xMy40MDgsMjkuOTI5LTI5LjkyOSwyOS45MjkNCglzLTI5LjkyOS0xMy40MDgtMjkuOTI5LTI5LjkyOVMyMzkuNDgsNzguMDM3LDI1Ni4wMDEsNzguMDM3eiIvPg0KPHBhdGggc3R5bGU9ImZpbGw6I0U3RUNFRDsiIGQ9Ik0yNTYuMDAxLDEzNy44OTRjMTYuNTIxLDAsMjkuOTI5LTEzLjQwOCwyOS45MjktMjkuOTI5cy0xMy40MDgtMjkuOTI5LTI5LjkyOS0yOS45MjkNCglzLTI5LjkyOSwxMy40MDgtMjkuOTI5LDI5LjkyOVMyMzkuNDgsMTM3Ljg5NCwyNTYuMDAxLDEzNy44OTR6IE0zNC41MjksMjE1LjcwOEwyNTYuMDAxLDEyLjE5NGwyMjEuNDcxLDIwMy41MTRoLTM1LjkxNEg3MC40NDMNCglIMzQuNTI5eiIvPg0KPHBhdGggc3R5bGU9ImZpbGw6IzQ0NTc2NDsiIGQ9Ik03MC40NDMsMjE1LjcwOHYyODcuMzE0aDM3MS4xMTRWMjE1LjcwOEg3MC40NDN6IE0zMzMuODE1LDQ1NS4xMzZIMTc4LjE4NlYzMTEuNDc5aDE1NS42MjlWNDU1LjEzNnoNCgkiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiNCMkI2Qjg7IiBkPSJNMjI2LjA3MiwxMDcuOTY2YzAtMTYuNDc0LDEzLjMzNS0yOS44MzksMjkuNzkyLTI5LjkxNFYxMi4zMTlMMzQuNTI5LDIxNS43MDhoMzUuOTE0aDE4NS40MjFWMTM3Ljg4DQoJQzIzOS40MDcsMTM3LjgwMywyMjYuMDcyLDEyNC40MzksMjI2LjA3MiwxMDcuOTY2eiIvPg0KPHBhdGggZD0iTTQ1MC41MzYsMjI0LjY4N2g0OS45NzZMMjU2LjAwMSwwTDExLjQ4OSwyMjQuNjg3aDQ5Ljk3NnYyNjkuMzU3SDIyLjU1OHYxNy45NTdoNDY2Ljg4NnYtMTcuOTU3aC0zOC45MDdWMjI0LjY4N3oNCgkgTTU3LjU2OSwyMDYuNzNsMjYuMDU2LTIzLjk0M2gyNjIuMTYxVjE2NC44M2gtMjQyLjYyTDI1Ni4wMDEsMjQuMzg3bDE5OC40MzEsMTgyLjM0Mkg1Ny41NjlWMjA2LjczeiBNNzkuNDIyLDI2Ni41ODdoNjIuODVWMjQ4LjYzDQoJaC02Mi44NXYtMjMuOTQzaDM1My4xNTd2MjMuOTQzaC02Mi44NXYxNy45NTdoNjIuODV2MjI3LjQ1N0g3OS40MjJMNzkuNDIyLDI2Ni41ODdMNzkuNDIyLDI2Ni41ODd6Ii8+DQo8cGF0aCBkPSJNMjU2LjAwMSw2OS4wNThjLTIxLjQ1MywwLTM4LjkwNywxNy40NTQtMzguOTA3LDM4LjkwN3MxNy40NTQsMzguOTA3LDM4LjkwNywzOC45MDdzMzguOTA3LTE3LjQ1NCwzOC45MDctMzguOTA3DQoJUzI3Ny40NTMsNjkuMDU4LDI1Ni4wMDEsNjkuMDU4eiBNMjU2LjAwMSwxMjguOTE2Yy0xMS41NTEsMC0yMC45NS05LjM5OS0yMC45NS0yMC45NXM5LjM5OS0yMC45NSwyMC45NS0yMC45NQ0KCXMyMC45NSw5LjM5OSwyMC45NSwyMC45NVMyNjcuNTUyLDEyOC45MTYsMjU2LjAwMSwxMjguOTE2eiIvPg0KPHBhdGggZD0iTTI0Ny4wMjIsNDAzLjAwM3YyOC4xOWgxNy45NTd2LTI4LjE5YzEzLjgwMS0zLjkxOSwyMy45NDMtMTYuNjI2LDIzLjk0My0zMS42NjdjMC0xOC4xNTMtMTQuNzY4LTMyLjkyMS0zMi45MjEtMzIuOTIxDQoJcy0zMi45MjEsMTQuNzY4LTMyLjkyMSwzMi45MjFDMjIzLjA3OSwzODYuMzc3LDIzMy4yMiwzOTkuMDg0LDI0Ny4wMjIsNDAzLjAwM3ogTTI1Ni4wMDEsMzU2LjM3MQ0KCWM4LjI1MiwwLDE0Ljk2NCw2LjcxMiwxNC45NjQsMTQuOTY0YzAsOC4yNTItNi43MTIsMTQuOTY0LTE0Ljk2NCwxNC45NjRjLTguMjUyLDAtMTQuOTY0LTYuNzEyLTE0Ljk2NC0xNC45NjQNCglDMjQxLjAzNiwzNjMuMDg1LDI0Ny43NDksMzU2LjM3MSwyNTYuMDAxLDM1Ni4zNzF6Ii8+DQo8Zz4NCgk8cmVjdCB4PSIxNjAuMjI2IiB5PSIyNDguNjM1IiBzdHlsZT0iZmlsbDojRkZGRkZGOyIgd2lkdGg9IjIzLjk0MyIgaGVpZ2h0PSIxNy45NTciLz4NCgk8cmVjdCB4PSI5NC4zODMiIHk9IjQ1OC4xMzUiIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiB3aWR0aD0iMjMuOTQzIiBoZWlnaHQ9IjE3Ljk1NyIvPg0KPC9nPg0KPHJlY3QgeD0iMTE4LjMyNiIgeT0iNDM0LjE5MiIgd2lkdGg9IjIzLjk0MyIgaGVpZ2h0PSIxNy45NTciLz4NCjxyZWN0IHg9IjM5My42NjgiIHk9IjQ1OC4xMzUiIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiB3aWR0aD0iMjMuOTQzIiBoZWlnaHQ9IjE3Ljk1NyIvPg0KPHJlY3QgeD0iMzY5LjcyNiIgeT0iNDM0LjE5MiIgd2lkdGg9IjIzLjk0MyIgaGVpZ2h0PSIxNy45NTciLz4NCjxyZWN0IHg9IjMyNy44MjYiIHk9IjI0OC42MzUiIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiB3aWR0aD0iMjMuOTQzIiBoZWlnaHQ9IjE3Ljk1NyIvPg0KPHBhdGggZD0iTTQwOC42MzYsNDEwLjI0M3YtNjguODM2aC0xNy45NTd2NTAuODc5aC00Ny44ODZWMzAyLjVoLTQxLjl2LTQ0Ljg5M2MwLTcuMjU1LTUuMjQ1LTE0Ljk2NC0xNC45NjQtMTQuOTY0aC01OS44NTcNCgljLTkuNzIsMC0xNC45NjQsNy43MS0xNC45NjQsMTQuOTY0VjMwMi41aC00MS45djM1LjkxNGgtNjUuODQzdjY4LjgzNmgxNy45NTd2LTUwLjg3OWg0Ny44ODZ2MTA3Ljc0M2gxNzMuNTg2di01My44NzFINDA4LjYzNnoNCgkgTTIyOS4wNjUsMjYwLjYwMWg1My44NzF2NDEuOWgtNTMuODcxVjI2MC42MDF6IE0zMjQuODM2LDQ0Ni4xNTdIMTg3LjE2NXYtMTI1LjdoMTM3LjY3MVY0NDYuMTU3eiIvPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPC9zdmc+DQo="
  },
  "Input": [
      ["ButtonCounter","ButtonCounter","$I_ButtonCounter","c"],
      ["Einschaltphase","Einschaltphase","$I_Einschaltphase","u"]
  ],
  "Output": [
      ["Schaltstring","Shellyschaltstring","$O_ShellySchaltString","a"],
      ["Schaltbool","Schaltbool","$O_ShellySchaltBool","a"]
  ],
  "Level": [
      ["$I_ButtonCounter","integer",0],

      ["$O_ShellySchaltString","string","init"],
      ["$O_ShellySchaltBool","bool",false],

      ["$ConstTrue","bool",true],
      ["$ConstFalse","bool",false],
      ["$ConstOn","string","on"],
      ["$ConstOff","string","off"],
      ["$ConstToggle","string","toggle"],
      ["$CloseSignal","bool",true],
      ["$OpenSignal","bool",false],
      ["$I_Einschaltphase","bool",false],
      ["$OnSignal","bool",false],
      ["$OffSignal","bool",false],
      ["$OnOffSignal","bool",false],
      ["$ToggleSignal","bool",false],
      ["$ButtonCounterIsNowTriggered","bool",false]

  ],
  "Module": [
      [ "Triggered","$I_ButtonCounter","$ButtonCounterIsNowTriggered"],

      ["And",["$ButtonCounterIsNowTriggered","$I_Einschaltphase"],"$OnSignal"],
      ["And",["$ButtonCounterIsNowTriggered","-$I_Einschaltphase"],"$OffSignal"],

      ["And",["$ButtonCounterIsNowTriggered","$I_Einschaltphase"],"$O_ShellySchaltBool"],

      ["Latch","$ConstOn","$O_ShellySchaltString","$OnSignal",0],
      ["Latch","$ConstOff","$O_ShellySchaltString","$OffSignal",0]


  ]
}
"Der Schöpfer dieser Custom Logik überträgt die Nutzungsrechte gemäß der TOLL ("Timberwolf Open Logikblock License") die unter https://wrgt.news/TOLL zum Download zur Verfügung steht."

Klar, das Konstrukt braucht nen Rahmen der den Zeiteingang beeinflusst und natürlich im MQTT-Geräte Manager das Versorgen des Objektes mit dem korrekten Selektor.

Bei Bedarf gerne noch mal nachfragen.

Beste Grüße
Jens
Zuletzt geändert von blaubaerli am Mo Nov 07, 2022 11:23 pm, insgesamt 3-mal geändert.
wiregate1250 & timberwolf168 (2600er), VPN offen, Reboot nach Vereinbarung
Antworten

Zurück zu „Zusätzliche Logikbausteine“