Oui au bout d’un moment ou d’un événement, le service accepte la connexion, puis ne répond plus, socket toujours ouvert.
Côté plugin c’est le premier truc que j’ai vérifié, si je laissait pas trainer un socket quelque part ouvert.
Oui au bout d’un moment ou d’un événement, le service accepte la connexion, puis ne répond plus, socket toujours ouvert.
Côté plugin c’est le premier truc que j’ai vérifié, si je laissait pas trainer un socket quelque part ouvert.
Merdoom …donc c’est bien a l’initiative de l’ECU-R que le cocker reste ouvert
Une sécurité de APSYSTEM ?
Si je peux aider
c’est ce qu’on s’est dit aussi et du coup il a réduit les appels je crois et fait différemment dans la dernière beta. Mais ça plante encore, à suivre … mais on va trouver
Bonjour,
Comment voir si c’est un problème de socket? et surtout que faire, l’ouvrir, le fermer? Merci pour ton aide
Je pense pas que ce soit un soucis de socket.
Au bout d’un certain temps, sur la requête pour récupérer l’état des onduleurs, l’ECU renvoie une réponse correcte indiquant une erreur sans les données et à partir de ce moment c’est fini.
La connexion se fait bien quand on essaie de se connecter. J’envoie la requête et pas de réponse quand j’attends les données. Du coup timeout et je ferme le socket de mon côté.
Ça sent le plantage d’un thread de leur côté. Du coup on cherche plutôt un contournement.
Peut être une sécurité en effet, mais vu le niveau de l’API (comme l’absence de chiffrement) j’en doute.
J’avais un script python avec lECU-B qui ne plantait pas, est-ce ca t’intéresse @nch ?
Je lui avait envoyé le mien issue de ce qui s’était fait sur HA retravaillé sur le forum par (de mémoire) Banderos , il était pour l’ecu-R. Mais on avait sans doute le même ?
Mesures.PY
APSystemsECUR.py
J’avais ça comme code pour mon ECU-B avant d’acquérir mon ECU-R
J’avais modifié pour envoyé vers mon serveur MQTT pour des raisons pratico pratique.
#!/usr/bin/env python3
import socket
import struct
import binascii
import json
import datetime
import paho.mqtt.client as mqtt
from struct import unpack
# Define Variables
MQTT_HOST = "mqtt.toto.com"
MQTT_PORT = 8899
MQTT_KEEPALIVE_INTERVAL = 45
MQTT_TOPIC = "APStoMQTT"
myIPadress = "192.168.44.19"
myMACadress = "" #May be search for this if ipadres doesn't react, later
jsonfile = "./APStoMQTT.json"
output = {}
def APSint(codec,start):
return int(binascii.b2a_hex(codec[(start):(start+2)]),16)
def APSbool(codec,start):
return bool(binascii.b2a_hex(codec[(start):(start+2)]))
def APSuid(codec,start):
return str(binascii.b2a_hex(codec[(start):(start+12)]))[2:14]
def APSstr(codec,start,amount):
return str(codec[start:(start+amount)])[2:(amount+2)]
def APStimestamp(codec,start,amount):
timestr=str(binascii.b2a_hex(codec[start:(start+amount)]))[2:(amount+2)]
return timestr[0:4]+"-"+timestr[4:6]+"-"+timestr[6:8]+" "+timestr[8:10]+":"+timestr[10:12]+":"+timestr[12:14]
def APSdouble(codec, start):
return int (binascii.b2a_hex(codec[(start):(start+4)]), 16)
#initialize socket
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
soc.connect((myIPadress,8899))
#get ECUID
ECU_R = 'APS1100160001END'
ECU_Rsend = ECU_R.encode('utf-8')
soc.send(ECU_Rsend)
ECU_Rreceive = soc.recv(4096)
print ("\nAsking for ECUID number: ")
print(ECU_Rreceive)
# Decoded explanation
# APS 1100940001 = Open sentence and answer notation
# 216000026497 = ECU_R nummer
# 01 =text unkown
# 00 00 (a7 90)=42896[167,144] 00 00 00 00 00 00 00
# 8x status of UID ca=202 d0=208 d0 d0 d0 d0 d0 d0
# 0008=(aantal UID) maximaal (16)
# 0000=integer unkown
# 10012 = text unkown
# ECU_R_1.2.13009 = Version
# Etc/GMT-8 = ETC ipv UTC Timezone server op lokatie met -8 uur?
# 80 97 1b 01 5d 1e 00 00 00 00 00 00
# END\n
myECUID = APSstr(ECU_Rreceive,13,12) #216000026497
output["ECU_R_ID"] = myECUID
output["maxUID"] = APSint(ECU_Rreceive,46)
output["Version"] = APSstr(ECU_Rreceive,55,15)
output["TimeZone"] = APSstr(ECU_Rreceive,70,9)
output["Today_Energy"] = APSdouble(ECU_Rreceive, 35) / 100
output["Lifetime_Energy"] = APSdouble(ECU_Rreceive, 27) / 10
output["Current_Power"] = APSdouble(ECU_Rreceive, 31)
#print(output)
#get data from UID
ECU_R = 'APS1100280002'+myECUID+"END" # 2 extra?
ECU_Rsend = ECU_R.encode('utf-8')
soc.send(ECU_Rsend)
ECU_Rreceive = soc.recv(4096)
#print("\nAsking for UID numbers and data: "+str(len(ECU_Rreceive)))
#print(ECU_Rreceive)
#print("\n")
#print(len(ECU_Rreceive))
if (len(ECU_Rreceive)>16) :
#base data valid for all UID
output["timestamp"] = APStimestamp(ECU_Rreceive,19,14)
counter = 1
maxcounter = APSint(ECU_Rreceive,17) #number of inverters
offset=26
while counter <= maxcounter:
# Records will pass for each inverter on this ECU_R (UID)
# 1-3 APS
# 4-18 UID
# 19 number of inverters?
#------------------------
# 20-32 Inverter ID (UID)
# 33 0 or 1 Marks online status of inverter instance
# 34 unkown "0"
# 35 unkown "1" Could be country because of 31 (Netherlands)
# 36-37 Frequency multiplied by 10
# 38-39 Temperature Celsius Bit 7 of second byte is signbit (1=+, 0=-)?
# 40-41 Power A Channel A on Inverter
# 42-43 Voltage A Chanel A on Inverter
# 44-45 Power B Channel B on Inverter
# 46-47 Voltage B Chanel B on Inverter
# 48-51 END or channel C and D till END
#pick up data for this inverter
# output={}
output["UID"+str(counter)] = APSuid(ECU_Rreceive,offset)
#you can also use UID as index in dictonary
uid=output["UID"+str(counter)][7:12]
output["Online"+uid] = APSbool(ECU_Rreceive,offset+6)
output["Something"+uid] = APSstr(ECU_Rreceive,offset+7,2)
output["Frequentie"+uid] = APSint(ECU_Rreceive,offset+9)/10.0
output["Temperature"+uid] = APSint(ECU_Rreceive,offset+11)-100 # check later if sign is bit 7 64 and fahrenheit
step = 13
channel = 1
while (channel <= 2): #QS1 must have 4 times, so C and D but how to see the difference
output["Power"+uid+"-"+str(channel)] = APSint(ECU_Rreceive,offset+step)
output["Volt"+uid+"-"+str(channel)] = APSint(ECU_Rreceive,offset+step+2)
step += 4
channel += 1
# print(output)
#end while channel
offset += step #how big is UID block
counter += 1
#print(output)
#end while UID
#print(output)
else:
output["Error"] = "No inverters active"
#print(json.dumps(output))
with open(jsonfile, 'w') as f:
f.write(json.dumps(output, indent=2))
MQTT_MSG=json.dumps(output);
# Define on_publish event function
def on_publish(client, userdata, mid):
print ("Message Published...")
# Initiate MQTT Client
mqttc = mqtt.Client()
# Register publish callback function
mqttc.on_publish = on_publish
# Connect with MQTT Broker
mqttc.connect(MQTT_HOST, MQTT_PORT, MQTT_KEEPALIVE_INTERVAL)
# Publish message to MQTT Broker
mqttc.publish(MQTT_TOPIC,MQTT_MSG)
# Disconnect from MQTT_Broker
mqttc.disconnect()
Cool ça va l’aider. Il regarde tout ça ce week-end, pour le moment il est en déplacement boulot.
OK, merci pour l’info. Le soucis, c’est que je ne peux même pas me connecté à l’ECU, quand je rentre la config lors de la création de l’équipement et que je sauvegarde, j’ai le message « Impossible de se connecter à l’ECU. Vérifiez l’IP et le port. ». Je vais attendre de voir si des mise à jour corrige le problème…
Débranche ton ECU et rebranche le après quelques secondes et ça redémarrera tu n’auras plus ce message jusqu’au prochain plantage et je ne peux pas te donner de fréquence cela semble aléatoire.
J’ai 3 jeedom, quasi identique, ma fille, mon fils et moi.
Chez ma fille il n’y a jamais eu aucun plantage.
Chez mon fils cela à planté 2 fois
et chez moi 2 fois également
sur une dizaine de jours de fonctionnement
Désolé, mais chez moi ça ne marche pas du tout. Je l’ai laissé débranché toute la nuit et après l’avoir remis sous tension, toujours le même message. Impossible de connecté Jeedom à l’ECU
Tu es sûr de l’IP que tu rentres ? Tu es sûr sur de la connexion entre ton Jeedom et l’ECU ? Ca ressemble plus à un soucis de réseau ton problème.
Oui, l’IP est la bonne (vérifié sur mon routeur grâce à l’adresse MAC de l’ECU). L’ECU est sur le même réseau que mon Jeedom (192.168.2.XXX). J’ai même essayé de l’installé sur un second Jeedom mais même problème de connexion. Je ne sais plus trop ou chercher. Je suis derrière un routeur Xiaomi AX3000, j’ai essayé de trouvé comment débloquer le port 8899 mais je n’ai rien trouvé.
Est-ce que tu arrives à ping ton ECU depuis ton Jeedom ?
Oui, aucun soucis de ping sur mes 2 Jeddom.
Est-ce que tu as bien le module socket PHP d’installé et d’activé ? Après j’ai lu sur certains forum que sur certains ECU (ou version de firmware), le port pouvait être différent.
Ce module ne me parle pas, comment vérifier ou installer ce module, s’il te plait?
Salut
Des news @nch sur tes investigations, un espoir, une lumière au bout du tunnel ?
Hello,
J’avais trouvé quelque chose dans la communication avec l’ECU. Mais malheureusement au bout de 2j, l’ECU est encore coincé.