Danke Dennis89
Das klappt. Habe einen falschen Ansatz verfolgt und den Fehler immer im ersten Script gesucht.
Das es einfach mit der if Anweisung geht, hatte ich nicht auf den Schirm gehabt.
Danke nochmal für den Denk Anstoß.
Danke Dennis89
Das klappt. Habe einen falschen Ansatz verfolgt und den Fehler immer im ersten Script gesucht.
Das es einfach mit der if Anweisung geht, hatte ich nicht auf den Schirm gehabt.
Danke nochmal für den Denk Anstoß.
Hallo liebe Forenmitglieder,
habe bei mir mehrere Steckdosen KP105 mit den Raspberry am laufen. Das funktioniert auch soweit ganz gut.
Die Statusabfrage wird über 2 Python Scripte realisiert.
tplink_smartplug.py
import sys
import socket
import json
from struct import pack
version = 0.3
# Predefined Smart Plug Commands
# For a full list of commands, consult tplink_commands.txt
commands = {'info': '{"system":{"get_sysinfo":{}}}',
'on': '{"system":{"set_relay_state":{"state":1}}}',
'off': '{"system":{"set_relay_state":{"state":0}}}',
'ledoff': '{"system":{"set_led_off":{"off":1}}}',
'ledon': '{"system":{"set_led_off":{"off":0}}}',
'cloudinfo': '{"cnCloud":{"get_info":{}}}',
'wlanscan': '{"netif":{"get_scaninfo":{"refresh":0}}}',
'time': '{"time":{"get_time":{}}}',
'schedule': '{"schedule":{"get_rules":{}}}',
'countdown': '{"count_down":{"get_rules":{}}}',
'antitheft': '{"anti_theft":{"get_rules":{}}}',
'reboot': '{"system":{"reboot":{"delay":1}}}',
'reset': '{"system":{"reset":{"delay":1}}}',
'energy': '{"emeter":{"get_realtime":{}}}'
}
# Encryption and Decryption of TP-Link Smart Home Protocol
# XOR Autokey Cipher with starting key = 171
# Python 3.x Version
if sys.version_info[0] > 2:
def encrypt(string):
key = 171
result = pack('>I', len(string))
for i in string:
a = key ^ ord(i)
key = a
result += bytes([a])
return result
def decrypt(string):
key = 171
result = ""
for i in string:
a = key ^ i
key = i
result += chr(a)
return result
# Python 2.x Version
else:
def encrypt(string):
key = 171
result = pack('>I', len(string))
for i in string:
a = key ^ ord(i)
key = a
result += chr(a)
return result
def decrypt(string):
key = 171
result = ""
for i in string:
a = key ^ ord(i)
key = ord(i)
result += chr(a)
return result
def send(ip, port, command):
cmd = commands[command]
try:
sock_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock_tcp.connect((ip, port))
sock_tcp.send(encrypt(cmd))
data = sock_tcp.recv(2048)
sock_tcp.close()
decrypted = decrypt(data[4:])
return json.loads(decrypted)
except:
print ("Cound not connect to host " + ip + ":" + str(port))
Display More
Auslesen.py
#!/usr/bin/env python3
import tplink_smartplug
# Auslesen der einzelnen HS100 Steckdosen
# Kachelofen
result51 = tplink_smartplug.send("192.168.10.51", 9999, "info")
relay_state51 = result51['system']['get_sysinfo']['relay_state']
if (relay_state51):
output51 = '1'
else:
output51 = '0'
print (output51)
# Küche
result50 = tplink_smartplug.send("192.168.10.50", 9999, "info") # Steckdose links
result52 = tplink_smartplug.send("192.168.10.52", 9999, "info") # Steckdose rechts
relay_state50 = result50['system']['get_sysinfo']['relay_state']
relay_state52 = result52['system']['get_sysinfo']['relay_state']
if relay_state50 == 1 and relay_state52 == 1:
output00 = 1
elif relay_state50 == 0 and relay_state52 == 0:
output00 = 0
elif relay_state50 == 1 and relay_state52 == 0 or relay_state50 == 0 and relay_state52 == 1:
output00 = 9
print (output00)
# Wohnzimmer Lampe
result56 = tplink_smartplug.send("192.168.10.56", 9999, "info")
relay_state56 = result56['system']['get_sysinfo']['relay_state']
if (relay_state56):
output56 = '1'
else:
output56 = '0'
print (output56)
# Raspberry Monitor ( Smart Home )
result54 = tplink_smartplug.send("192.168.10.54", 9999, "info")
relay_state54 = result54['system']['get_sysinfo']['relay_state']
if (relay_state54):
output54 = '1'
else:
output54 = '0'
print (output54)
# Raspberry Aquarium
result57 = tplink_smartplug.send("192.168.10.57", 9999, "info")
relay_state57 = result57['system']['get_sysinfo']['relay_state']
if (relay_state57):
output57 = '1'
else:
output57 = '0'
print (output57)
Display More
Das Problem was ich habe, ist wenn eine Steckdose nicht erreichbar ist, das die Abfrage unterbrochen wird. Das Script tplink_smartplug.py gibt zwar wenn ich die Abfrage über der Console mache die Fehlermeldung print ("Cound not connect to host " + ip + ":" + str(port)) aus.
Um auf meiner Webseite zu erkennen das eine Steckdose ausgefallen ist, benötige ich im Script Auslesen.py den Wert "99" in der Variable outputxx.
Das ist das Problem was ich im Moment habe.
Was muss ich ändern, habe schon versucht das zu realisieren. Aber leider habe ich noch zu wenig mit Python bis jetzt zu tun gehabt.
Setze gerade einen neuen Raspberry auf.
Bis lang habe ich zur Steuerung der GPIO WringPi benutzt. Aber aus aktuellen Anlass wollte ich die Steuerung jetzt über PIGS steuern.
Das ein- und auschalten funktioniert auch soweit.
Nur bei einigen Button habe ich bis jetzt immer die toggle funktion benutzt. Dazu der String
exec( "gpio -g toggle {$_GET["gpio"]}" ) ;
Ist das mit PIGS auch möglich. Konnte dazu nichts finden.
Und wenn ja wie muss der String dabei aussehen?
Danke für deine schnelle Hilfe.
Habe die Datei gefunden aber bei mir steht die in ein anderes Verzeichnis. /etc/php/7.4/apache2/php.ini
Habe den Eintrag geändert, brachte aber keinen Erfolg. Ich habe die gleiche Fehlermeldung.
Oder liegt es jetzt etwa am Script?
Das Script dazu sieht so aus:
<?php
session_start();
$Raum = "Gästezimmer";
$ain = "kököö";
$TmpHzkt = "32";
// Übertragene der Werte von Heizung_Aendern.php
// $Raum = $_SESSION["Raum"];
// $Ain = $_SESSION["Ain"];
// $TmpHzkt = $_POST["Temperatur"];
$Soll1 = $TmpHzkt /2 ;
$Soll = $Soll1 . "\n";
// Funktion in Variable speichern
$cmdtmp='gettemperature'; // Abfrage der Temperatur am AVM Heizkörper
$cmdsoll='gethkrtsoll'; // Abfrage der soll Temperatur vom AVM Heizkörper
$cmdtag='gethkrkomfort'; // Abfrage der Temperatur am Tab vom AVM Heizkörper
$cmdnacht='gethkrabsenk'; // Abfrage der Temperatur bei Nacht am AVM Heizkörper
// Einbinden der Daten Datei
include 'http://192.168.10.25/fritzbox/Fritzbox.dat';
// Einbinden der aktuellen DECT Aktoren aus der Datei
include 'http://192.168.10.25/fritzbox/Heizung.dat';
// Fehlermeldung anzeigen wenn keine SID für die Fritzbox erzeugt werden konnte
$sid = file_get_contents('http://192.168.10.25/tmp/last.SID');
if (!$sid ) {
die ("Anmeldefehler, keine Session-ID erhalten!\n");
}
// den aktuellen Zustand der Heizung aus der /tmp/Heizung.dat einlesen und einer Variable zuordnen
$datei = "/tmp/Temp_Heizung_Avm.dat"; // Name der Datei
$array = file($datei); // Datei in ein Array einlesen
$ainHzkTmp1 = $array[0]; // Die aktuelle Temperatur in der Temp Datei schreiben
$ainHzkSoll1 = $array[1]; // Die aktuelle Leistung in der Temp Datei schreiben
$ainHzkTmp2 = $array[2]; // Die aktuelle Temperatur in der Temp Datei schreiben
$ainHzkSoll2 = $array[3]; // Die aktuelle Leistung in der Temp Datei schreiben
$ainHzkTmp3 = $array[4]; // Die aktuelle Temperatur in der Temp Datei schreiben
$ainHzkSoll3 = $array[5]; // Die aktuelle Leistung in der Temp Datei schreiben
$ainHzkTmp4 = $array[6]; // Die aktuelle Temperatur in der Temp Datei schreiben
$ainHzkSoll4 = $array[7]; // Die aktuelle Leistung in der Temp Datei schreiben
$ainHzkTmp5 = $array[8]; // Die aktuelle Temperatur in der Temp Datei schreiben
$ainHzkSoll5 = $array[9]; // Die aktuelle Leistung in der Temp Datei schreiben
$ainHzkTmp6 = $array[10]; // Die aktuelle Temperatur in der Temp Datei schreiben
$ainHzkSoll6 = $array[11]; // Die aktuelle Leistung in der Temp Datei schreiben
.
.
Display More
Ich erstelle gerade für mein Smart Home eine neue Seite die in php geschrieben ist.
In den Script benötige ich von den anderen Raspberry Variablen die dort in entsprechenden Dateien wie zb.: Temperatur.dat hinterlegt sind.
Die Datei möchte ich per include einbinden.
Dabei bekomme ich vom Apache eine Fehlermeldung
wrapper is disabled in the server configuration by allow_url_include=0
Habe schon in der config Datei nachgesehen, kann aber den Punkt niergends finden. In welche Datei muss ich die Änderung durchführen?
Ja ich weiß das es auch mit Sicherheit zu tun hat, aber mein Smart Home ist ein seperates Netz und nicht mit dem Internet verbunden.
OK, danke für den Hinweis.
Dann weiß ich jetzt warum ich die Probleme hatte.
Danke hyle, das war es. Jetzt läuft alles.
Aber nur komisch das es beim anderen Raspy läuft und bei diesen nicht.
Kann das an der Linux Version liegen, denn der andere müste noch DEBIAN sein und die aktuelle Version heißt glaube ich Booster oder so ähnlich.
Denn dies war nicht das erste Problem was ich hatte.
Da waren mehrere wo ich das script ändern musste, damit es lief.
Da hatte ich ein Problem unter Python die print Befehle muste ich auf einmal in Klammern setzen, damit das lief.
Habe ein Problem beim Aufruf einer Seite mit Übergabe von 2 Variablen.
Bei einen 2. Rapberry funktioniert das ganze. Aber bei den neuen Raspberry mit aktuellen Linux bekomme ich es nicht ans laufen.
Ich habe das ganze etwas vereinfacht.
Ich habe ein Script: "Sonnen_Untergang.sh" wo ich eine php Seite mit aufrufe.
#!/bin/bash
#import time
#import date
####################################################################
########### Ausführungen bei Sonnen Untergang ######################
####################################################################
########## Schließen der Rollors
curl http://localhost/rollor/Getstate_Alle.php?alle=3
sleep 2
########## Einschalten der Salzkristall Lampe auf der Treppe
curl http://localhost/steckdose/avm/Getstate_Avm.php?ain=116300111910&cmd=on
Display More
Der Aufruf der Rollorseite funktioniert.
Aufruf der Seite für die Lampe habe ich ein Problem. Dort benötige ich 2 variablen.
Die Seite sieht im Moment so aus:
<?php
header( "Access-Control-Allow-Origin: *" ) ;
header( "Content-type: application/json");
// einfügen der ain Nummern von den AVM Steckdosem
include('/var/www/html/fritzbox/Steckdose.dat');
// Einbinden der Zugangsdaten zu der Fritzbox
include('/var/www/html/fritzbox/Fritzbox.dat');
// Auslesen der SID aus der Datei, /tmp/Steckdose.dat
// Sie wird von automatisch durch durch /home/pi/keller/avm/SIDerzeugen.sh erstellt
$sid = file_get_contents('/tmp/last.SID');
if (!$sid ) {
die ("Anmeldefehler, keine Session-ID erhalten!\n");
}
$ain = $_GET['ain'];
$cmd = $_GET['cmd'];
echo $ain;
echo " ";
echo $cmd;
?>
Display More
Wie gesagt auf einen anderen Raspberry funktioniert das. Aber dort ist noch eine ältere Linux Version drauf. Ob es daran liegt?
Hier habe ich das Problem, das die erste Variable $ain angezeigt wird und die zweite Variable $cmd leer ist.
Ich kann die Variable auch tauschen, das Problem bleibt. Die erste wird übertragen die 2. nicht.
im Errorlog von Apache bekomme ich den Fehler: PHP Notice: Undefined index: cmd in.
Kann mir einer helfen und mir sagen was ich falsch gemacht habe?
Bin schon den ganzen Tag auf der Suche nach den Fehler. Kann ihn aber nicht finden.
Habe schon mehrfach mit der Variable $_SESSION gearbeitet und nie Probleme gehabt. Aber jetzt.
Es geht darum, das ich bei meine Heizkörperregler die Temperatur ändern kann.
In den Script: "Heizung_Aendern.php wähle ich die neue Temperatur aus.
<?php
session_start();
$_SESSION['raum'] = $_GET['raum'];
$_SESSION['ain'] = $_GET['ain'];
?>
<div id="Menue_Heizung">
<h1> Ändern der </h1>
<h2> Temperatur </h2>
<h2> für den Raum :</h2>
<?php
echo "<h3>".$_SESSION['raum']."</h3>";
?>
<form action="avm/Heizung_Speichern.php" method="post">
<select class="box" name="Temperatur">
<option value="32">16.0 °C</option>
<option value="33">16.5 °C</option>
<option value="34">17.0 °C</option>
<option value="35">17.5 °C</option>
<option value="36">18.0 °C</option>
<option value="37">18.5 °C</option>
<option value="38">19.0 °C</option>
<option value="39">19.5 °C</option>
<option value="40">20.0 °C</option>
<option value="41">20.5 °C</option>
<option value="42">21.0 °C</option>
<option value="43">21.5 °C</option>
<option value="44">22.0 °C</option>
<option value="45">22.5 °C</option>
<option value="46">23.0 °C</option>
<option value="47">23.5 °C</option>
<option value="48">24.0 °C</option>
</select>
<input type="submit" class="boxspeichern" value="Speichern"/>
</form>
<p><input type="button" value="Abbruch" onclick="parent.location= ('Heizung_Control.php')" class="boxabbruch"></p>
</div>
Display More
Über die $_GET Variable übergebe ich die AIN Nummer der einzelnen Heizkörperregler und den Raum.
Das funktioniert bis hier alles. Der Inhalt von $_SESSION['raum'] wird auch angezeigt.
Im script "Heizung_speichern.php" soll die neue Temperatur an den Regler übertragen werden.
Im Script sind die Variablen von $_SESSION['raum' und $_SESSION['ain'] nicht mehr vorhanden.
<?php
session_start();
echo "Hallo Welt";
echo $_SESSION['raum'];
echo $_SESSION['ain'];
echo $_POST['Temperatur'];
?>
Die Variable $_POST['Temperatur'] wird angezeigt, aber die anderen beiden Variablen nicht mehr.
Wo habe ich bei mir den Denkfehler?
habe jetzt beide Versionen ausprobiert. Die Datei wird jeweils erstellt mit Inhalt, aber bei beiden Versionen kommt die Fehlermeldung
"file_put_contents(/tmp/Steckdose.json): failed to open stream: Permission denied in...." bez.
"file_put_contents(/tmp/Steckdose.dat): failed to open stream: Permission denied in..."
Eventuell liegt der Fehler noch ganz wo anders. Ich weiß nur nicht wo.
Das Script wo die Werte ausgelesen und in der Datei gespeichert werden soll sieht so aus:
<?php
header( "Access-Control-Allow-Origin: *" ) ;
// Welche Abfrage soll ausgeführt werden
$cmd='getswitchstate'; // Status der DECT Schaltsteckdosen abfragen
// Einbinden der Daten Datei
include '/var/www/html/fritzbox/Fritzbox.dat';
// Einbinden der aktuellen DECT Aktoren aus der Datei
include '/var/www/html/fritzbox/Steckdose.dat';
// Auslesen der SID aus der Datei. Die SID wird automatisch über ein Skript erzeugt
// alle 5 min unter /home/pi/keller/skripte/avm/SIDerzeugen.sh
$sid = file_get_contents('/tmp/last.SID');
if (!$sid ) {
die ("Anmeldefehler, keine Session-ID erhalten!\n");
}
// Abfrage der vorhandenen Aktoren
$url=$ahaurl."?sid=$sid"."&ain=".rawurlencode($ainSteck1).'&switchcmd='.$cmd;
$ainStatus1 = file_get_contents($url);
$url=$ahaurl."?sid=$sid"."&ain=".rawurlencode($ainSteck2).'&switchcmd='.$cmd;
$ainStatus2 = file_get_contents($url);
$url=$ahaurl."?sid=$sid"."&ain=".rawurlencode($ainSteck3).'&switchcmd='.$cmd;
$ainStatus3 = file_get_contents($url);
$url=$ahaurl."?sid=$sid"."&ain=".rawurlencode($ainSteck4).'&switchcmd='.$cmd;
$ainStatus4 = file_get_contents($url);
$url=$ahaurl."?sid=$sid"."&ain=".rawurlencode($ainSteck5).'&switchcmd='.$cmd;
$ainStatus5 = file_get_contents($url);
// Auswerten ob die Steckdose Online ist oder nicht
$ERR01 = substr($ainStatus1, 0 ,5);
if ($ERR01 == "inval") {
$ainStatus1 = "ERROR\n";
}
$ERR02 = substr($ainStatus2, 0 ,5);
if ($ERR02 == "inval") {
$ainStatus2 = "ERROR\n";
}
$ERR03 = substr($ainStatus3, 0 ,5);
if ($ERR03 == "inval") {
$ainStatus3 = "ERROR\n";
}
$ERR04 = substr($ainStatus4, 0 ,5);
if ($ERR04 == "inval") {
$ainStatus4 = "ERROR\n";
}
$ERR05 = substr($ainStatus5, 0 ,5);
if ($ERR05 == "inval") {
$ainStatus5 = "ERROR\n";
}
$steckdose = array ("ain1" => $ainStatus1, "ain2" => $ainStatus2, "ain3" => $ainStatus3,
("ain4") => $ainStatus4, "ain5" => $ainStatus5 );
file_put_contents('/tmp/Steckdose.json', json_encode($steckdose));
?>
Display More
Die Datei zum Auslesen der Werte:
header( "Access-Control-Allow-Origin: *" ) ;
header( "Content-type: application/json");
// einfügen der ain Nummern von den AVM Steckdosem
include('/var/www/html/fritzbox/Steckdose.dat');
// Einbinden der Zugangsdaten zu der Fritzbox
include('/var/www/html/fritzbox/Fritzbox.dat');
// Auslesen der SID aus der Datei, /tmp/Steckdose.dat
// Sie wird von automatisch durch durch /home/pi/keller/avm/SIDerzeugen.sh erstellt
$sid = file_get_contents('/tmp/last.SID');
if (!$sid ) {
die ("Anmeldefehler, keine Session-ID erhalten!\n");
}
// Übertrag welcher Button gedrückt wurde
$variable = $_GET['ain'];
$data = json_decode(file_get_contents('/tmp/Steckdose.json'));
echo 'ain1: ', $data['ain1'];
Display More
Dieses Script ist noch nicht fertig. Es wird später verglichen was sich verändert hat und entsprechend dann die URL erstellt um die Steckdose anzusteuern.
Nur zur Info!
Die Steuerung läuft einwandfrei. Nur sind die AVM Steckdosen träge beim schalten. Dadurch dauert es lange bis die Info zurückkommt das der Befehl ausgeführt wurde. Das wollte ich damit umgehen das ich den Zustand in einer Datei zwischen speichern möchte.
ja du hast vollkommen Recht. Es ist in php geschrieben. Hätte ich beischreiben müssen
In der Datei "Auslesen.php" werden die Werte gespeichert.
$steckdose = array ("ain1" => $ainStatus1, "ain2" => $ainStatus2, "ain3" => $ainStatus3,
("ain4") => $ainStatus4, "ain5" => $ainStatus5 );
$fp = fopen('/tmp/Steckdose.dat', 'w');
fwrite($fp, print_r($steckdose, true));
fclose ($fp);
Und die Datei "Steckdose.dat" sieht dann wie oben aus.
Aber dein Script geht bei mir nicht. Ich bekomme als Fehlermeldung:
ain1: PHP Notice: Trying to access array offset on value of type int in.......
Ich habe ein kleines Problem mit assoziativen array.
Bislang bin ich nicht auf die Lösung gekommen. Irgendwie drehe ich mich im Kreis herrum.
Kurz um was es sich handelt:
Ich lese die aktuellen Zustände von Funksteckdosen aus und Speicher die in einer Datei "Steckdose.dat" ab.
Die Datei sieht dann so aus:
Mein Problem besteht darin, das ich die Zustände also Wert "0" bez "1" auslesen und in $ain1, $ain2 usw, speichern möchte.
Bislang habe ich nur immer die ganze Zeile in einer Variable bekommen und nicht den reinen Wert.
Wäre sehr Dankbar für eure Hilfe.
Mit PHP direkt ist das IMHO nicht möglich, wobei ich mir in Verbindung mit PIGPIO nicht sicher bin. Du wirst ein Skript anschubsen müssen, z.B.:
PHP<?php $output = shell_exec("/Pfad/zum/Skript.py <ggf. Argumente>"); // evtl. die Ausgabe anzeigen lassen echo $output; ?>
So ungefähr habe ich das bis jetzt am laufen. Habe nur gedacht das man dadurch den Umweg über ein Skript sparen könnte. Dann werde ich das so lassen wie ich es bis jetzt habe. Da weiß ich, das es funktioniert.
Trotz alledem Danke für eure Infos
Hallo liebe Community
Ich bin gerade dabei meine Smart Home ein Update zu verpassen.
Dabei wollte ich die GPIO mit PIGPIO steuern. Funktioniert auch soweit. Nun kam mir die Idee PIGPIO über den Webserver in PHP direkt anzusteuern.
Leider konnte ich nichts finden wie man die darüber ansteuert.
Ist das überhaupt Möglich, oder muss ich über Python etc gehen.
Wenn das mit PHP geht kann mir dann einer ein Beispiel Skript schreiben ?
bin schon den ganzen morgen am testen. Wollte das heute noch einmal nachstellen ob das richtig war. Leider funktionierte es nicht mehr. Warum auch immer.
Dabei ist mir aufgefallen, das die SD-Karte die funktionierte in der Datei config.text nichts mehr drin stand.
Da habe ich mir die Datei genauer angesehen und getestet.
Nachdem ich die Zeile: dtoverlay=vc4-kms-v3d deaktiviert habe funktioniert bei mir der Bildschirm.
Vielleicht ist das bei dir auch das gleiche Problem
Hallo Jürgen
Danke für deine Hilfe, ich habe einen 3b+ schätze der macht keine 4K
Aber ich habe es jetzt ans laufen.
Deine Einträge habe ich noch in der config.txt drin.
Zusätzlich habe ich unter der raspi-config noch 2 Einträge geändert und zwar:
Display Options --> Underscan --> yes
Display Options --> Screen Blanking --> yes
Danach bekomme ich jetzt auch ein Bild.
OK Kein Problem, nur bei mir bringt es nichts
Bleibt alles noch dunkel
Hey Jürgen
in welcher Datei?
am unteren Ende von /boot/config.txt ?