Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. CruziX

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    C
    • Profile
    • Following 0
    • Followers 0
    • Topics 6
    • Posts 351
    • Best 30
    • Groups 1

    CruziX

    @CruziX

    38
    Reputation
    234
    Profile views
    351
    Posts
    0
    Followers
    0
    Following
    Joined Last Online
    Website github.com/xCruziX

    CruziX Follow
    Pro

    Best posts made by CruziX

    • SmartPhone Benachrichtigung erkennen

      Hallo Zusammen.
      Inspiriert von einigen Kommentaren wollte ich für mich folgendes umsetzen:
      Wenn mein SmartPhone eine WhatsApp Nachricht, oder einen Telefonanruf bekommt und auf lautlos ist, soll sich meine Alexa melden.
      Das kann aber so wie ich es gemacht habe, für jede App Benachrichtigung gemacht werden.
      Das habe ich alles ohne wirkliche Vorkenntnisse von HTTP oder so gemacht.
      Die Tasker App habe ich auch schon länger nicht mehr verwendet.
      Ich will hiermit nur mal einen Ansatz zeigen, der sicherlich noch verbessert werden kann 🙂

      Was ich verwendet habe:

      • Android
      • Android App Tasker (Kostenpflichtig)
      • Iobroker Adapter Simple-Api
      • Android App AutoNotification (Kostenpflichtig)
        Alternative hierzu ist die Benachrichtigung mit Tasker abzufangen. Ist aber für jede App seperat notwendig und mehr Tasker Programmierung

      Umsetzung Tasker

      ** Tasker Variablen**
      Zu erst habe ich 2 Variablen angelegt (siehe Screenshot).

      • %IobrokerSimpleDatenpunkt = javascript.0.SmartPhone_Nachricht (Pfad vom Datenpunkt in iobroker)
      • %IobrokerSimpleIP = IP vom iobroker

      Tasker Tasks
      1 Task - Send Request:

      Send Request (15)
          A1: Variable Setzen [ Name:%anapp Zu:%par1 Recurse Variables:Aus Mathematisch:Aus Hinzufügen:Aus Max Rounding Digits:3 ] If [ %par1 ist gesetzt ]
          A2: Variable Setzen [ Name:%antitlebig Zu:%par2 Recurse Variables:Aus Mathematisch:Aus Hinzufügen:Aus Max Rounding Digits:3 ] If [ %par2 ist gesetzt ]
          <wenn WhatsApp dann text leeren>
          A3: Variable Setzen [ Name:%antextbig Zu:leer Recurse Variables:Aus Mathematisch:Aus Hinzufügen:Aus Max Rounding Digits:3 ] If [ %anapp gl WhatsApp ]
          A4: [X] Benachrichtigung [ Titel:Test Text:%IobrokerSimpleIP/set/%IobrokerSimpleDatenpunkt?value=Appname:%anapp;Titel:%antitlebig;Text:%antextbig Icon:null Nummer:0 Dauerhaft:Aus Priorität:3 Repeat Alert:Aus LED Colour:Rot LED Rate:0 Sound Datei: Vibration Pattern: Category: ] 
          <Sendet einen Get Request mit dem Appnamen und Inhalt an iobroker>
          A5: HTTP Request [  Method:GET URL:%IobrokerSimpleIP/set/%IobrokerSimpleDatenpunkt?value=Appname:%anapp;Titel:%antitlebig;Text:%antextbig Headers: Query Parameters: Body: File To Send: File To Save With Output: Timeout (Sekunden):30 Trust Any Certificate:An ] 
          A6: Warte [ MS:0 Sekunden:8 Minuten:0 Std.:0 Tage:0 ]
      

      2019-10-27 13_24_29-Window.png

      Hier werden die Variablen die von AutoNotification erstellt werden überschrieben, wenn der Task von außen mit Parametern aufgerufen wird (das passiert im 2 Task mit Telefon).

      Im Fall, dass die Nachricht von WhatsApp kommt, überschreibe ich noch die Variable %antextbig mit dem Nachrichteninhalt, da ich den in iobroker nicht brauche und das nicht im Klartext übers Netzwerk gehen soll.

      Dann habe ich eine Benachrichtigung drin, die ist aber nur zu Testzwecken von mir.

      Als nächstes der HTTP Request zu Iobroker und eine Wartezeit von 8 Sekunden, damit nicht bei jeder Nachricht ein Request gesendet wird.

      Der HTTP Request:
      2019-10-27 13_35_02-Window.png

      Zum Abschluss dann noch im Task oben auf das Zahnrad und auf "Neuen Task abbrechen" einstellen.
      Das verhindert die Parallelausführung der Tasks.

      2019-10-27 13_36_33-Window.png


      2 Task - Send Request Telefon - Das ist nur für das Abfangen von Anrufen notwendig:

      Send Request Telefon (18)
          A1: Variable Setzen [ Name:%antitlebig Zu:%CNAME Recurse Variables:Aus Mathematisch:Aus Hinzufügen:Aus Max Rounding Digits:3 ] 
          A2: Task Ausführen [ Name:Send Request Priorität:%priority+1 Parameter 1 (%par1):%anapp Parameter 2 (%par2):%antitlebig Rücksetzungswert Variable: Stop:Aus ]
      

      2019-10-27 13_25_22-Window.png

      Ich überschreibe hier die Variable %antitlebig von AutoNotification mit der Tasker Variable %CNAME.
      Im Fall meines MI 9 wurde mit %antitlebig nicht immer der richtige Anrufername sondern manchmal die Telefonnummer angezeigt. %CNAME von Tasker funktioniert da ohne Probleme.

      Dann rufe ich einfach den 1 Task mit den richtigen Parametern auf:

      2019-10-27 13_31_56-Window.png

      Zum Abschluss dann noch im Task oben auf das Zahnrad und auf "Neuen Task abbrechen" einstellen.
      Das verhindert die Parallelausführung der Tasks.

      2019-10-27 13_37_42-Window.png

      Tasker Profile
      Bei beiden Profilen das Event AutoNotification Intercept auswählen.

      Profil App Benachrichtigung:


      photo5888670965255221562.jpg

      photo5888670965255221561.jpg

      Profil: App Benachrichtigung (14)
          Restore: no
          Ereignis: AutoNotification Intercept [ Konfiguration:Event Behaviour: true
         Notification Type: Only Created Notifications
         Persistency Type: Both
         Notification Apps: WhatsApp,Pushbullet
         Get All Fields : true ]
          Status: Displaystatus [ Ist:Aus ]
         Eingang: Send Request (15)
          A1: Variable Setzen [ Name:%anapp Zu:%par1 Recurse Variables:Aus Mathematisch:Aus Hinzufügen:Aus Max Rounding Digits:3 ] If [ %par1 ist gesetzt ]
          A2: Variable Setzen [ Name:%antitlebig Zu:%par2 Recurse Variables:Aus Mathematisch:Aus Hinzufügen:Aus Max Rounding Digits:3 ] If [ %par2 ist gesetzt ]
          <wenn WhatsApp dann text leeren>
          A3: Variable Setzen [ Name:%antextbig Zu:leer Recurse Variables:Aus Mathematisch:Aus Hinzufügen:Aus Max Rounding Digits:3 ] If [ %anapp gl WhatsApp ]
          A4: [X] Benachrichtigung [ Titel:Test Text:%IobrokerSimpleIP/set/%IobrokerSimpleDatenpunkt?value=Appname:%anapp;Titel:%antitlebig;Text:%antextbig Icon:null Nummer:0 Dauerhaft:Aus Priorität:3 Repeat Alert:Aus LED Colour:Rot LED Rate:0 Sound Datei: Vibration Pattern: Category: ] 
          <Sendet einen Get Request mit dem Appnamen und Inhalt an iobroker>
          A5: HTTP Request [  Method:GET URL:%IobrokerSimpleIP/set/%IobrokerSimpleDatenpunkt?value=Appname:%anapp;Titel:%antitlebig;Text:%antextbig Headers: Query Parameters: Body: File To Send: File To Save With Output: Timeout (Sekunden):30 Trust Any Certificate:An ] 
          A6: Warte [ MS:0 Sekunden:8 Minuten:0 Std.:0 Tage:0 ]
      

      Profil Telefonanruf:


      photo5888670965255221565.jpg

      photo5888670965255221566.jpg

      Profil: Anruf (17)
          Restore: no
          Ereignis: AutoNotification Intercept [ Konfiguration:Event Behaviour: true
         Notification Type: Only Created Notifications
         Persistency Type: Both
         Notification Apps: Telefon
         Get All Fields : true ]
          Status: Anruf [ Typ:Eingehend Nummer:* ]
          Status: Displaystatus [ Ist:Aus ]
         Eingang: Send Request Telefon (18)
          A1: Variable Setzen [ Name:%antitlebig Zu:%CNAME Recurse Variables:Aus Mathematisch:Aus Hinzufügen:Aus Max Rounding Digits:3 ] 
          A2: Task Ausführen [ Name:Send Request Priorität:%priority+1 Parameter 1 (%par1):%anapp Parameter 2 (%par2):%antitlebig Rücksetzungswert Variable: Stop:Aus ]
      

      Iobroker

      Meine Einstellung im Simple-Api Adapter (Port variiert natürlich, bei mir war der Standard bereits belegt).


      7a314227-6c01-4ca8-a75f-cc3e6c625252-image.png

      Hier wird nur ein Skript benötigt, welches ich in Blockly gemacht habe.


      2019-10-27 13_40_01-Window.png

      Code von "SplitAndParseMessage"

       var lParameter = i.split(";");
      if(lParameter.length > 0)
      {
          // Appname
          var lAppName = lParameter[0].split(":");
          if (lAppName.length = 2)
              AppName = lAppName[1];
          
          // AppTitel
          var lAppTitel = lParameter[1].split(":");
          if (lAppTitel.length = 2)
              AppTitel = lAppTitel[1];
              
          // Text
          var lAppText = lParameter[2].split(":");
          if (lAppText.length = 2)
              AppInhalt = lAppTitel[1];
      }
      

      2019-10-27 13_40_26-Window.png

      2019-10-27 13_40_48-Window.png

      Exportierter Blockly


      <xml xmlns="http://www.w3.org/1999/xhtml">
      <variables>
      <variable type="" id="rv[D5#M#xl-fl_IAJ/yX">AppName</variable>
      <variable type="" id="wMPT6J+/@b!eVfPpvy/6">i</variable>
      <variable type="" id="Ny_}+(lYYEia^3cxv$q2">AppTitel</variable>
      <variable type="" id="qD:FXL84rN8tO2~:WTd">AppInhalt</variable>
      <variable type="" id="PR/pQwdg6c+A.GJ/,BQ">listeAppNames</variable> <variable type="" id="~pQOs?dGT6XyDYTXUr0Y">bWichtig</variable> <variable type="" id="0*20}aVTZlug2TWsjH/8">sAusgabeText</variable> <variable type="undefined" id="AppBenachrichtigungFreigeben">AppBenachrichtigungFreigeben</variable> <variable type="undefined" id="AppBenachrichtigungFreigeben2">AppBenachrichtigungFreigeben2</variable> </variables> <block type="variables_set" id="gbAWZ!jR%G}o}RB2CK=M" x="38" y="-513"> <field name="VAR" id="rv[D5#M#xl-fl_IAJ/yX" variabletype="">AppName</field> <value name="VALUE"> <block type="text" id="uk,0gFkA;8#FP]WxFp./"> <field name="TEXT">""</field> </block> </value> <next> <block type="variables_set" id="*ZyChTG]{wcPU]_FepGS"> <field name="VAR" id="Ny_}+(lYYEia^3cxv$q2" variabletype="">AppTitel</field> <value name="VALUE"> <block type="text" id="Mv(Vd$G/(*ugP(9Wph.T"> <field name="TEXT">""</field> </block> </value> <next> <block type="variables_set" id="B5IkQ}Yo@*|h0D?,yI@."> <field name="VAR" id="qD:_FXL84rN8tO2~:WTd" variabletype="">AppInhalt</field> <value name="VALUE"> <block type="text" id="lb,?adkP1F:]in^wQJsV"> <field name="TEXT">""</field> </block> </value> <next> <block type="variables_set" id="0FjF/Se!AZvR?uzyrSK8"> <field name="VAR" id="PR/pQwdg6c+A.GJ/,BQ" variabletype="">listeAppNames</field>
      <value name="VALUE">
      <block type="lists_create_with" id="-(!t;D@,GVX4DsKV({1U">
      <mutation items="0"></mutation>
      </block>
      </value>
      <next>
      <block type="variables_set" id="@qQ]sWO
      |7(#X9?mG^:]">
      <field name="VAR" id="~pQOs?dGT6XyDYTXUr0Y" variabletype="">bWichtig</field>
      <value name="VALUE">
      <block type="logic_boolean" id="t5jb?LD{-Qo)FE*]Fp]3">
      <field name="BOOL">FALSE</field>
      </block>
      </value>
      <next>
      <block type="on" id="zVhzoqM}]/DMZ8F?V##">
      <field name="OID">javascript.0.SmartPhone_Nachricht</field>
      <field name="CONDITION">any</field>
      <field name="ACK_CONDITION"></field>
      <statement name="STATEMENT">
      <block type="debug" id="GPvafzPb%[KN#!:Tn_d"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="jdC,A5Wd}}|zaH.Kmc,A"> <field name="TEXT">Start</field> </shadow> </value> <next> <block type="controls_if" id="wv=xf~Yv3+([IJAy-cVf"> <value name="IF0"> <block type="logic_negate" id="on)x9@($Xw4RPX{.MS(">
      <value name="BOOL">
      <block type="get_value_var" id="Gv=OQ?(aM,DI@Xk)GPL"> <field name="ATTR">val</field> <value name="OID"> <shadow type="text" id="k9fXKwBG}a:}9(b)TS,J"> <field name="TEXT">linkeddevices.0.Alexa Yannick.Nicht stören</field> </shadow> </value> </block> </value> </block> </value> <statement name="DO0"> <block type="procedures_callcustomnoreturn" id="~eO*O=Hekb.pK9IY=~"> <mutation name="SplitAndParseMessage"> <arg name="i"></arg> </mutation> <value name="ARG0"> <block type="get_value_var" id="}G7p.CRQWK|lKVgU!I4t"> <field name="ATTR">val</field> <value name="OID"> <shadow type="text" id="iB:N8$az;x0{=Mts;^b">
      <field name="TEXT">javascript.0.SmartPhone_Nachricht</field>
      </shadow>
      </value>
      </block>
      </value>
      <next>
      <block type="debug" id="^}UeLwIsGP_l,YUWaL=~">
      <field name="Severity">log</field>
      <value name="TEXT">
      <shadow type="text" id="K%aSlGV!(p1c(LiBEW}">
      <field name="TEXT">test</field>
      </shadow>
      <block type="variables_get" id="4G1-@g=WSct%FX;ykXU2">
      <field name="VAR" id="rv[D5#M#xl-fl_IAJ/yX" variabletype="">AppName</field>
      </block>
      </value>
      <next>
      <block type="debug" id="nvFKv=sMMHq5#$t#)">
      <field name="Severity">log</field>
      <value name="TEXT">
      <shadow type="text" id="K%aSlGV!(p1c(LiBEW}">
      <field name="TEXT">test</field>
      </shadow>
      <block type="variables_get" id="X@#jHW1^2r,Y~1x.Xfm">
      <field name="VAR" id="Ny
      }+(lYYEia^3cxv$q2" variabletype="">AppTitel</field>
      </block>
      </value>
      <next>
      <block type="debug" id="#X5kefy$Xh=o$?A1SwUZ">
      <field name="Severity">log</field>
      <value name="TEXT">
      <shadow type="text" id="PCJ72RMN,%%I!obo0-RG">
      <field name="TEXT">test</field>
      </shadow>
      <block type="variables_get" id="{5]#q/q#Qs.?Kj~!E/L"> <field name="VAR" id="qD:_FXL84rN8tO2~:WTd" variabletype="">AppInhalt</field> </block> </value> <next> <block type="controls_if" id="uX0+S6[E,#SF-4Pq(b+">
      <mutation else="1"></mutation>
      <value name="IF0">
      <block type="logic_compare" id="VqP,;Pk_yq4NR7:?%Us
      ">
      <field name="OP">EQ</field>
      <value name="A">
      <block type="text_changeCase" id="fCVtOivZOHEisT9%#)@]">
      <field name="CASE">LOWERCASE</field>
      <value name="TEXT">
      <shadow type="text" id="fT;pGYi/PgatNBdk
      g$C">
      <field name="TEXT">abc</field>
      </shadow>
      <block type="variables_get" id="F;yuLZ=sof:77TP;eoHI">
      <field name="VAR" id="rv[D5#M#xl-fl_IAJ/yX" variabletype="">AppName</field>
      </block>
      </value>
      </block>
      </value>
      <value name="B">
      <block type="text" id="TC4zh-bc3P$c.,${2/D"> <field name="TEXT">telefon</field> </block> </value> </block> </value> <statement name="DO0"> <block type="comment" id="YU(b]lV%X3D]=?e9)+KR"> <field name="COMMENT">Wenn ein eingehender Anruf erkannt wird</field> <next> <block type="variables_set" id="g~lPry4nmXNE4z.YW/[s"> <field name="VAR" id="~pQOs?dGT6XyDYTXUr0Y" variabletype="">bWichtig</field> <value name="VALUE"> <block type="logic_boolean" id="C)*@]E)ao:Y|WOZREL69"> <field name="BOOL">TRUE</field> </block> </value> </block> </next> </block> </statement> <statement name="ELSE"> <block type="comment" id="GXxZ{Shd{z3V6BC|L[Cc"> <field name="COMMENT">Für alle anderen aktivieren Benachrichtigungen</field> <next> <block type="variables_set" id="``,hv=s29DaKeR]#Z6!d"> <field name="VAR" id="~pQOs?dGT6XyDYTXUr0Y" variabletype="">bWichtig</field> <value name="VALUE"> <block type="logic_boolean" id="JsmyOm8lKo6[5Z^_U](,"> <field name="BOOL">FALSE</field> </block> </value> </block> </next> </block> </statement> <next> <block type="comment" id="r+3Z%[R|@s@d;SOa.#K9"> <field name="COMMENT">Bedingungen wann und was passieren soll</field> <next> <block type="debug" id="B?[:f{sL6YjpH0Em(~Zo"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="CEe}*wb;(SS9OyN5}3A">
      <field name="TEXT">Nicht stören ist aus</field>
      </shadow>
      </value>
      <next>
      <block type="comment" id="6$}I~K)HuhM[/sY$?YJe">
      <field name="COMMENT">Nur wenn es noch nicht in der letzten Minute ausgegeben wurde</field>
      <next>
      <block type="controls_if" id="ud-BZyz/E-lt5{6_iW$P">
      <value name="IF0">
      <block type="logic_operation" id="_C@i.?(4b4)sql-9%+(F">
      <field name="OP">OR</field>
      <value name="A">
      <block type="lists_isEmpty" id="!jXxxqd
      vtkB+07/%RaO">
      <value name="VALUE">
      <block type="variables_get" id="Nz@MW{4Am(4;w./@-7/S">
      <field name="VAR" id="PR/pQwdg6c+A.GJ/,BQ" variabletype="">listeAppNames</field> </block> </value> </block> </value> <value name="B"> <block type="logic_compare" id="sp?2Z;zX.LOcTSMj;*,2"> <field name="OP">LT</field> <value name="A"> <block type="lists_indexOf" id="aJ04]q[a$k}BoB6z6^iG"> <field name="END">FIRST</field> <value name="VALUE"> <block type="variables_get" id="FRPxEBZQnfF-(wE7B#Qr"> <field name="VAR" id="PR/pQwdg6c+A.GJ/,BQ" variabletype="">listeAppNames</field>
      </block>
      </value>
      <value name="FIND">
      <block type="variables_get" id="vym}[rlkU)UUh4{2in([">
      <field name="VAR" id="rv[D5#M#xl-fl_IAJ/yX" variabletype="">AppName</field>
      </block>
      </value>
      </block>
      </value>
      <value name="B">
      <block type="math_number" id="K3#(9lExyf7[B;6AN-,q">
      <field name="NUM">1</field>
      </block>
      </value>
      </block>
      </value>
      </block>
      </value>
      <statement name="DO0">
      <block type="debug" id="c%$gqe/oz1m]qnYrnxu"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="M{f)v6=GQ.S*({.?+@vI"> <field name="TEXT">Liste ist leer oder noch nicht drin</field> </shadow> </value> <next> <block type="procedures_callnoreturn" id="b]HsmCD/KDlrR2,Nm2Ip"> <mutation name="Prozess"></mutation> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </statement> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> <block type="procedures_defcustomnoreturn" id=")0=5;5d/bT^GYpsS-4" x="887" y="-163">
      <mutation statements="false">
      <arg name="i" varid="wMPT6J+/@b!eVfPpvy/6"></arg>
      </mutation>
      <field name="NAME">SplitAndParseMessage</field>
      <field name="SCRIPT">IHZhciBsUGFyYW1ldGVyID0gaS5zcGxpdCgiOyIpOw0KaWYobFBhcmFtZXRlci5sZW5ndGggPiAwKQ0Kew0KICAgIC8vIEFwcG5hbWUNCiAgICB2YXIgbEFwcE5hbWUgPSBsUGFyYW1ldGVyWzBdLnNwbGl0KCI6Iik7DQogICAgaWYgKGxBcHBOYW1lLmxlbmd0aCA9IDIpDQogICAgICAgIEFwcE5hbWUgPSBsQXBwTmFtZVsxXTsNCiAgICANCiAgICAvLyBBcHBUaXRlbA0KICAgIHZhciBsQXBwVGl0ZWwgPSBsUGFyYW1ldGVyWzFdLnNwbGl0KCI6Iik7DQogICAgaWYgKGxBcHBUaXRlbC5sZW5ndGggPSAyKQ0KICAgICAgICBBcHBUaXRlbCA9IGxBcHBUaXRlbFsxXTsNCiAgICAgICAgDQogICAgLy8gVGV4dA0KICAgIHZhciBsQXBwVGV4dCA9IGxQYXJhbWV0ZXJbMl0uc3BsaXQoIjoiKTsNCiAgICBpZiAobEFwcFRleHQubGVuZ3RoID0gMikNCiAgICAgICAgQXBwSW5oYWx0ID0gbEFwcFRpdGVsWzFdOw0KICAgICAgICANCn0=</field>
      <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
      </block>
      <block type="procedures_defnoreturn" id="XZ?B!jTcqJ?1vTUOZf" x="37" y="513"> <field name="NAME">Prozess</field> <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment> <statement name="STACK"> <block type="lists_setIndex" id="@lrIRFncHNRW3O8KkN=}"> <mutation at="false"></mutation> <field name="MODE">INSERT</field> <field name="WHERE">LAST</field> <value name="LIST"> <block type="variables_get" id="Kloy:jP(UBgqp)cqnRs">
      <field name="VAR" id="PR/pQwdg6c+A.GJ/,BQ" variabletype="">listeAppNames</field> </block> </value> <value name="TO"> <block type="variables_get" id="gGmiMg{@.s%$:~C_*xD~"> <field name="VAR" id="rv[D5#M#xl-fl_IAJ/yX" variabletype="">AppName</field> </block> </value> <next> <block type="controls_if" id="U[!*SvX,_.8qw0WpSoVU"> <mutation else="1"></mutation> <value name="IF0"> <block type="logic_compare" id="d_LGRZ3_G4ez@cQ[Czx,"> <field name="OP">EQ</field> <value name="A"> <block type="text_changeCase" id="|Zq/NZOHoUq/WGDTBu1">
      <field name="CASE">LOWERCASE</field>
      <value name="TEXT">
      <shadow type="text" id="fT;pGYi/PgatNBdk
      g$C">
      <field name="TEXT">abc</field>
      </shadow>
      <block type="variables_get" id=")An
      ;sD{5w8U}YGGN20m">
      <field name="VAR" id="rv[D5#M#xl-fl_IAJ/yX" variabletype="">AppName</field>
      </block>
      </value>
      </block>
      </value>
      <value name="B">
      <block type="text" id="J0iHgg#c$gf}CL%GJ]/)">
      <field name="TEXT">telefon</field>
      </block>
      </value>
      </block>
      </value>
      <statement name="DO0">
      <block type="comment" id="Z9|wFB}!cAGW5f?F,~?"> <field name="COMMENT">Wenn ein eingehender Anruf erkannt wird</field> <next> <block type="debug" id="@dc=c@=(4[0JoT.wu{(">
      <field name="Severity">log</field>
      <value name="TEXT">
      <shadow type="text" id="$R#@R]L^C7W}%pwY-%Cd">
      <field name="TEXT">Telefon erkannt</field>
      </shadow>
      </value>
      <next>
      <block type="variables_set" id="@etNu{e/5rEX}yV2J$,
      ">
      <field name="VAR" id="020}aVTZlug2TWsjH/8" variabletype="">sAusgabeText</field>
      <value name="VALUE">
      <block type="text_join" id="fIB@?xLa!5zYnO{y/ZZ"> <mutation items="2"></mutation> <value name="ADD0"> <block type="text" id="E?4F%*uPS1Zs*xdy:S]["> <field name="TEXT">Anruf von </field> </block> </value> <value name="ADD1"> <block type="variables_get" id="^+kgnPr{pjINAS_HK![">
      <field name="VAR" id="Ny_}+(lYYEia^3cxv$q2" variabletype="">AppTitel</field>
      </block>
      </value>
      </block>
      </value>
      </block>
      </next>
      </block>
      </next>
      </block>
      </statement>
      <statement name="ELSE">
      <block type="comment" id="{@;rf{-1kU4Gp@R}2xko">
      <field name="COMMENT">Für alle anderen aktivieren Benachrichtigungen</field>
      <next>
      <block type="variables_set" id="SxK6a_N?[v+J|zw=tGA"> <field name="VAR" id="0*20}aVTZlug2TWsjH/8" variabletype="">sAusgabeText</field> <value name="VALUE"> <block type="text_join" id="~1LQTFHecm%PAR@*2@_="> <mutation items="2"></mutation> <value name="ADD0"> <block type="variables_get" id="bG=ZGj*QFF*6iDlHZ.Ut"> <field name="VAR" id="rv[D5#M#xl-fl_IAJ/yX" variabletype="">AppName</field> </block> </value> <value name="ADD1"> <block type="text" id="gKFN0/^oqN[C~qUmDp3%"> <field name="TEXT"> Nachricht erhalten</field> </block> </value> </block> </value> </block> </next> </block> </statement> <next> <block type="controls_if" id="!dtWxvF$a(8ib:mY%!y@"> <value name="IF0"> <block type="logic_negate" id="aVS}_43YeRjmlsTJU4r5"> <value name="BOOL"> <block type="text_isEmpty" id="UUG2R@+{EN|n7#~V77cy"> <value name="VALUE"> <shadow type="text" id="k0=%pDiZ[B@^3=3$9]=E"> <field name="TEXT"></field> </shadow> <block type="variables_get" id="Zum8}K5~Dwp(hjnp{*%z"> <field name="VAR" id="0*20}aVTZlug2TWsjH/8" variabletype="">sAusgabeText</field> </block> </value> </block> </value> </block> </value> <statement name="DO0"> <block type="debug" id="+k],pBg[~Yt/$6*.2n3-"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id=",hCZ1b4VT8HgALl=djNb"> <field name="TEXT">test</field> </shadow> <block type="text_join" id="-lF6rOx[x6wDatqm!KvU"> <mutation items="2"></mutation> <value name="ADD0"> <block type="text" id="PfhYOh,2+D1ugnKo=s?E"> <field name="TEXT">Ausgabe Text: </field> </block> </value> <value name="ADD1"> <block type="variables_get" id="*stZFed9*yPvv4}B$Yny"> <field name="VAR" id="0*20}aVTZlug2TWsjH/8" variabletype="">sAusgabeText</field> </block> </value> </block> </value> <next> <block type="control_ex" id="4yzS4(I3fi65fpZ1UJ#2"> <field name="TYPE">false</field> <field name="CLEAR_RUNNING">FALSE</field> <value name="OID"> <shadow type="field_oid" id="EiQI23d_CHSjg9T%}ctq"> <field name="oid">Object ID</field> </shadow> <block type="text" id="KwzK{e8@ZAR{M3XgA8a">
      <field name="TEXT">linkeddevices.0.Alexa Yannick.Sprechen</field>
      </block>
      </value>
      <value name="VALUE">
      <shadow type="logic_boolean" id="/WRu3n~i3TN(#-JI|f-6">
      <field name="BOOL">TRUE</field>
      </shadow>
      <block type="variables_get" id="j@|XK=:OZqJ3Hrch2aRI">
      <field name="VAR" id="0
      20}aVTZlug2TWsjH/8" variabletype="">sAusgabeText</field>
      </block>
      </value>
      <value name="DELAY_MS">
      <shadow type="math_number" id="oTR7pp6(|xI^|C}-yeoW">
      <field name="NUM">0</field>
      </shadow>
      </value>
      <next>
      <block type="variables_set" id="l4hi$+hH#(Oz+-[mA(">
      <field name="VAR" id="020}aVTZlug2TWsjH/8" variabletype="">sAusgabeText</field>
      <value name="VALUE">
      <block type="text" id="qQ3w+b1#_%4f%r;Zgdza">
      <field name="TEXT">""</field>
      </block>
      </value>
      <next>
      <block type="controls_if" id="Oo2%@8eDlvaOC!7Tfka@">
      <mutation else="1"></mutation>
      <value name="IF0">
      <block type="variables_get" id="U3eZ^#BwI^QZ2+G/E9">
      <field name="VAR" id="~pQOs?dGT6XyDYTXUr0Y" variabletype="">bWichtig</field>
      </block>
      </value>
      <statement name="DO0">
      <block type="debug" id="2B+b0@6slmyMJ_ZLd$7h">
      <field name="Severity">log</field>
      <value name="TEXT">
      <shadow type="text" id="({^;:rX
      bQKCdBs3Jbc">
      <field name="TEXT">Wichtig, also nicht in der Liste speichern</field>
      </shadow>
      </value>
      <next>
      <block type="timeouts_settimeout" id="d8TvtbcVyxIDeKLze#n"> <field name="NAME">AppBenachrichtigungFreigeben2</field> <field name="DELAY">5</field> <field name="UNIT">sec</field> <statement name="STATEMENT"> <block type="procedures_callnoreturn" id=",h*yFnzT5S8M^Qbm4q,h"> <mutation name="EntferneAppNameAusListe"></mutation> </block> </statement> </block> </next> </block> </statement> <statement name="ELSE"> <block type="timeouts_settimeout" id="jGl$l#L.mKoJJNZ?^JWI"> <field name="NAME">AppBenachrichtigungFreigeben</field> <field name="DELAY">1</field> <field name="UNIT">min</field> <statement name="STATEMENT"> <block type="procedures_callnoreturn" id="zH~XoI.lHr?QmPa~([C">
      <mutation name="EntferneAppNameAusListe"></mutation>
      </block>
      </statement>
      </block>
      </statement>
      </block>
      </next>
      </block>
      </next>
      </block>
      </next>
      </block>
      </statement>
      <next>
      <block type="variables_set" id="tBmSKzx[U%s9iz5QTAxR">
      <field name="VAR" id="0
      20}aVTZlug2TWsjH/8" variabletype="">sAusgabeText</field>
      <value name="VALUE">
      <block type="text" id="wH^W4C0[iErqlPT3|wZ|">
      <field name="TEXT"></field>
      </block>
      </value>
      </block>
      </next>
      </block>
      </next>
      </block>
      </next>
      </block>
      </statement>
      </block>
      <block type="procedures_defnoreturn" id="qPhOK/NFg^plZ6ypiA[8" x="38" y="1488">
      <field name="NAME">EntferneAppNameAusListe</field>
      <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
      <statement name="STACK">
      <block type="comment" id="nwV~1KrR%pKuB9mb?uU"> <field name="COMMENT">AppNamen in der Liste suchen und durch leeren String ersetzen</field> <next> <block type="debug" id="5q0k}3+Rh{t*nny?./6N"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="KA,G!*QR[a@=@%!JRPKk"> <field name="TEXT">test</field> </shadow> <block type="text_join" id="|9/qA343vJAr?qnAAc">
      <mutation items="3"></mutation>
      <value name="ADD0">
      <block type="text" id="zd=j(eSl+9VpEZQdyksu">
      <field name="TEXT">Entferne </field>
      </block>
      </value>
      <value name="ADD1">
      <block type="variables_get" id="#IarAH!!kn~Lvj{:qw$T">
      <field name="VAR" id="rv[D5#M#xl-fl_IAJ/yX" variabletype="">AppName</field>
      </block>
      </value>
      <value name="ADD2">
      <block type="text" id="I[BoP8b,hQORY5,T4x;-">
      <field name="TEXT"> aus der Liste</field>
      </block>
      </value>
      </block>
      </value>
      <next>
      <block type="lists_setIndex" id="l(3pN^0g2Q=Dc$lv#B.,">
      <mutation at="true"></mutation>
      <field name="MODE">SET</field>
      <field name="WHERE">FROM_START</field>
      <value name="LIST">
      <block type="variables_get" id="Mc3JP5TWSeFB$kWL4TB*">
      <field name="VAR" id="PR/pQwdg6c+A.GJ/,BQ" variabletype="">listeAppNames</field> </block> </value> <value name="AT"> <block type="lists_indexOf" id="fu;FdH~@9]A1B0XG0WmI"> <field name="END">FIRST</field> <value name="VALUE"> <block type="variables_get" id="iY}nrDC%*J!$ET)S9Wv="> <field name="VAR" id="PR/pQwdg6c+A.GJ/,BQ" variabletype="">listeAppNames</field>
      </block>
      </value>
      <value name="FIND">
      <block type="variables_get" id="/I~oszp`S?wYQ649gUT{">
      <field name="VAR" id="rv[D5#M#xl-fl_IAJ/yX" variabletype="">AppName</field>
      </block>
      </value>
      </block>
      </value>
      <value name="TO">
      <block type="text" id="Oo_2i)*?pq?3mgH|,e6
      ">
      <field name="TEXT">""</field>
      </block>
      </value>
      </block>
      </next>
      </block>
      </next>
      </block>
      </statement>
      </block>
      </xml>

      posted in Skripten / Logik
      C
      CruziX
    • [Skript] WindowsControl-Socket - Windows per Server steuern

      Hallo Zusammen, wie bereits an ein paar Stellen erwähnt habe ich eine eigene WindowsControl Version auf Basis von NodeJs entwickelt.
      Wieso? Eigentlich nur, weil ich ein Projekt entwickeln wollte.

      Es gibt bereits den Adapter Windows-Control der in Verbindung mit dem Tool GetAdmin in die gleiche Richtung geht (https://forum.iobroker.net/post/398985).

      Im Grunde steht das meiste auch möglichst einfach erklärt in der Github readme.

      Nur kurz:

      • Die Verbindung läuft über Socket.io
      • Es lassen sich Befehle und z.B. Benachrichtigungen an den Windows Client schicken
      • Auf dem Client wird anders als bei GetAdmin die Installation von NodeJs benötigt

      https://github.com/xCruziX/iobroker.WindowsControl-Socket


      0ac5ee86-fb7c-469f-8378-f901e4c2f71c-image.png

      Wenn ich die Zeit und Motivation dafür finde könnte ich mir auch mal anschauen wie sich daraus ein Adapter basteln lässt.

      @liv-in-sky

      posted in Entwicklung
      C
      CruziX
    • RE: [Vorlage] Alias per Skript erzeugen

      So, ich hatte ja schon erwähnt, dass meine Version des Skripts etwas mehr kann.

      Möchte euch dieses zur Verfügung stellen.
      Dazu die Anmerkung, dass ich noch ziemlicher Anfänger in JavaScript bin 😅

      Was dieses Skript kann:

      • Erzeugung von Alias Datenpunkten
      • Die Werte wie Quelle des Alias, Ziel Datenpunkt des Alias, Raum, Funktion etc. können alle der Funktion selber übergeben werden
      • Der Präfix alias.0. kann hierbei weggelassen werden und wird automatisch generiert
      • Um Räume und Funktionen dem Alias mitzugeben sind diese beim Aufrufen der Methode mitzugeben und am Ende des Skripts muss die Funktion assignEnums() einmalig aufgerufen werden
      • Die Knoten Datenpunke (Im Objektexplorer als Ordner dargestellt) über den eigentlichen Alias Werten können mit den Variablen bCreateAliasPath und bConvertExistingPath so erstell/umgewandelt werden, dass man ihnen Räume und Funktionen zuordnen kann

      bCreateAliasPath
      => Beim Anlegen eines Alias, werden die Knoten Datenpunkte die noch nicht existieren, direkt so erstellt, dass man ihnen Räume und Funktionen zuweisen kann.

      bConvertExistingPath (Erfordert das bCreateAliasPath auf true gesetzt ist)
      => Auch schon existierende Knoten Datenpunkte werden konvertiert um Räume und Funktionen zuweisen zu können.

      UPDATE
      Die Methode assignEnum muss nicht mehr am Ende des Skripts ausgeführt werden, sie wird mittels Timeout automatisch ausgelöst

      https://github.com/xCruziX/ioBroker-Creating-Alias

      posted in JavaScript
      C
      CruziX
    • RE: [Aufruf] Welche guten JavaScripts setzt ihr ein?

      Dieses Skript Räumt in den Räumen und Funktionen auf.
      Die Funktion cleanEnum nimmt 2 Parameter (true, oder false) an.
      Der erste ist zum Löschen von nicht mehr existierenden Datenpunkten, der zweite zum Löschen von Doppelten Datenpunkten in der Aufzählung.

      Wenn beide Parameter mit false übergeben werden, passiert nichts, aber es kommen dennoch Meldungen, wenn was gefunden wurde.

      https://github.com/xCruziX/ioBroker-Clean-Enums/blob/master/CleanEnums.js

      posted in JavaScript
      C
      CruziX
    • RE: Blockly Timer

      @Horst-Böttcher ich würde hierbei mit einem timeout arbeiten, der dann auch am Anfang immer gestoppt wird

      posted in Blockly
      C
      CruziX
    • RE: [Skript] WindowsControl-Socket - Windows per Server steuern

      @liv-in-sky In der neusten Version ist das Powershell Fenster nicht zu sehen

      posted in Entwicklung
      C
      CruziX
    • RE: Blockly Script als Szene in Alexa

      @Buchi Ich habe anfänglich auch die Summary genommen, das aber schnell verworfen.
      Sobald man dazu kommt, dass man von Alexa keine Fehlermeldung bekommen möchte, da Alexa den Befehl nicht kennt, erstellt man eh eine Routine.
      Daher hab ich es mir gespart die Summary auf einen bestimmten Befehl zu prüfen, was auch wieder fehleranfällig ist, wozu auch, das übernimmt alexa ja in der Routine für einen ^^

      posted in Cloud Dienste
      C
      CruziX
    • RE: [Vorlage] JS: Log-Datei aufbereiten für VIS

      @Mic An dieser Stelle auch mal Danke 👍 Hab das Skript zwar in keiner Vis oder sonstiges, lasse mich aber bei Warnungen und Errors jetzt informieren 🙂

      posted in JavaScript
      C
      CruziX
    • RE: [erledigt] Über iobroker simulierten Sprachbefehle an Alexa

      Ansonsten eine Routine anfertigen die das tut und diese über Alexa2 aktivieren

      posted in Blockly
      C
      CruziX
    • RE: Interesse an Gotify adapter?

      @tobi68 sagte in Interesse an Gotify adapter?:

      @thomaspohl

      Könnte ich damit aus der Vis „Essen fertig“ auf einen PC im Lan schicken der gerade am Zocken ist?

      Ich weiß nicht ob das mit diesem geht, aber ich bin gerade dabei eine von mir entwickelte Anwendung massentauglicher zu machen, die u.a. auf Windows PCs Benachrichtigen anzeigen lassen kann.
      https://github.com/xCruziX/WindowsControlNode

      Sollte in ein paar Tagen soweit sein, dass ich damit fürs erste zufrieden bin.

      posted in Entwicklung
      C
      CruziX

    Latest posts made by CruziX

    • RE: Google Home/Assistant ioBroker einrichten/nutzen

      Hey, ich spiele mittlerweile schon eine Weile mit dem IOT Adapter rum und meine Versuche den Helligkeitsregler einer Lampe einzubinden sind bisher gescheitert.

      Hier das JSON des Datenpunktes:

      {
       "type": "state",
       "common": {
         "name": "Brightness",
         "type": "number",
         "unit": "%",
         "read": true,
         "write": true,
         "role": "value.brightness",
         "min": 0,
         "max": 100,
         "alias": {
           "id": "zigbee.0.14b457fffe4ec53e.brightness"
         },
         "smartName": {
           "de": "Flurlicht",
           "ghConv2GH": "",
           "ghConv2iob": "",
           "ghType": "action.devices.types.LIGHT",
           "ghTraits": [
             "action.devices.traits.Brightness"
           ],
           "ghAttributes": "{}"
         }
       },
       "native": {},
       "_id": "alias.0.Flur.Licht.Helligkeit",
       "acl": {
         "object": 1636,
         "state": 1636,
         "owner": "system.user.admin",
         "ownerGroup": "system.group.administrator"
       },
       "from": "system.adapter.iot.0",
       "user": "system.user.admin",
       "ts": 1697026368939
      }
      

      Und hier die Einstellungen in IOT:


      e889736d-a538-473d-8ed8-3f7fffb8784c-image.png

      Für den Anfang würde ich gerne meine Lampen mit An und Aus Switch sowie Helligkeitsregler ( 0 - 100% einbinden) nur wird mir einfach keine Helligkeitsreglung in Google Home angezeigt.

      Könnte mir da jemand bitte ein paar Anhaltspunkte geben wie ich das genau konfigurieren muss um eben die entsprechen 2 Dinge steuern zu können?

      posted in ioBroker Allgemein
      C
      CruziX
    • RE: (SOLVED) Create Alias in TypeScript

      @uwe72 ja, verstehe was das Problem ist, habe in meinem vorherigen Post den Common type mit optionalen Properties ergänzt und die zeile entfernt wo alias mit {} gesetzt wird. Sollte nun klappen

      posted in JavaScript
      C
      CruziX
    • RE: (SOLVED) Create Alias in TypeScript

      @uwe72

      const idAlias = "test12345";
      const idOrigin = "deconz.1.Lights.2.on";
      
      type TAlias = {
       id: string;
      };
      
      type TCommon = {
       type?: string;
       alias?: TAlias;
      }; 
      
      type TCustomObject ={
       type: string;
       common: TCommon;
      };
      function createAlias(idSrc: string, idDst: string, typeAlias: string) {
         if(!getObject(idDst)) {
            var obj: TCustomObject = {
       type: 'state',
       common: {
      type: '',
      alias: {
      id: ''
      }
      }
      };
            obj.common = getObject(idSrc).common;
            if(typeAlias) obj.common.type = typeAlias;
            obj.common.alias.id = idSrc;
            setObject(idDst, obj);
         } //else log ("Alias schon vorhanden: " + idDst, 'warn'); 
      }
      

      Kurz mitm Handy getippt, vielleicht hilfts ja

      posted in JavaScript
      C
      CruziX
    • RE: [Tutorial] Xiaomi BWM HW Hack / 120s -> 5s Takt

      @kusselin Kleiner Tipp, auf geändert prüfen und nach 1 Sek selbst wieder auf false setzen.
      So hab ich es. Dafür muss man aber den Datenpunkt beschreibbar machen.

      posted in Praktische Anwendungen (Showcase)
      C
      CruziX
    • RE: Error aus Log File per Pushover/Telegram versenden

      @sali84 versuch mal folgendes:

      let timeout = null;
      let message = '';
      
      onLog('error', data => {
          if (data.from && data.from.includes('telegram.')) {
              return; // prevent loop
          }
          message += data.message + '\n';
          const telegramMessage = "Error occured:" + "\n" + message 
          clearTimeout(timeout);
          timeout = setTimeout(() => {
              sendTo("telegram.0","send", {
              text: telegramMessage ,
              chatID: 123456789
              });
              message  = '';
          console.log('Following was sent to telegram: ' + message );
          },10000)
      });
      
      posted in Skripten / Logik
      C
      CruziX
    • RE: Alte Dateien löschen

      Kenne den Befehl nicht, aber dein iobroker Verzeichnis wird sicherlich nicht unter root / liegen.
      Der Pfad /iobroker/SmartHome/iobroker-data/files/ring.0/doorbell_53727335 ist also ungültig.
      Versuch mal den absoluten Pfad zu verwenden, dein Ordner liegt vermutlich in /opt

      posted in Skripten / Logik
      C
      CruziX
    • RE: [HowTo] Nodejs versionsverwaltung unter Linux/MacOS

      @jey-cee Achso, wusste nicht, dass es damals mit den Benutzern anders war.
      Finde nvm was das aktualisieren von Versionen usw. geht ganz charmant, daher hatte ich die Idee und diesen Thread gefunden.

      posted in ioBroker Allgemein
      C
      CruziX
    • RE: [HowTo] Nodejs versionsverwaltung unter Linux/MacOS

      @jey-cee Kann man aktuell noch von einer normalen version auf nvm wechseln?
      Habs eben versucht, aber die iobroker installation findet keine node installation. Ich nehme an, da ich mit einem anderen Benutzer in der Shell bin und nvm im user verzeichnis installiert wird.
      In den iobroker nutzer kann ich mich nicht einloggen und wenn ich commands mit sudo als iobroker ausführe, bekomme ich zwar nvm im iobroker home installiert, aber die Befehler für nvm funktionieren nicht.

      posted in ioBroker Allgemein
      C
      CruziX
    • RE: [Vorlage] Tasmota One Click Firmware Update Vis Javascript.

      @smartboart Tatsächlich hab ich das gesamte Skript bisher noch nie laufen, weil ich normaler Weise die Updates mit Tasmoadmin mache.
      Bin noch nicht dazu gekommen mal zu überlegen inwieweit das Skript für mich einen Mehrwert hat, da ich den tasmoadmin server eh schon laufen habe 😛
      Hab nur gerade mal aus Interesse und etw Zeit dein Skript gefunden und ein wenig "optimiert"

      posted in JavaScript
      C
      CruziX
    • RE: [Vorlage] Tasmota One Click Firmware Update Vis Javascript.

      @smartboart Hab mal das Skript ein wenig überarbeitet, aber nicht getestet:

      /*
      von Smartboart / ioBroker Forum
      -
      https://forum.iobroker.net/topic/38118/tasmota-one-click-firmware-update-vis-javascript
      -
      31.10.2020
      -
      Tasmota One Click Firmware Update Vis.extra auch für Geräte die für das internet gesperrt sind.
      automatischer Download der firmware / minimal , sensors, tasmota und speichern auf dem file system.
      Starten eines lokalen http: Servers (python) per ssh und einleiten des OTA download der Tasmota Firmware.
      für selektierbare Geräte über Vis.
      -
      Nötige Addons im javascript adapter: node-ssh und fs
      -
      inspiriert durch das script um auf neue Tasmota Version zu prüfen von forummitglied Machinima..
      https://forum.iobroker.net/topic/22389/skript-um-auf-neue-tasmota-version-zu-pr%C3%BCfen/11
      -
      31.10.2020 Beta release
      V0.0.1  Automatisches Tasmota Firmwaredownload bei Update Benachrichtigung:
             onclickupdate mit http Server Start (python) über ssh inkl Vorwahl des abzudatenden Teilnehmers.
      {1}
      31.10.2020
      V0.0.2  Konfigurationsteil überarbeitet http source.
      {1}
      03.11.2020
      V0.0.3  Kommentare ergänzt um mölichen Missverständnissen entgegen zu wirken.
             Beim Scriptstart immer die bins runterladen, auch wenn kein Update verfügbar um sicher zu stellen, dass immer was im Download Ordner liegt.
      {1}
      06.11.2020
      V0.0.4  Implementierung der Funktion Update All
             Im Bereich der Device Zuordnung mussten anpassungen vorgenommen werden umd diese beim Updat All der Reihe nach abarbeiten zu können.
             Dazu wurde auch der Userconfig Bereich angepasst.
             Anzahl Geräte wird Automatisch ermittelt und gesetzt. Device 1 - n / AnzahlSensors ist für Sensor reserviert.
             AnzahlSensors muss im Konfigbereich eingetragen werden. Standart Tasmota Firmware Geräte sind dann automatisch gesetzt von
             Anzahl Sensors bis automatisch ermittelte Geräte.
      {1}
             Hinweis: damit nicht während des Update Prozess durch Eingabe in Vis beim derDevice Auswahl die Schrittkette durcheinander gebract wird, sollte
             das widget für die DeviceAuswahl nur Sichtbar sein wenn der neue State javascript.0.Status.Tasmota.Tasmota_Firmware.UpdateAll false ist.
             Um alle Geräte upzudaten muss nun einfach der State UpdateAll auf true gesetzt werden und dann mit dem State UpdateStart das Update eingeleitet
             werden. Das einzeln Update der Geräte bleibt natürlich erhalten und ist aktiv wenn UpdateAll false ist.
             Nach Update All wird automatisch die Funktion funcVersion gestartet um alle Geräte nach der installierten Version zu befragen. Im Log kann nun
             alles nachvollzogen werden.
      {1}
      17.12.2020
      V0.0.4 kleine Fehlerkorrekturen
      {1}
      To do....Wenn es die Zeit zulässt..
      zusätzlich den Changelog in den Versionsinfostate schreiben.
      */
      createState('javascript.0.Status.Tasmota.Tasmota_Firmware.Update', {
       def: false,
       type: 'boolean',
       name: 'Tasmota Update verfügbar'
      });
      createState('javascript.0.Status.Tasmota.Tasmota_Firmware.Version', {
       type: 'string',
       read: true,
       write: true,
       desc: 'Tasmota Firmware Version online',
       name: 'Tasmota Firmware Update Version'
      });
      createState('javascript.0.Status.Tasmota.Tasmota_Firmware.Updatestart', {
       def: false,
       type: 'boolean',
       name: 'Tasmota Firmware Update starten'
      });
      createState('javascript.0.Status.Tasmota.Tasmota_Firmware.UpdateAll', {
       def: false,
       type: 'boolean',
       name: 'Tasmota Firmware Update Alle starten'
      });
      
      
      const fc = true; // force creation zum aktualisieren des Auswahl state
      
      //  1 - AnzahlSensors (bei mir 17) müssen Sensor Geräte zugeordnet haben
      //  > AnzahlSensors +  sind Standart Firmware Geräten vorbehalten.
      createState('javascript.0.Status.Tasmota.Tasmota_Firmware.Auswahl', 0, fc, {
       def: 0,
       type: 'number',
       name: 'Auswahl Teilnehmer fuer Tasmota Firmware Update',
       min: 0,
       max: 100,
       role: 'value',
       states: {
           0: 'keine Vorwahl',
           1: 'Wemo Pro Test',
           2: 'Wemo Pro Garage',
           3: 'Wemo Schuppen',
           4: 'Wemo Schlafzimmer',
           5: 'Wemo Keller',
           6: 'Wemo Huette',
           7: 'Wemo Fitttnessraum',
           8: 'Wemo Eingang',
           9: 'Wemo Dachboden',
           10: 'Steckdose Waschmaschine',
           11: 'Steckdose Trockner',
           12: 'Steckdose Spülmaschine',
           13: 'Steckdose Dunstabzug',
           14: 'Steckdose 4',
           15: 'Steckdose 3',
           16: 'Steckdose 2',
           17: 'Steckdose 1',
           18: 'Steckdosenleiste WZ',
           19: 'Steckdosenleiste FR',
           20: 'RGBW Briefkasren',
           21: 'RGBW Bad',
           22: 'Reserve',
           23: 'Reserve',
           24: 'Reserve',
           25: 'Reserve',
           26: 'Reserve',
           27: 'Reserve',
           28: 'Reserve',
           29: 'Reserve',
           30: 'Reserve',
           31: 'Reserve',
           32: 'Reserve',
           33: 'Reserve',
           34: 'Reserve',
           35: 'Reserve',
           36: 'Reserve',
           37: 'Reserve',
           38: 'Reserve',
           39: 'Reserve',
           40: 'Reserve',
       }
      });
      
      // User konfig
      const WARTEZEIT = '*/1 * * * *'; // jede Minute Trigger Wartezeit zwischen den Updates der Tasmota Geräte
      const TIMEOUT = 45 * 1000; // Wartezeit zwischen dem upgrade von minimal auf sensors oder tasmota
      const TIMEOUT2 = 1000; // Wartezeit zwischen URL Set und Upgrade bzw. http start und URL minimal set
      const DOWNLOAD = true; // automatischer Firmware download wenn update verfügbar
      const LOGGING = true;
      const DEBUG = false;
      const SEND_TELEGRAM = true;
      const SEND_MAIL = true;
      const ANZAHL_SENSORS = 17; // Hier die Anzahl der TasmotaSensor Geräte eintragen Entspicht Devices 1-17
      
      // ssh Konfigbereich
      // sudo python3 -m http.server 8000 im Terminal testen. Startet den minimal http server
      const SSH_IP = '192.168.xx.xx';
      const SSH_USR = 'deinUser';
      const SSH_PWD = 'deinPasswort';
      const SSH_CMD = 'python3 -m http.server 8000';
      
      // Ordner müssen angelegt werden unter dem ssh Benutzer home/pi und muss schreibrechte für iobroker haben
      // sudo chmod -R 777 /home/pi/Tasmota
      const DEST_PATH1 = 'home/pi/Tasmota/tasmota-sensors.bin.gz';
      const DEST_PATH2 = 'home/pi/Tasmota/tasmota.bin.gz';
      const DEST_PATH3 = 'home/pi/Tasmota/tasmota-minimal.bin.gz';
      
      //http IP Downloadlink muss auch im Browser funktionieren wenn die bins dort liegen
      const SOURCE_SENSORS = '192.168.xx.xx:8000/Tasmota/tasmota-sensors.bin.gz';
      const SOURCE_MINIMAL = '192.168.xx.xx:8000/Tasmota/tasmota-minimal.bin.gz';
      const SOURCE_TASMOTA = '192.168.xx.xx:8000/Tasmota/tasmota.bin.gz';
      
      // download Quelle der tasmota firmware
      const DOWNLOAD_LINK1 = 'http://ota.tasmota.com/tasmota/release/tasmota-sensors.bin.gz'; //downloadlink für bin file
      const DOWNLOAD_LINK2 = 'http://ota.tasmota.com/tasmota/release/tasmota.bin.gz'; //downloadlink für bin file
      const DOWNLOAD_LINK3 = 'http://ota.tasmota.com/tasmota/release/tasmota-minimal.bin.gz'; //downloadlink für bin file
      
      //Sensors Tasmota Firmware
      // Device 1 - AnzahlSensors müssen Sensor Geräte zugeordnet haben. >Anzahl Sensors bis AnzahlDevice ist für Standart Tasmota Firmware
      const DEVICES = [
       '192.168.x.xx', //NodeMCUTest
       '192.168.x.xx', //WemoProGarage
       '192.168.x.xx', //WemoSchuppen
       '192.168.x.xx', //WemoSchlafzimmer
       '192.168.x.xx', //WemoKeller
       '192.168.x.xx', //WemoHuette
       '192.168.x.xx', //WemoFitttnesraum
       '192.168.x.xx', //WemoEingang
       '192.168.x.xx', //WemoDachboden
       '192.168.x.xx', //SteckdoseWama
       '192.168.x.xx', //SteckdoseTrockner
       '192.168.x.xx', //SteckdoseSpülmaschine
       '192.168.x.xx', //SteckdoseDunstabzug
       '192.168.x.xx', //Steckdose4
       '192.168.x.xx', //Steckdose3
       '192.168.x.xx', //Steckdose2
       '192.168.x.xx', //Steckdose1
      
       // Device 18 +  sind Standart Firmware Geräten vorbehalten
       '192.168.x.xx', //SteckdosenleisteWZ
       '192.168.x.xx', //SteckdosenleisteFR
       '192.168.x.xx', //RGBW1
       '192.168.x.xx' //RGBWBad
      ]
      
      // User States / Objekte
      const idUpdate = 'javascript.0.Status.Tasmota.Tasmota_Firmware.Update';
      const id_Version_Internet = 'javascript.0.Status.Tasmota.Tasmota_Firmware.Version';
      const idUpdatestart = 'javascript.0.Status.Tasmota.Tasmota_Firmware.Updatestart';
      const idAuswahl = 'javascript.0.Status.Tasmota.Tasmota_Firmware.Auswahl';
      const idUpdateAll = 'javascript.0.Status.Tasmota.Tasmota_Firmware.UpdateAll';
      
      
      let cacheSelectorTasmotaVersions = $('channel[state.id=sonoff.0.*.Version]');
      
      // fs und node-ssh unter Einstellungen im javascript Adapter hinzufügen
      const fs = require('fs');
      const request = require('request');
      const node_ssh = require('node-ssh').NodeSSH;
      let select = '';
      let sshcommand = false;
      let Sensor = null;
      let Tasmota = null;
      let trigger = null;
      let AnzahlDevice = 0; //Anzahl der Tasmota Geräte. Wichtig für Update aller Geräte
      
      let _message = '';
      let _message_tmp = '';
      
      function bLOG(str) {
       if (LOGGING) log(str);
      }
      
      function bDEBUG(str) {
         if (DEBUG) console.debug(`[DEBUG] ${str}`);
       }
      
      function func_Version() {
       let options = {
           url: 'https://api.github.com/repos/arendst/Tasmota/releases/latest',
           headers: {
               'User-Agent': 'ioBroker Tasmota Firmware Check'
           }
       };
       request(options, async function(error, response, body) {
           const availableFirmware = getState(id_Version_Internet).val;
           if (error) {
               log('error: ' + error);
           } else {
               let tasmotaJson = JSON.parse(body);
               let tasmotaTagName = tasmotaJson.tag_name;
               let tasmotaVersion = tasmotaTagName.replace(/v/i, "").trim();
               if (availableFirmware.length === 0) {
                   bLOG(`Ausgewähltes Objekt leer. Firmware wird erstmalig gesetzt. Firmware: ${tasmotaVersion}`); // +' Zentrale: ' +Version[3]);
                   await setStateAsync(id_Version_Internet, tasmotaVersion);
               }
               let devices = [];
               cacheSelectorTasmotaVersions.each(async function(id, i) {
                   AnzahlDevice++;
                   const installedFirmware = getState(id).val.trim().
                     .replace('(sonoff)', '').trim()
                     .replace('(tasmota)', '').trim()
                     .replace('(sensors)', '').trim();
      
                   let infoId = id.substring(0, id.lastIndexOf("."));
                   let hostName = getState(infoId + '.Hostname').val;
                   if (installedFirmware == tasmotaVersion) {
                       bLOG(`Tasmota: Installierte Firmware für Gerät ${hostName} ist aktuell.`);
                   } else {
                       bLOG(`Tasmota: Installierte Firmware für Gerät ' + hostName + ' (${installedFirmware}) ist nicht aktuell. Aktuell verfügbare Version: ${tasmotaVersion}`);
                       if (availableFirmware == tasmotaVersion) {
                         await setStateAsync(idUpdate, false, true);
                         bDEBUG('Tasmota: Version Internet hat sich nicht verändert');
                       } else {
                           setState(idUpdate, true, true);
                           bDEBUG('Tasmota: Installierte Firmware ist nicht aktuell.');
                           await setStateAsync(id_Version_Internet, tasmotaVersion);
                           devices.push(hostName + ' (' + installedFirmware + ')');
                       }
                   }
               });
               if (devices.length > 0) {
                   _message_tmp = `Neue Tasmota-Firmware ${tasmotaVersion} für folgende Geräte verfügbar:\n${devices.join('\n')}`;
                   if (SEND_TELEGRAM) {
                       _message = _message_tmp;
                       send_telegram();
                   }
                   if (SEND_MAIL) {
                       _message = _message_tmp;
                       send_mail();
                   }
               }
           }
       });
      }
      
      function send_telegram() {
       sendTo('telegram.0', {
           text: _message
       });
      }
      
      function send_mail() {
       sendTo("email", {
           subject: "Servicemeldung",
           text: _message
       });
      }
      // um 12:01 Uhr prüfen
      schedule({
       hour: 12,
       minute: 1
      }, func_Version);
      
      function downloadFile(link) {
       request.get({
           url: DOWNLOAD_LINK1,
           encoding: 'binary'
       }, function(err, response, body) {
           if (err) {
               return log(`Tasmota: Fehler beim Download: ${err}`);
           }
           fs.writeFile(DEST_PATH1, body, 'binary', function(err) {
               const fileName = DOWNLOAD_LINK1.split('/').pop();
               if (err) {
                   return log(`Tasmota: Fehler beim Speichern: ${err}`);
               }
               bLOG(`Tasmota: Firmwaredownload ${fileName} gestartet `);
           });
       });
      }
      
      // http Server starten
      on({
       id: idUpdatestart,
       val: true,
       change: 'ne'
      }, async function() {
       let UpdateAll = getState(idUpdateAll).val;
       if (UpdateAll === false) {
           setTimeout(function() {
               minimalURLset();
               await setStateAsync(idUpdatestart, false, true);
           }, TIMEOUT2);
       } else {
           startUpdateAll();
       }
       if (!sshcommand) {
           sshcommand = true;
           let ssh = new node_ssh();
           ssh.connect({
               host: SSH_IP,
               username: SSH_USR,
               password: SSH_PWD
           }).then(() => {
               ssh.execCommand(SSH_CMD);
           });
       }
      });
      
      // Alles updaten Alle Geräte werden von 1 an durchgezählt
      async function startUpdateAll() {
       let count = 1;
       await setStateAsync(idAuswahl, 1, true);
       bLOG(`Tasmota: Update aller Geräte gestartet. Aktuell wird das Update für Device ${count} gestartet.`);
       setTimeout(minimalURLset, 100);
       trigger = schedule(WARTEZEIT, function() {
           count++;
           await setStateAsync(idAuswahl, count, true);
           setTimeout(minimalURLset, 100);
           bLOG(`Tasmota: Aktuell wird das Update für Device ${count} gestartet.`);
           if (count === AnzahlDevice) {
               clearSchedule(trigger);
               setTimeout(asnc function() {
                   func_Version();
                   await setStateAsync(idAuswahl, 0, true);
               }, 2 * TIMEOUT);
               setTimeout(async function() {
                 await setStateAsync(idUpdatestart, false, true);
                 await setStateAsync(idUpdateAll, false, true);
                   count = 0;
               }, TIMEOUT2);
           }
       });
      }
      
      // Entscheiden ob Sensor oder Tasmota aktiv für Upgrade und Device Vorwahl
      on(idAuswahl, function(dp) {
       if (dp.state.val > 0 && dp.state.val <= ANZAHL_SENSORS) {
           Sensor = true;
           Tasmota = false;
       }
       if (dp.state.val > ANZAHL_SENSORS) {
           Sensor = false;
           Tasmota = true;
       }
       if (DEVICES.length >= dp.state.val) {
           select = DEVICES[dp.state.val - 1];
       }
       bLOG(`Tasmota: Folgende IP wurde für das Update vorgewählt: ${select}`);
      });
      
      
      // minimal URL setzen und update
      
      function minimalURLset() {
       let Auswahl = getState(idAuswahl).val;
       if (DOWNLOAD && Auswahl > 0)
           request(`http://${select}/cm?cmnd=OtaUrl%20http://${SOURCE_MINIMAL}`, function(error, response, body) {
               if (error) {
                   log(`Tasmota: Fehler beim  setzen der OTA Minimal URL für: ${select} ${error}`);
               } else {
                   bLOG(`Tasmota: OTA Firmware URL auf Minimal gesetzt für IP: ${select}`);
                   setTimeout(minimalUpgrade, TIMEOUT2);
               }
           });
      }
      
      function minimalUpgrade() {
       request(`http://${select}/cm?cmnd=upgrade%201`, function(error, response) {
           if (error) {
               log('Tasmota: Fehler beim setzen des Minimal Upgrade Befehl für: ' + select + ' ' + error);
           } else {
               bLOG('Tasmota: OTA Firmware upgrade Minimal für IP: ' + select);
               setTimeout(function() {
                   if (Sensor) sensorURLset();
                   if (Tasmota) TasmotaURLset();
               }, TIMEOUT);
           }
       });
      }
      
      
      // Sensor URL setzen und update
      function sensorURLset() {
       request(`http://${select}/cm?cmnd=OtaUrl%20http://${SOURCE_SENSORS}`, function(error, response) {
           if (error) {
               log('Fehler beim  setzen der OTA Sensor URL für: ' + select + ' ' + error);
           } else {
               bLOG('Tasmota: OTA Firmware URL auf Sensor gesetzt für IP: ' + select);
               setTimeout(sensorUpgrade, TIMEOUT2);
           }
       });
      }
      
      function sensorUpgrade() {
       request(`http://${select}/cm?cmnd=upgrade%201`, function(error, response) {
           if (error) {
               log('Tasmota: Fehler beim setzen des Sensor Upgrade Befehl für: ' + select + ' ' + error);
           } else {
               bLOG('Tasmota: OTA Firmware upgrade Sensors für IP: ' + select);
           }
       });
      }
      
      // Tasmota URL setzen und update
      function TasmotaURLset() {
       request(`http://${select}/cm?cmnd=OtaUrl%20http://${SOURCE_TASMOTA}`, function(error, response) {
           if (error) {
               log('Fehler beim  setzen der OTA Tasmota URL: ' + error);
           } else {
               bLOG('Tasmota: OTA Firmware URL auf Tasmota gesetzt für IP: ' + select);
               setTimeout(tasmotaUpgrade, TIMEOUT2);
           }
       });
      }
      
      function tasmotaUpgrade() {
       request(`http://${select}/cm?cmnd=upgrade%201`, function(error, respnsoe) {
           if (error) {
               log('Tasmota: Fehler beim setzen des Tasmota Upgrade Befehl für: ' + select + ' ' + error);
           } else {
               bLOG('Tasmota: OTA Firmware upgrade Tasmota für IP: ' + select);
           }
       });
      }
      
      
      // Firmware automatisch herunter laden
      on({
       id: idUpdate,
       val: true,
       change: 'ne'
      }, function(dp) {
       if (DOWNLOAD) {
           downloadFile(DOWNLOAD_LINK1);
           downloadFile(DOWNLOAD_LINK2);
           downloadFile(DOWNLOAD_LINK3);
       }
      });
      
      
      //beim SkriptStart
      func_Version();
      
      if (DOWNLOAD) {
       setTimeout(function() {
           let Update = getState(idUpdate).val;
           if (Update === false) {
               downloadFile(DOWNLOAD_LINK1);
               downloadFile(DOWNLOAD_LINK2);
               downloadFile(DOWNLOAD_LINK3);
           }
       }, 10 * 1000);
      }
      
      
      setTimeout(function() {
       bLOG('Tasmota: ' + AnzahlDevice + ' Geräte gefunden');
      }, 1000);
      

      posted in JavaScript
      C
      CruziX
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo