ChrisChip Die vorletzte Zeile ist falsch. Oder Du benutzt tatsächlich Python 2. Dann ist *das* falsch. 🙂
Benutze tatsächlich noch Python 2... Never change a running system
ChrisChip Die vorletzte Zeile ist falsch. Oder Du benutzt tatsächlich Python 2. Dann ist *das* falsch. 🙂
Benutze tatsächlich noch Python 2... Never change a running system
Habs hinbekommen!
Tell : Vielen Dank für die Hilfe
from pymodbus.client.sync import ModbusTcpClient
SERVER_IP = '192.168.178.61'
SERVER_PORT = 502
ADDRESS_START = 37
#ADDRESS_LENGTH = 10
DEVICE_ID = 228
var_Power = 5000
client = ModbusTcpClient(host=SERVER_IP, port=SERVER_PORT)
rq = client.write_register(address=ADDRESS_START, value=var_Power, unit=DEVICE_ID)
print rq
client.close()
Display More
Printe mal rq. Da ist hoffentlich ein aussagekraeftiger Fehlertext drin.
Der Fehlertext:
Port 502 ist per default eingestellt oder muss der noch angegeben werden?
So wie im Anhang klappts mit Modbus Poll, Slave und Register sollte daher stimmen:
Hallo zusammen,
bin leicht am verzweifeln. Bekomme es nicht gebacken, einen Wert auf ein Modbus Register zu schreiben (Modbus TCP).
Die Daten die ich senden möchte:
IP: 192.168.178.61
Slave ID: 228
Adresse: 37
Value: 500
Habe etwas rumgespielt mit pymodbus, komme aber leider zu keinem Ergebnis. Die Dokumentation von pymodbus ist sehr umfangreich, hat mir da auch nicht weitergeholfen.
Hätte bitte jemand ein einfaches Beispiel, wie ich die Daten mit python senden kann?
Besten Dank für die Hilfe. Funktioniert 1 zu 1 wie gewünscht.
Danke für die Rückmeldungen. Mein Hauptproblem ist, dass ich nicht weiß wie ich die zusätzlichen Argumente (z.B. "RemoteCurr": 6) mitschicken kann
Ja, läuft
Hat mich ganz schön Nerven gekostet das AVM- Update 😉
Jetzt klappts. Hab den Raspi noch upgedatet, schon klappts
Besten Dank!!!
QuoteDas m.M.n. viel zu oft , denn die 301er verbrauchen ja Strom zum Auslesen und Senden der Daten und damit die Batterien. Davon abgesehen ändern sich so schnell keine Temperaturen im Normalbetrieb. Wenn Du Lüften erkennen willst, dann würde imho auch locker alle 15 Minuten ausreichen
Muss mich hier korrigieren. Alle 15 Minuten wird ausgelesen. Die FB frägt nur alle 15 Minuten den Status der mit DECT verbunden Geräte ab. Es wird auch immer nur der letzte Status abgefragt. "Live" abfragen kann man die HKR leider nicht. Auch ein umstellen der Temperatur kann unter Umständen bis zu 15 Minuten dauern.
Die Zeile 11 im Skript habe ich jetzt überwunden Leider komm ich immer noch nicht zu einer SessionID.
Läuft das Skript bei dir?
Vielen Dank, war wirklich die Einstellung im Notepad++
Darauf wär ich nie gekommen
QuoteMit welchen Editor hast Du das Script erstellt? Versuch mal mit nano?
Mit Notepad++ über FTP.
Habs grad über die Console mit Nano geöffnet- keine Auffälligkeiten
GNU bash, Version 4.4.12(1)-release (arm-unknown-linux-gnueabihf)
Copyright (C) 2016 Free Software Foundation, Inc.
Lizenz GPLv3+: GNU GPL Version 3 oder jünger <http://gnu.org/licenses/gpl.html>
Dies ist freie Software. Sie darf verändert und verteilt werden.
Es wird keine Garantie gewährt, soweit das Gesetz es zulässt.
Danke für die schnelle Rückmeldung!
Quoteecho $SHELL
bash -x <Script>
1
/bin/bash
2
+ STRING1=$'test\r'
+ STRING2=$'wort\r'
+ echo $'test\r\r'
test
+ echo $'wort\r\r'
wort
+ KETTE=$'test\r-wort\r\r'
+ echo $'test\r-wort\r\r'
-wort
Hallo zusammen,
verzweifle an einem vermeintlich einfachem Problem, hab schon alles versucht aber bekomm es nicht hin
#!/bin/bash
STRING1="test"
STRING2="wort"
echo ${STRING1}
echo ${STRING2}
#Verbinden mit Bindestrich
KETTE="${STRING1}-${STRING2}"
echo ${KETTE}
Normal sollt hier nach meinem Verständnis die Ausgabe folgendermaßen ausschauen:
test
wort
test-wort
Über die Console ausgeführt wir jeweils immer der erste String ignoriert und folgendes wird ausgegeben:
test
wort
-wort
Das Skript wird über Putty in der Console ausgeführt...
Sorry, hab ich gestern überlesen.
Ist zum steuern und vor allem auslesen von Smarthome Daten aus der FB. Hab da z.B. ein paar Heizkörpertermostate über DECT dran.
Lese alle Daten 1x pro Minute über einen Crontab aus. Hierfür wird immer die Session-ID benötigt. Hat auch die letzten Jahre super funktioniert bis zum Update der FB.
Habs zuvor über PHP ausgelesen:
function fb_get_sid()
{
//Daten und Parameter
$pw = 'passwort';
// Challenge bei der Fritz.box holen
$ch = curl_init('http://fritz.box/login_sid.lua');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$login = curl_exec($ch);
$session_status_simplexml = simplexml_load_string($login);
if ($session_status_simplexml->SID != '0000000000000000')
{
$SID = $session_status_simplexml->SID;
}
else
// Session ID errechnen aus Challenge, Passwort und MD5-Verschl?sselung
{
$challenge = $session_status_simplexml->Challenge;
$response = $challenge . '-' . md5(mb_convert_encoding($challenge . '-' . $pw, "UCS-2LE", "UTF-8"));
curl_setopt($ch, CURLOPT_POSTFIELDS, "response={$response}&page=/login_sid.lua");
$sendlogin = curl_exec($ch);
$session_status_simplexml = simplexml_load_string($sendlogin);
if ($session_status_simplexml->SID != '0000000000000000')
{
$SID = $session_status_simplexml->SID;
}
else
{
return 0;
}
}
curl_close($ch);
return $SID;
}
Display More
Bekomm es leider nicht hin, den Code für die neue Anmeldung umzuschreiben. War schon ein paar Stunden dran...
Das vielversprechendste ist momentan dein Skript. Hier häng ich nur noch an der Kleinigkeit, dass die 2 Strings sich nicht verbinden lassen. Hab hier schon alles mögliche ausprobiert aber in Bash hab ich kaum was gemacht bis jetzt...
Bin mitlerweile schon etwas weiter.
#!/bin/bash
FBF="192.168.178.1"
USER="fritz1682" # oder falls nicht vorhanden, dann leer lassen
PASS="passwort"
CHALLENGE=$(curl -s -k "192.168.178.1/login_sid.lua" | grep -Po '(?<=<Challenge>).*(?=</Challenge>)')
echo Challenge:
echo ${CHALLENGE}
MD5=$(echo -n ${CHALLENGE}"-"${PASS} | iconv -f ISO8859-1 -t UTF-16LE | md5sum -b | awk '{print substr($0,1,32)}')
echo MD5:
echo ${MD5}
RESPONSE="${CHALLENGE}-${MD5}"
echo Komplett
echo ${RESPONSE}
SID=$(curl -i -s -k -d "response=${RESPONSE}&username=${USER}" "192.168.178.1" | grep -Po -m 1 '(?<=sid=)[a-f\d]+')
echo ${SID} | cut -d" " -f1
Display More
Challenge:
ea36ac1b
MD5:
d5ecabfa334534a6be8a5b1d3f4499d3
Komplett
-d5ecabfa334534a6be8a5b1d3f4499d3
Häng in Zeile 11, der RESPONSE verbindet die 2 Strings nicht...
Bin echt langsam am verzweifeln... Hab schon alles mögliche ausprobiert, bekomm die Strings einfach nicht verbunden. Der vor dem Minus- Zeichen wird immer ignoriert
Nur eine leere Zeile nach dem Ausführen in der Console.
#!/bin/bash
FBF="192.168.178.1"
USER="fritz1682" # oder falls nicht vorhanden, dann leer lassen
PASS="passwort"
CHALLENGE=$(curl -s -k "${FBF}/login_sid.lua" | grep -Po '(?<=<Challenge>).*(?=</Challenge>)')
MD5=$(echo -n ${CHALLENGE}"-"${PASS} | iconv -f ISO8859-1 -t UTF-16LE | md5sum -b | awk '{print substr($0,1,32)}')
RESPONSE="${CHALLENGE}-${MD5}"
SID=$(curl -i -s -k -d "response=${RESPONSE}&username=${USER}" "${FBF}" | grep -Po -m 1 '(?<=sid=)[a-f\d]+')
echo ${SID} | cut -d" " -f1
Was gäbs für Möglichkeiten zur Fehlersuche? Kenn mich in bash leider gar nicht aus, Code ist auch nicht grad für Anfänger
Guten Abend,
hab leider das gleiche Problem. Das Skript hab ich getestet, kommt leider nichts brauchbares raus...
Guido64 hast du noch etwas ändern müssen damits geklappt hat?
Danke & VG
Chris