Hallo Zusammen,
ich betreibe 3 APC-USVen, welche ich über 3 Stück Wiznet110SR per Ethernet seriell auslesen und im HS darstellen möchte. (Wie Moxa, bloss preiswerter und für mich einfacher zu handhaben)
Dank der unendlich vielen Informationen in diesem Form, insbesondere Makki´s 4 Jahre alter hslib, den Threads dazu und zum Thema "parallele bidirektionale TCP-Kommunikation des HS" war mir schnell klar, dass es so nicht gehen wird (der HS braucht dann zum darstellen der je 6 Werte der 3 USVen ca. 2h)
Ich habe vegeblich versucht, Nils LogikGenerator zu verstehen um mir einen Logikbaustein mit Python zu bauen.
Dennoch habe ich es irgendwie geschafft, nicht schön, aber m.E. dem Thema und meinem Können angemessen, da die USVen mit 2400Bd kommunizieren und die Abfrage der ganzen Betriebsparameter eben 1sek braucht, in der der Homeserver halt warten muss.
Besser er 1s als ich 2h
Alle Fliesskommawerte bekomme ich mittels Send-by-change geliefert und dargestellt - schön! Die 3 Abfragen laufen parallel, also nur 1s HS-Stop für alle 3 - sehr schön!
Mein Problem:
Die Strings für
- Grund der letzen Umschaltung (transfer)
- Status
sehe ich in Nils Debugger wunderbar als 'S' und '08' (APC-üblich für OK), bekomme sie aber ebenso wie die Fertigmeldung des Bausteins (Done!), der immer am Ende ein 1-Telegramm schicken soll, nicht im HS zu sehen.
Dazu habe ich den iKOs Gruppenadressen verpasst und im EIB Monitor beguckt.
Hier mein Python-Versuch:
Ich hoffe, mir kann jemand weiterhelfen, denn nur darauf zu vertrauen, die "Input-Line-Voltage" auszuwerten, ist mir etwas wenig.
In den vergangenen Jahren waren bei mir die Stromausfälle verursacht durch EVU und USVen nahezu gleich häufig.
Abschließend meinen Dank an alle. die diese unendliche Menge an Informationen zusammen getragen haben.
Viele Grüße
Nick
ich betreibe 3 APC-USVen, welche ich über 3 Stück Wiznet110SR per Ethernet seriell auslesen und im HS darstellen möchte. (Wie Moxa, bloss preiswerter und für mich einfacher zu handhaben)
Dank der unendlich vielen Informationen in diesem Form, insbesondere Makki´s 4 Jahre alter hslib, den Threads dazu und zum Thema "parallele bidirektionale TCP-Kommunikation des HS" war mir schnell klar, dass es so nicht gehen wird (der HS braucht dann zum darstellen der je 6 Werte der 3 USVen ca. 2h)
Ich habe vegeblich versucht, Nils LogikGenerator zu verstehen um mir einen Logikbaustein mit Python zu bauen.
Dennoch habe ich es irgendwie geschafft, nicht schön, aber m.E. dem Thema und meinem Können angemessen, da die USVen mit 2400Bd kommunizieren und die Abfrage der ganzen Betriebsparameter eben 1sek braucht, in der der Homeserver halt warten muss.
Besser er 1s als ich 2h
Alle Fliesskommawerte bekomme ich mittels Send-by-change geliefert und dargestellt - schön! Die 3 Abfragen laufen parallel, also nur 1s HS-Stop für alle 3 - sehr schön!
Mein Problem:
Die Strings für
- Grund der letzen Umschaltung (transfer)
- Status
sehe ich in Nils Debugger wunderbar als 'S' und '08' (APC-üblich für OK), bekomme sie aber ebenso wie die Fertigmeldung des Bausteins (Done!), der immer am Ende ein 1-Telegramm schicken soll, nicht im HS zu sehen.
Dazu habe ich den iKOs Gruppenadressen verpasst und im EIB Monitor beguckt.
Hier mein Python-Versuch:
Code:
import sys import os import base64 import marshal import re import md5 import inspect import time import socket import tempfile import popen2 import zlib import zipfile ############## ### Config ### ############## ## Name der Logik LOGIKNAME="USV-APC-Abfrage" ## Logik ID LOGIKID="16408" ## Ordner im GLE LOGIKCAT="www.knx-user-forum.de" ## Beschreibung LOGIKDESC=""" Fragt unter der angegeben IP im SmartMode die 10 wichtigsten Werte ab """ VERSION="V0.1" ## Bedingung wann die kompilierte Zeile ausgeführt werden soll BEDINGUNG="EN[1] or EN[2] or EN[3] or EI" ## Formel die in den Zeitspeicher geschrieben werden soll ZEITFORMEL="" ## Nummer des zu verwenden Zeitspeichers ZEITSPEICHER="0" ## AUF True setzen um Binären Code zu erstellen doByteCode=False #doByteCode=True ## Base64Code über SN[x] cachen doCache=False ## Doku erstellen Ja/Nein doDoku=True debug=False livedebug=False showList=False ############################# ########## Logik ############ ############################# LOGIK = '''# -*- coding: iso8859-1 -*- 5000|"'''+LOGIKCAT+'''\\'''+LOGIKNAME+'''_'''+VERSION+'''"|0|2|"IP-Addr."|"Trigger"|12|"Bat-Volt"|"Temperatur"|"Transfer"|"In Volt"|"max Volt"|"min Volt"|"Out Volt"|"Load %"|"Bat %"|"Runtime"|"Status"|"Done!" # 5001|Anzahl Eingänge|Ausgänge|Zeitspeicher|Speicher|Berechnung bei Init 5001|2|12|0|0|0 # 2 Eingänge, 12 Ausgänge, 0 Timer, 0 Speicher, keine Berechnung bei Initialisierung ################################################# ### 5002 Definition der Eingänge EN[x] ################################################# # 5002|Index Eingang|Default Wert|Datenformat 0=numerisch 1=alphanummerisch 5002|1|""|1 # IP-Adresse 5002|2|0|0 # Trigger # IP Adresse des Serial-TCP Wandlers und Trigger-Eingang ################################################# ### 5004 Definition der Ausgänge AN[x] ################################################# # 5004|Index Ausgang|Initwert|Runden binär|Typ (1-send/2-sbc)|Datenformat 0=numerisch 1=alphanummerisch 5004|1|0|0|2|0 # Battery Voltage 5004|2|0|0|2|0 # Internal Temperature 5004|3|""|0|1|1 # Reason for last Transfer 5004|4|0|0|2|0 # Input Line Voltage 5004|5|0|0|2|0 # maximum input Line Voltage 5004|6|0|0|2|0 # minimum Input Line Voltage 5004|7|0|0|2|0 # Output Voltage 5004|8|0|0|2|0 # Power Load % 5004|9|0|0|2|0 # Battery Level % 5004|10|0|0|2|0 # estimated runtime 5004|11|""|0|1|1 # Status Byte 5004|12|0|0|1|0 # Abfrage beendet ################################################# ## Inkompatible Version 5012|1|"(__import__('sys').version[:3]!='2.2') and (__import__('sys').version[:3]!='2.4')"|"'Firmware inkompatibel'"|""|1|0|0|0 ''' ##################### #### Python Code #### ##################### code=[] code.append([3,"",""" if not EI and EN[1] != '' and EN[2] == 1: # nur wenn Trigger und IP-Adresse vorhanden. s = __import__('socket').socket(__import__('socket').AF_INET,__import__('socket').SOCK_STREAM) s.settimeout(2.0) s.connect((EN[1], 5000)) # IP und Port try: # force USV to SmartMode s.send("Y") ret = '' while True: c = s.recv(1) if c == '\\n' or c == '': break else: ret += c # Battery Voltage s.send("B") ret = '' while True: c = s.recv(1) if c == '\\n' or c == '\\r' or c == '': c = s.recv(1) break else: ret += c AN[1] = float(ret) # internal Temperature s.send("C") ret = '' while True: c = s.recv(1) if c == '\\n' or c == '\\r' or c == '': c = s.recv(1) break else: ret += c AN[2] = float(ret) # reason for last switch s.send("G") ret = '' reason = '' while True: c = s.recv(1) if c == '\\n' or c == '\\r' or c == '': c = s.recv(1) break else: ret += c AN[3] = ret # Line Voltage s.send("L") ret = '' while True: c = s.recv(1) if c == '\\n' or c == '\\r' or c == '': c = s.recv(1) break else: ret += c AN[4] = float(ret) # maximum Line Voltage s.send("M") ret = '' while True: c = s.recv(1) if c == '\\n' or c == '\\r' or c == '': c = s.recv(1) break else: ret += c AN[5] = float(ret) # minimum Line Voltage s.send("N") ret = '' while True: c = s.recv(1) if c == '\\n' or c == '\\r' or c == '': c = s.recv(1) break else: ret += c AN[6] = float(ret) # Output Voltage s.send("O") ret = '' while True: c = s.recv(1) if c == '\\n' or c == '\\r' or c == '': c = s.recv(1) break else: ret += c AN[7] = float(ret) # Power Load s.send("P") ret = '' while True: c = s.recv(1) if c == '\\n' or c == '\\r' or c == '': c = s.recv(1) break else: ret += c AN[8] = float(ret) # Battery capacity s.send("f") ret = '' while True: c = s.recv(1) if c == '\\n' or c == '\\r' or c == '': c = s.recv(1) break else: ret += c AN[9] = float(ret) # Status-Byte s.send("Q") ret = '' status = '' while True: c = s.recv(1) if c == '\\n' or c == '\\r' or c == '': break else: ret += c AN[11] = ret # estimated runtime s.send("j") ret = '' while True: c = s.recv(1) if c == ':': break else: ret += c AN[10] = float(ret) finally: s.close() AN[12] = 1 try: for i in rage(1,len(AA)+1): if AN[i]!=AA[i]: AC[i]=1 except: pass """]) postlogik=[0,"",""" ## in der Init-Phase einfach erbrechen, da nix zu tun... 5012|1|"EI"|""|""|0|0|0|0 """]
In den vergangenen Jahren waren bei mir die Stromausfälle verursacht durch EVU und USVen nahezu gleich häufig.
Abschließend meinen Dank an alle. die diese unendliche Menge an Informationen zusammen getragen haben.
Viele Grüße
Nick