Ankündigung

Einklappen
Keine Ankündigung bisher.

IPGetClient Makro

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    IPGetClient Makro

    Hallo,

    für die Ansteuerung eines Shelly1PM Relais nutze ich das Makro IPGetClient. In der Visu habe ich dazu einen Schalt Button als Umschalten definiert, der den Status aus der Rückmeldung des GET Befehls an den Shelly auswertet. Wenn "true" dann Status EIN, sonst AUS.

    Was ich am Marko nicht verstehe, das auf den Variablen ShellyOnRawData und ShellyOffRawData Inhalte andere IPGetClient abfragen auftauchen, die ich ebenfalls zeitlich gesteuert antrigger.

    Taucht ein anderer Abfrageinhalt auf bekommt ich keinen "true" bzw. "false" Status und der Button kann nicht mehr umschalten.

    Wie ist hier die Logik des Makro? Ich habe das Makros bereits in IPGetClient_Shelly umbenannt (Makro und Makro File). Leider hat das auch keine Abhilfe geschaffen
    Angehängte Dateien
    Zuletzt geändert von JAK; 24.01.2021, 16:04.

    #2
    Das Makro puffert alle eingehenden TCP-Daten, nicht nur die des angefragten:
    Code:
    if event(readtcp(Name^RemotePort,Name^RemoteIP,Name^R awDataIn)) and Name^Get then {
    Name^RawData=Name^RawData+Name^RawDataIn;
    }endif
    Du kannst das erweitern um einen Test, von wem die Daten stammen (ungetestet):

    Code:
    if event(readtcp(Name^RemotePort,Name^RemoteIP,Name^R awDataIn)) and Name^Get then {
    if (Name^RemoteIP == IP) then Name^RawData=Name^RawData+Name^RawDataIn; endif;
    }endif
    Erklärung:
    die Funktion readtcp aktualisiert ihre Argumente, schreibt also die IP und den Port der Gegenstelle, die die Daten gesendet hat, in die Variablen. Die müssen mit der Adresse verglichen werden, an die die Anfrage gesendet wurde.

    Geschachtelte if-Abfragen sind anders als "normale", da nur die äußere Bedingung bei Änderung der Variablen neu ausgewertet wird. Sobald also ein neues Paket kommt wird immer der IP-Vergleich durchgeführt, egal ob sich diese geändert hat oder nicht.
    Zuletzt geändert von foobar0815; 25.01.2021, 09:54.

    Kommentar


      #3
      ich dachte immer, das "Name" vor "^RawData" (Name^RawData) die Variable immer zu einer eindeutigen Variable macht und somit nur die gewünschten Daten der jeweiligen Abfrage empfängt

      Welcher der nginx antwortet denn hier? Der normale Web-Server?
      bei dem niO Anhang oben kommen die Daten von einem Stromzähler (Volkszähler auf einem Raspberry).

      hier der entsprechende Aufruf des Makros dazu.

      //EIN-AUSSCHALTEN SHELLY1PM

      ShellyOn=$$
      ShellyOff=$$
      ShellyOnStart=AUS
      ShellyOffStart=AUS
      ShellyStatusString=$$
      ShellyStatus=AUS
      PosAnfangShelly=0u16
      PosEndeShelly=0u16

      if "Wohnzimmer-Shelly-3/1/19" == EIN then ShellyOnStart=EIN endif
      if "Wohnzimmer-Shelly-3/1/19" == AUS then ShellyOffStart=EIN endif

      IPGetClient_Shelly(ShellyOn,192.168.0.4,$/relay/0?turn=on$,1400,ShellyOnStart,1000)
      IPGetClient_Shelly(ShellyOff,192.168.0.4,$/relay/0?turn=off$,1400,ShellyOffStart,1000)

      if ShellyOnRecieved == EIN then {
      PosAnfangShelly = find(ShellyOnRawData, $"$, 0u16) + 7u16 ;
      PosEndeShelly = PosAnfangShelly + 3u16;
      ShellyStatusString = split(ShellyOnRawData, PosAnfangShelly, PosEndeShelly)
      } endif

      if ShellyOffRecieved == EIN then {
      PosAnfangShelly = find(ShellyOffRawData, $"$, 0u16) + 7u16;
      PosEndeShelly = PosAnfangShelly + 3u16;
      ShellyStatusString = split(ShellyOffRawData, PosAnfangShelly, PosEndeShelly)
      } endif

      if ShellyStatusString == $true$ then ShellyStatus=EIN else ShellyStatus=AUS endif

      if after("Wohnzimmer-Shelly-3/1/19" == EIN,3000u64) then ShellyOnStart=AUS endif
      if after("Wohnzimmer-Shelly-3/1/19" == AUS,3000u64) then ShellyOffStart=AUS endif

      Kommentar


        #4
        Zitat von JAK Beitrag anzeigen
        "Name" vor "^RawData" (Name^RawData) die Variable immer zu einer eindeutigen Variable macht
        ja, falls Name eindeutig ist,

        Zitat von JAK Beitrag anzeigen
        und somit nur die gewünschten Daten der jeweiligen Abfrage empfängt
        Nein. Wie geschrieben, liefern alle Funktionen readtcp oder readudp die Daten aller bestehenden Verbindungen. Das ist insbesondere Hilfreich zum Aufteilen der Verarbeitung, beispielsweise reagiert ein readtcp auf automatisch vom Server gesendete Statusänderungen und eines auf Antworten auf Anfragen.

        Das bedeutet aber, dass du selbst anhand der Gegenstelle unterscheiden musst. Das Makro funktioniert in der Form nur, falls es nur eine Gegenstelle gibt. Kopiere dir also einfach das Makro in eine eigene Lib und passe es wie oben geschrieben an.

        Kommentar


          #5
          Programmierung so umgesetzt wie vorgeschlagen. Funktioniert.
          Besten Dank!

          Kommentar

          Lädt...
          X