+ Antworten
Seite 2 von 2 ErsteErste 1 2
Ergebnis 11 bis 17 von 17
  1. #11
    Registriert seit
    Jun 2012
    Ort
    House of Dragons @ Lübeck
    Beiträge
    10,553

    Vielleicht einfach mal die aktuelle IPS Systemvariablen nutzen.
    $_IPS['VALUE']
    Michael
    on Win10VM (ESXi): I7, 32GB RAM, HW-RAID5, 2xSat | HW: pivccu + ca.130 Geräte (ca.550ch), EM1000, CUL, 1Wire, FritzBox Cable, Android Phone + Tablet, Onkyo NR| SW: IPS, Apache2(mod_ssl/PHP), MySQL, hMailServer, PRTG, RoundCube, Win2016 Ess., MediaPortal, Kodi

  2. #12
    Registriert seit
    Dec 2014
    Ort
    Nürburgring
    Beiträge
    354

    Vielen Dank dafür - ich hatte das Tool zwar, aber diese Version ist neuer!
    Jetzt können auch Lesekommandos geschickt werden.
    Aber das hilft mir mit der RegVar nicht wirklich.
    Wenn ich das Skript aus Post#1 ausführe, dann sieht das Debugging dafür so aus:

    (Skript)
    PHP-Code:
    <?
    $com 
    =14246 /*[Serial Port_RS485]*/;
    $reg=13446 /*[Messsystem\Heizöl\REG_VAR RS485]*/;
    $code "\x24\x52\x4C\x30\x31\x32\x33\x0D\x0A";

        
    COMPort_SetOpen($comtrue);
        
    IPS_ApplyChanges($com);  
    RegVar_SetBuffer($reg"");

    COMPort_SendText ($com$code.chr(13)); 
     
        
    COMPort_SetOpen($comfalse);
        
    sleep (1);
        
    IPS_ApplyChanges($com);  

    echo 
    $data;

    ?>
    (Debug der RegVar)
    Klicken Sie auf die Grafik für eine größere Ansicht 

Name:	RegVar-Debug.JPG 
Hits:	98 
Größe:	100.2 KB 
ID:	39252

    Und die Frage ist, wie kommen die Werte (also ich brauche nur einen davon und zwar nur einmal pro Skriptaufruf) in eine Variable?

    Gruß,
    Matthias
    https://maeffjus.de - Wetter-, Feinstaub- und Strahlungsdaten und ein Badezimmerradio!
    Homematic CCU2 / Buderus MC10 / Buderus KM200 / Buderus RC35 / Homeduino 2.0 / QNAP TS453Be mit 2x8tb & 2x4tb, / Back-UPS 800VA (Server) / Back-UPS 500CS (Wifi & Router) / Zyxel NAS540 zum Backup auf 2x4TB / Sophos-UTM 9 Firewall

  3. #13
    Registriert seit
    Jun 2012
    Ort
    House of Dragons @ Lübeck
    Beiträge
    10,553

    Irgendwie passt dein ganzen Script nicht so richtig.
    Wenn es über die RegVar getriggert wird, macht es keinen Sinn den Port im Script zu öffnen, Daten zu senden und dann den Port zu schließen.
    Da fehlt eine Abfrage des $_IPS['SENDER'] auf TimerEvent oder Execute.
    Dann würde ich den Port nicht öffnen schließen, sondern den in der Konsole einmalig öffnen und dann offen lassen.
    In deinem letzten Script fehlt dann die Abfrage der Daten komplett. $data wird ja nie befüllt.
    Die Daten liegen in $_IPS['VALUE'].
    Zusätzlich solltest du einen Cutter zwischen SerialPort und RegVar einbauen, mit rechtes Trennzeichen HEX 0D.
    Dann noch mal testen.
    Michael
    on Win10VM (ESXi): I7, 32GB RAM, HW-RAID5, 2xSat | HW: pivccu + ca.130 Geräte (ca.550ch), EM1000, CUL, 1Wire, FritzBox Cable, Android Phone + Tablet, Onkyo NR| SW: IPS, Apache2(mod_ssl/PHP), MySQL, hMailServer, PRTG, RoundCube, Win2016 Ess., MediaPortal, Kodi

  4. #14
    Registriert seit
    Jun 2005
    Beiträge
    3,746

    Hier meine Anleitung, wie ich es gemacht hätte, wie schon in meinem ersten Beitrag geschrieben:

    Comport erstellen und offen lassen

    Ein zyklisches Script zur Requestanforderung "Füllstand" und ein Script zur Variablen Zuweisung erstellen

    Cutter erstellen, rechtes und linkes Trennzeichen einstellen, übergeordnete Instanz Serial Port

    Registervariable erstellen, übergeordnete Instanz Cutter, Zielscript ist Script der Zuweisung

    Deine Cutter Begrenzung rechts Links kann andere Daten haben, mußt Du testen, und Dein Ergebnis ist im Beispiel ein String, ev mußt Du Das anpassen

    AufrufScript:
    PHP-Code:
     <? 
    $com 
    =14246
    $reg=13446
    $code "\x24\x52\x4C\x30\x31\x32\x33\x0D\x0A"// Aufruf Code, mit Füllstand antworten


    COMPort_SendText ($com$code); 

    // Dieses Script wird alle 10 Min aufgerufen, also Ereigniss erstellen

       // COMPort_SetOpen($com, true); // warum den Port nicht offen lassen, da kommen auch die Antworten rein
       // IPS_ApplyChanges($com);      // nur nicht wenn er zu ist.
    //RegVar_SetBuffer($reg, ""); 

    //COMPort_SendText ($com, $code.chr(13));  // warum nochmal chr(13) ?
      
       // COMPort_SetOpen($com, false); 
      // sleep (1); 
       // IPS_ApplyChanges($com);   

    //echo $data; 

    ?>
    Ergebnisscript:
    PHP-Code:
     <?

      $Fuellstand
    =  $_IPS['VALUE']

     
    SetValueString(1234$Fuellstand); // Wenn Deine Anzeige eine Stringvariable ist steht dort dann der Füllstand
                                         // wenn es eine andere Art Variable mußt Du den String wandeln

    ?>
    Teste mal ob es Dich weiter bringt
    Gruß Helmut
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken Klicken Sie auf die Grafik für eine größere Ansicht 

Name:	Baum.jpg 
Hits:	39 
Größe:	34.2 KB 
ID:	39253   Klicken Sie auf die Grafik für eine größere Ansicht 

Name:	Cutter.jpg 
Hits:	49 
Größe:	52.7 KB 
ID:	39254   Klicken Sie auf die Grafik für eine größere Ansicht 

Name:	Registervariable.jpg 
Hits:	45 
Größe:	20.5 KB 
ID:	39255  
    Geändert von Helmut (20.05.17 um 21:56 Uhr) Grund: Linksschreibung

  5. #15
    Registriert seit
    Dec 2014
    Ort
    Nürburgring
    Beiträge
    354

    So, ich hatte zwischezeitlich mit dem Cutter probiert - ging aber nicht.
    Die letzten beiden Stellen sind eine Prüfsumme die variiert, daher nun mit "Substr". Im Endeffekt war mir die Funktionsweise einer RegVar nicht klar, jetzt läufts ;-)

    Messung durchführen:
    PHP-Code:
    <?
    $com 
    =14246 /*[Serial Port_RS485]*/;
    $reg=13446 /*[Messsystem\Heizöl\REG_VAR RS485]*/;
    $code "\x24\x52\x4C\x30\x31\x32\x33\x0D\x0A";

        
    COMPort_SetOpen($comtrue);
        
    IPS_ApplyChanges($com);  

        
    COMPort_SendText ($com$code.chr(13)); 
     
         
    sleep (1);
        
    COMPort_SetOpen($comfalse);
        
    IPS_ApplyChanges($com);  

    ?>
    Daten auswerten:
    PHP-Code:
    <?
    if ($_IPS['SENDER'] == "RegisterVariable") {
        
    $data $_IPS['VALUE'];
        
        
    $data=substr($data74); //relevanten Teil aus String ausschneiden
        
        
    settype($data,"Integer"); 
        
    SetValueInteger(58140 /*[Messsystem\Heizöl\Ultraschall Tank rs485\Füllhöhe Heizöl Tank 1]*/$data);
        
    settype($data,"Float");
        
    $liter=(2000/1500)*$data;
        
    SetValueFloat(50304 /*[Messsystem\Heizöl\Ultraschall Tank rs485\Füllmenge Heizöl Tank 1]*/$liter);
            }
    ?>
    Dazu noch der Einbau (mit provisorischer Verkabelung und staubiger Wand...):
    Die Platine ist ein "USR-TCP232-T24V" Serial to Ethernet-Modul für ~22€.
    (Läuft mit virtuellem COM-Port auf dem Server)
    Klicken Sie auf die Grafik für eine größere Ansicht 

Name:	2017-05-21 12.46.25.jpg 
Hits:	68 
Größe:	192.8 KB 
ID:	39257Klicken Sie auf die Grafik für eine größere Ansicht 

Name:	2017-05-21 12.46.34.jpg 
Hits:	65 
Größe:	194.8 KB 
ID:	39258

    Jetzt fehlen noch zwei weitere Sensoren und eine saubere Verkabelung.
    Wenn jemand eine Idee hat, wie man elegant drei Sensoren an einem bus abrufen kann... (die Sensoren haben unterschiedliche ID's - diese sind innerhalb der ersten Zeichen der Antwort am Comport).
    Ich meine, drei Skripe gingen - sind aber uncool, ich glaube man müsste das erste Skript evtl. 3x hintereinander laufen lassen und den "code" jeweils anpassen. (das wäre für mich kein Problem, es ändert sich nur die Prüfsumme und ID)
    Code:
    $code = "\x24\x52\x4C\x30\x31\x32\x33\x0D\x0A";
    Wo es mir vor graust ist die Auswertung, hier kommen ja alle Signale an einem Punkt an und müssen dann zugeordnet werden - ggf. könnte man mit Substr alles bis auf die ID wegschneiden, diese auswerten und dann den String jeweils zuordnen.

    @Helmut: Ich schalte den Comport übrigens aus folgendem Grund ab: Es gibt keinen Grund ihn anzulassen, der Sensor sendet nur wenn er angesprochen wird und dazu rufe ich alle 10min ab - wieso 9:59 den Port offen lassen?
    So kann ich - jedenfalls im Moment beim einrichten - jederzeit mit dem Config-Tool drauf zugreifen.
    Übrigens: Wieso ist "chr(13)" doppelt?
    Letzter Punkt: Hat jemand eine Ahnung wie man kürzer als 1s das Skript anhält, Sleep sollte ja laut PHP Doku in ms angegeben werden, ist aber faktisch in Sekunden!
    Geändert von Maeffjus (21.05.17 um 13:24 Uhr)
    https://maeffjus.de - Wetter-, Feinstaub- und Strahlungsdaten und ein Badezimmerradio!
    Homematic CCU2 / Buderus MC10 / Buderus KM200 / Buderus RC35 / Homeduino 2.0 / QNAP TS453Be mit 2x8tb & 2x4tb, / Back-UPS 800VA (Server) / Back-UPS 500CS (Wifi & Router) / Zyxel NAS540 zum Backup auf 2x4TB / Sophos-UTM 9 Firewall

  6. #16
    Registriert seit
    Jun 2005
    Beiträge
    3,746

    warum chr(13) nochmal stellt sich, weil ich sah, dass im Absatz 4.3 der Befehl mit Hex 0D und 0A abgeschlossen wird.
    Und Du hast nochmal mit 13= Hex0D abgeschlossen.

    Und zur Verkabelung, hattest Du nicht RS485? Kannst doch alle an den RS485 Bus nehmen?
    Gruß Helmut

    Edit Du hast 3 Heizöltanks, gleichen Die sich nicht aus?

    Wenn es denn sein soll, 3 Sensoren, dann könntest Du die Auswertung so machen:
    PHP-Code:
    <?
    if (($_IPS['SENDER'] == "RegisterVariable") or ($_IPS['SENDER'] == "Execute"))
    {
      
    $dataorginal $_IPS['VALUE'];     // zum Probieren ev. remen
      //$dataorginal="*RL020012004C";      // zum Probieren ev. remen
           
    $WelcherTank=substr($dataorginal32); //Sensor ID aus String ausschneiden
        
    $dataTank=substr($dataorginal74); //Daten des Sensors aus String ausschneiden
        
        //echo $WelcherTank."    ".$dataTank;
     
    If ($WelcherTank=="01"
     {
         echo 
    "Tank 01 hat ".$dataTank;
        
    settype($data,"Integer"); 
        
    SetValueInteger(58140 /*[Messsystem\Heizöl\Ultraschall Tank rs485\Füllhöhe Heizöl Tank 1]*/$dataTank);
        
    settype($data,"Float");
        
    $liter=(2000/1500)*$data;
        
    SetValueFloat(50304 /*[Messsystem\Heizöl\Ultraschall Tank rs485\Füllmenge Heizöl Tank 1]*/$liter);
     }
     If (
    $WelcherTank=="02"
     {
        echo 
    "Tank 02 hat ".$dataTank;
        
    settype($data,"Integer"); 
        
    SetValueInteger(12345 /*[Messsystem\Heizöl\Ultraschall Tank rs485\Füllhöhe Heizöl Tank 2]*/$dataTank);
        
    settype($data,"Float");
        
    $liter=(2000/1500)*$data;
        
    SetValueFloat(12345 /*[Messsystem\Heizöl\Ultraschall Tank rs485\Füllmenge Heizöl Tank 2]*/$liter);    
     } 
     If (
    $WelcherTank=="03")   
     {
        echo 
    "Tank 03 hat ".$dataTank;
        
    settype($data,"Integer"); 
        
    SetValueInteger(12345 /*[Messsystem\Heizöl\Ultraschall Tank rs485\Füllhöhe Heizöl Tank 3]*/$dataTank);
        
    settype($data,"Float");
        
    $liter=(2000/1500)*$data;
        
    SetValueFloat(12345 /*[Messsystem\Heizöl\Ultraschall Tank rs485\Füllmenge Heizöl Tank 3]*/$liter);        
     }
    }
    ?>
    Geändert von Helmut (21.05.17 um 15:09 Uhr) Grund: Ausgleich

  7. #17
    Registriert seit
    Dec 2014
    Ort
    Nürburgring
    Beiträge
    354

    Hey Folks...

    I'm done:

    1. Sensoren Triggern (ID 01-03):
    PHP-Code:
    <?
    $com 
    =14246 /*[Serial Port_RS485]*/;
    $reg=13446 /*[Messsystem\Heizöl\Ultraschall Tank rs485\REG_VAR RS485]*/;
    //$code = "\x24\x52\x4C\x30\x31\x32\x33\x0D\x0A";
    //Tank02 //24 52 4C 30 32 32 34 0D 0A
    //Tank03 //24 52 4C 30 33 32 35 0D 0A

    for ($i 1$i <= 3$i++) {
        If (
    $i ==1) {
        
    $code "\x24\x52\x4C\x30\x31\x32\x33\x0D\x0A";
        
    COMPort_SetOpen($comtrue);
        
    IPS_ApplyChanges($com);  

        
    COMPort_SendText ($com$code.chr(13)); 
     
         
    IPS_Sleep(1500);
        
    COMPort_SetOpen($comfalse);
        
    IPS_ApplyChanges($com);
        
    IPS_Sleep(1500);}  
        
        If (
    $i ==2) {
        
    $code "\x24\x52\x4C\x30\x32\x32\x34\x0D\x0A";
        
    COMPort_SetOpen($comtrue);
        
    IPS_ApplyChanges($com);  

        
    COMPort_SendText ($com$code.chr(13)); 
     
         
    IPS_Sleep(1500);
        
    COMPort_SetOpen($comfalse);
        
    IPS_ApplyChanges($com);
        
    IPS_Sleep(1500);}  
        
        If (
    $i ==3) {
        
    $code "\x24\x52\x4C\x30\x33\x32\x35\x0D\x0A";
        
    COMPort_SetOpen($comtrue);
        
    IPS_ApplyChanges($com);  

        
    COMPort_SendText ($com$code.chr(13)); 
     
         
    IPS_Sleep(1500);;
        
    COMPort_SetOpen($comfalse);
        
    IPS_ApplyChanges($com);
        
    IPS_Sleep(1500);}  
        }

    ?>
    2. Daten Empfangen und zuordnen. (Übrigens steht leider keine "richtige" ID in der Sensorantwort, bzw. IPS dekodiert das zu ziemlichem Murks, daher rechne ich die Antwort in Hex um und weiß, dass bei den Sensoren c, 6, 9 an einer Stelle steht.
    PHP-Code:
    <?
    if ($_IPS['SENDER'] == "RegisterVariable") {
        
    $data $_IPS['VALUE'];
        
         
        
    $hex bin2hex($data);
        
    $tanknr=substr($hex91); //Sensor ID aus String ausschneiden (Tank 1 in hex = "C", Tank 2 in hex 0 = "9", Tank 3 in hex = "6")
        
    settype($tanknr,"String"); 
        
        
        If (
    $tanknr=="c"){             //TANK 1
        
    $data=substr($data74); //relevanten Teil aus String ausschneiden
        
        
    settype($data,"Integer"); 
        
    SetValueInteger(58140 /*[Messsystem\Heizöl\Ultraschall Tank rs485\Füllhöhe Heizöl Tank 1]*/$data);
        
    settype($data,"Float");
        
    $liter=(2000/1500)*$data;
        
    SetValueFloat(50304 /*[Messsystem\Heizöl\Ultraschall Tank rs485\Füllmenge Heizöl Tank 1]*/$liter);
        
    $tank_inv_1=100-(($data/1500)*100);
        
    round($tank_inv_1,0);
        
    settype($tank_inv_1,"Integer");     
        
    SetValueInteger(37583 /*[Messsystem\Heizöl\Heizölfüllstand Shutter-Display\Füllmenge Heizöl inv Tank 1]*/$tank_inv_1);}
        
        
        If (
    $tanknr=="9"){             //TANK 2
        
    $data=substr($data74); //relevanten Teil aus String ausschneiden
        
        
    settype($data,"Integer"); 
        
    SetValueInteger(27591 /*[Messsystem\Heizöl\Ultraschall Tank rs485\Füllhöhe Heizöl Tank 2]*/$data);
        
    settype($data,"Float");
        
    $liter2=(2000/1500)*$data;
        
    SetValueFloat(10374 /*[Messsystem\Heizöl\Ultraschall Tank rs485\Füllmenge Heizöl Tank 2]*/$liter2);
        
    $tank_inv_1=100-(($data/1500)*100);
        
    round($tank_inv_1,0);
        
    settype($tank_inv_1,"Integer");     
        
    SetValueInteger(41889 /*[Messsystem\Heizöl\Heizölfüllstand Shutter-Display\Füllmenge Heizöl inv Tank 2]*/
    $tank_inv_1);}
        
        
        If (
    $tanknr=="6"){             //TANK 3
        
    $data=substr($data74); //relevanten Teil aus String ausschneiden
        
        
    settype($data,"Integer"); 
        
    SetValueInteger(47622 /*[Messsystem\Heizöl\Ultraschall Tank rs485\Füllhöhe Heizöl Tank 3]*/$data);
        
    settype($data,"Float");
        
    $liter3=(2000/1500)*$data;
        
    SetValueFloat(38232 /*[Messsystem\Heizöl\Ultraschall Tank rs485\Füllmenge Heizöl Tank 3]*/$liter3);
        
    $tank_inv_1=100-(($data/1500)*100);
        
    round($tank_inv_1,0);
        
    settype($tank_inv_1,"Integer");     
        
    SetValueInteger(52415 /*[Messsystem\Heizöl\Heizölfüllstand Shutter-Display\Füllmenge Heizöl inv Tank 3]*/
    $tank_inv_1);}
        }
    ?>
    Dazu wird noch eine Variable geschrieben, welche den Tankwert invertiert in Prozent angibt: (100%-Füllstand in %)
    Damit steuere ich ein Skript, das den Tank visualisiert.
    Allerdings bekomme ich es nur hin, dass das "falschherum" anzeigt - also anstatt einen Kasten zu vergrößern mit dem Füllstand vergrößere ich den Teil der das Leere zeigt.

    Danke für Eure Hilfe!

    Noch kurz was: Kann ich aus der RegVar in eine Variable auch direkt HEX übergeben? Habe ich nirgends gefunden!
    Gruß,
    Matthias

    Hier auch noch was zum "Gucken"...:
    Klicken Sie auf die Grafik für eine größere Ansicht 

Name:	2017-05-25 01.01.00.jpg 
Hits:	53 
Größe:	193.0 KB 
ID:	39321Klicken Sie auf die Grafik für eine größere Ansicht 

Name:	2017-05-25 13.15.06.jpg 
Hits:	48 
Größe:	192.4 KB 
ID:	39322Klicken Sie auf die Grafik für eine größere Ansicht 

Name:	2017-05-25 13.44.39.jpg 
Hits:	68 
Größe:	214.4 KB 
ID:	39323
    Geändert von Maeffjus (28.05.17 um 13:04 Uhr)
    https://maeffjus.de - Wetter-, Feinstaub- und Strahlungsdaten und ein Badezimmerradio!
    Homematic CCU2 / Buderus MC10 / Buderus KM200 / Buderus RC35 / Homeduino 2.0 / QNAP TS453Be mit 2x8tb & 2x4tb, / Back-UPS 800VA (Server) / Back-UPS 500CS (Wifi & Router) / Zyxel NAS540 zum Backup auf 2x4TB / Sophos-UTM 9 Firewall

Ähnliche Themen

  1. Stromzähler (MT-681) mit Optokopf (Infrarot) auslesen und an EKM868 senden?
    Von TimB83 im Forum IPS-868 / ProJET, XBee, ZigBee, XPort
    Antworten: 8
    Letzter Beitrag: 23.05.14, 12:02
  2. Zufälliger Ordner auslesen und an Squeezebox senden
    Von Darklord im Forum Skripte, PHP, SQL
    Antworten: 8
    Letzter Beitrag: 18.04.14, 09:08
  3. telnet Befehl senden/abschließen
    Von calexico84 im Forum Audio & Video, TK-Anlagen, ISDN
    Antworten: 2
    Letzter Beitrag: 08.09.13, 22:43
  4. Antworten: 5
    Letzter Beitrag: 20.08.13, 18:40
  5. Befehl direkt als cmd senden
    Von josp666 im Forum Skripte, PHP, SQL
    Antworten: 15
    Letzter Beitrag: 31.12.10, 14:47

Stichworte